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);