JavaScript-引用类型

1.Object

 1 /*可以用操作符 new 构造函数的方式实例化一个对象*/
 2  var o = new Object();//操作符 new + 构造函数Object()
 3  o.name="i am  object o";
 4  o.say=function(){
 5      alert(o.name);
 6  }//定义对象的属性和方法
 7  
 8  
 9  /*不过更常用的是使用对象字面量的方法*/
10  /*对象字面量创建对象实际上用的不是构造函数Object()*/
11  var p={
12      name:"i am object p",//注意是,而不是;
13      say:function(){
14          alert(p.name);
15      }//注意对象字面量的最后一个属性后面不要加,因为在有些浏览器会出错
16  }
17  
18  
19  /*访问对象的属性  对象名.属性名*/
20  alert(o.name);
21  o.say();
22  alert(p.name);
23  p.say();
24  
25  
26  /*如果需要通过变量访问对象的属性可以通过 对象[属性名]*/
27  /*除了有这种需求外最好还是用上面的方法*/
28  var t="name";
29  alert(o[t]);

 

 2.Array

 1 /*操作符new 构造函数创建数组Array*/
 2 var arrayA=new Array('a','a','a');
 3 
 4 
 5 /*操作符new可以省略*/
 6 var arrayB=Array('b','b','b');
 7 
 8 
 9 /*数组字面量创建数组*/
10 /*数组字面量创建数组没有用到构造函数Array*/
11 var arrayC=['c','c','c'];
12 
13 
14 /*可以通过数组的length属性访问数组的长度*/
15 alert(arrayA.length);
16 alert(arrayB.length);
17 alert(arrayC.length);
18 /*可以通过length属性在数组末尾添加值*/
19 arrayA[arrayA.length]='a';
20 /*也可以设置length的值截取数组*/
21 arrayB.length=2;
22 
23 /*toString方法打印数组内容*/
24 alert(arrayA.toString());//a,a,a,a
25 alert(arrayB.toString());//b,b
26 alert(arrayC.toString());//c,c,c
27 /*这里如果省略toString或者使用valueOf方法结果是一样的*/
28 
29 /*如果想指定分割符可以使用join函数*/
30 alert(arrayA.join('*'));

3.Date

 1 /*Date类型的数据用以表示时间*/
 2 /*Date类型的数据用自1970年1月1日起的 毫秒 数来表示时间*/
 3 /*注意UNIX时间戳是秒数,而Date类型是毫秒数,那么是不是意味着Date类型能表示的时间更有限呢?*/
 4 
 5 /*创建一个日期对象*/
 6 var time = new Date();
 7 //不传参数,默认取得当前时间
 8 
 9 /*如果像取得特定时间,得传入一个从1970年1月1日指定时间的毫秒数*/
10 /*没有人会蠢到计算一下毫秒数在传入的所以一般我们使用Date.parse()或者Date.UTC()两个函数*/
11 
12 /*Date.parse()这个函数通过传入一个表示时间的字符串,它为我们计算出毫秒数以便传入*/
13 /*Date.parse()支持的字符串格式非常多,这里只列出ISO格式*/
14 var time = new Date(Date.parse('2018-02-12T13:21:00'));
15 alert(time);//Mon Feb 12 2018 13:21:00 GMT+0800
16 /*Date.UTC()传如数值参数,其参数格式为*/
17 /*年(四位十进制数),月(0-11),天(1-31),时(0-23),分(0-59),秒,毫秒*/
18 /*其中前两位不能省略*/
19 var time2 = new Date(Date.UTC(2018,1,12,13,21));
20 alert(time2);//Mon Feb 12 2018 21:21:00 GMT+0800
21 
22 /*这两个函数其实都是可以隐式调用的,直接将参数传入Date()它会根据参数格式调用这两个函数*/
23 
24 /*发现两者返回的时间不一样!!!*/
25 /*这是因为Date.parse()认为你传入的字符串表示的是本地时间*/
26 /*而Date.UTC()认为你传入的参数表示的是UTC时间,在返回毫秒数的时候他会自动给你转换成本地时间的毫秒数*/
27 
28 /*结论:如果想获得本地时间的话直接用Date.parse()就好。使用Date.UTC()的话别忘了传参的时候减去8小时的时间*/
1 /*Date.toString()和Date.toLocalString()都是将Date数据以人们看的懂的字符串格式输出,但它们的格式稍有不同*/
2 time = new Date();
3 alert(time.toString());//Mon Feb 12 2018 14:14:39 GMT+0800默认
4 alert(time.toLocaleString());//2018/2/12 下午2:15:03
5 /*Date.valueOf()返回时间戳*/
6 alert(time.valueOf());//1518416162858
7 
8 /*值得一提的是JS中时间的本地化是在获取Date对象的时候就已经完成了*/
9 /*浏览器会根据本地时间对传入的参数进行处理,并不要像其他语言那样手动设置时区*/

 

4.Function

  函数为什么会出现在引用类型这里呢?

  因为在JavaScript中其实每一个函数都是引用类型Function的实例,函数名实际上是指向函数对象的指针。

 1 /*我们可以用对象的方式创建函数*/
 2 var sum= new Function('sum1','sum2','return sum1+sum2');
 3 //这与我们之前看到的创建方式几乎一样
 4 //但是这种方法在实际中运行效率很低所以几乎不用
 5 
 6 /*在实际中我们一般使用关键字function用函数声明或者函数表达式的方式定义函数*/
 7 /*函数声明*/
 8 /*用函数声明的方式在脚本的任何位置都可以调用*/
 9 p();//调用在前声明在后
10 function p(){
11     alert('hello');
12 }
13 
14 /*函数表达式*/
15 /*函数表达式必须声明在前调用在后*/
16 var po=function(){
17     alert('hello');
18 }
 1 /*函数内部有两个重要的对象arguments和this*/
 2 
 3 /*arguments对象用于保存函数的参数,arguments对象可以像使用数组那样使用但它并不是Array的实例*/
 4 function test1(){
 5     alert(arguments instanceof Array);//false
 6 }
 7 test1();
 8 
 9 /*使用arguments对象访问函数的每一个参数*/
10 function test2(){
11     for(var i=0;i<arguments.length;i++){
12         alert(arguments[i]);
13     }
14 }
15 test2(1,2,'hello');
16 
17 /*arguments有一个属性callee指向调用的函数本身*/
18 /*这在构建低耦合的递归函数时非常有用*/
19 function test3(){
20     alert(arguments.callee==test3);
21 }
22 test3();//true
23 
24 
25 /*this指向调用函数的对象*/
26 function test4(){
27     alert(this==window);
28 }
29 test4();//函数是全局的,this指向window
30 
31 var o= new Object();
32 o.test4=test4;
33 o.test4();//false因为此时this指向对象o
34 o.test5=function(){
35     alert(this==o);
36 }
37 o.test5();//true
 1 /*函数的本质是对象,对象就有属性*/
 2 /*length属性返回函数希望接受的参数个数*/
 3 function test(num1,num2){
 4 
 5 };
 6 alert(test.length);
 7 
 8 
 9 /*每一个函数都有一个对应的原型对象,有一个prototype属性可以访问到这个对象*/
10 alert(test.prototype);
 1 /*可以使用apply()或者call()方法改变函数运行的作用域,this对象也随之改变*/
 2 var name="window";
 3 o={
 4     name:"object"
 5 };
 6 
 7 function test(){
 8     alert(this.name);
 9 }
10 
11 test();//直接调用test()作用域在window中
12 test.apply(o);//改变函数的作用域o
13 
14 /*applay()和call()区别仅仅是传入参数的方式不同*/
15 
16 /*甚至可以使用bind()函数直接将函数的作用域和对象绑定*/
17 test.bind(o);
18 test();//永远是object

 5.类型检测

  之前我们检测数据类型的时候用的是typeof 关键字

  这对于我们检测基本类型已经够用了。

  但是面对这么多种类的引用类型确不是很理想

 1 var num=10;
 2 var str="hello";
 3 var bool=true;
 4 
 5 var o= new Object();
 6 var a=Array();
 7 var time=new Date();
 8 var fun= function(){
 9 
10 };
11 alert(typeof num);//number
12 alert(typeof str);//string
13 alert(typeof bool);//boolean
14 alert(typeof o);//object
15 alert(typeof a);//object
16 alert(typeof time);//object
17 alert(typeof fun);//function
18 
19 /*可以看到对于除function以外的全部引用类型都返回object*/

  面对引用类型时我们通常使用 instanceOf 关键字

 1 var o= new Object();
 2 var a=Array();
 3 var time=new Date();
 4 var fun= function(){
 5 
 6 };
 7 alert(o instanceof Object);
 8 alert(a instanceof Array);
 9 alert(time instanceof Date);
10 alert(fun instanceof Function);

 

posted @ 2018-02-12 16:17  帕特菛琦  阅读(130)  评论(0编辑  收藏  举报