《JavaScript高级程序设计 第三版》学习笔记 (三)引用类型详解

来源:互联网 发布:pop3端口号 编辑:程序博客网 时间:2024/04/29 16:19

一、引用类型

1.ECMAScript从技术上讲是一门面向对象语言,但它不具备传统的面向对象语言所支持的类和接口等基本结构。js中的对象,是某个特定引用类型的实例。新对象通过new操作符构造出来。构造函数本身也是一个普通函数,加new和不加new的运行结果完全不同。ECMAScript有很多原生的引用类型。
2.Object类型
(1)Object的属性,可以用点语法访问,也可以用方括号语法访问。obj.name和obj["name"]是等价的,但后面这种可以用字符串变量去访问,而且有些属性名用点语法是非法的,比如属性名中间有空格,这种时候只能用方括号语法访问。
(2)Object可以用new Object()创建,也可以直接用字面量{}创建。前面提到过。
3.Array类型
(1)Array是Object的一个派生。和其他语言最大不同是,Array的每个元素都可以是不同类型的。注意,只有一种情况是创建固定长度数组。创建数组实例时,可以用new,也可以不用。效果是一样的。可以使用字面量[]创建数组。注意,c语言里用{}初始化数组,这里不要混淆。用字面量时,如果方括号里有多余的逗号,IE8以下会抛错,而其他浏览器不会,其他浏览器会创建null元素。
(2)Array构造函数参数不固定,如果只有一个数值n,作用是创建一个大小为n的数组;如果是很多个,就是创建包含这些元素的数组。引用数组元素下标越界时,返回的都是undefined。
(3)判断一个变量是不是数组,不能用typeof,会返回object,要用instanceof Array;在IE9以上和标准浏览器中,增加了Array.isArray(val),可以判断是不是数组。
(4)转换接口
   <1>arr.valueOf(),返回的还是数组。
   <2>arr.toString(),返回的是每个元素的toString()拼串。
   <3>arr.join(","),自定义分隔符的拼串。
(5)元素接口
   <1>arr.push(val),把元素从尾部添加到数组中
   <2>val=arr.pop(),弹出最后一个元素并返回该元素
   <3>val=arr.shift(),弹出第一个元素并返回该元素
   <4>arr.unshift(val),把元素从头部添加到数组中。
(6)排序接口
   <1>arr.reverse(),元素反序放置。
   <2>arr.sort(),元素升序排列,sort可以带一个函数作为比较原则,这个函数必须返回-1或1或0,这个函数有两个形参输入。
(7)操作接口
   <1>arr2=arr.concat("1",[2,3]),在当前数组基础上添加新元素,返回一个新的数组。
   <2>arr2=arr.slice(a,b),选取当前数组下标区间[a,b)内的元素,返回值这些元素组成的新数组;如果不指定b,b=arr.length;如果传入负数,则加上length在处理;如果a>=b,返回空数组。
   <3>arr.splice(0,2),删除前两个元素;
   <4>splice(2,1,"1","2"),从位置2开始,删除1项,插入两个元素分别是"1"和"2",也就是相当于把arr[2]替换成"1",然后在后面插入"2"。
(8)位置接口
   <1>n=arr.indexOf(val),返回val在数组中的下标,数组中不含有val,返回-1。
   <2>n=arr.lastIndexOf(val),也是下标,不过是从后向前数。
(9)迭代接口
   <1>b=arr.every(function(item,index,array){...}),对数组中每个函数执行同一个函数,如果所有结构都为true,返回true;
   <2>b=arr.some(function(item,index,array){...}),跟every方法一样,区别是只要有一个运行结果为true,就返回true。
   <3>b=arr.filter(function(item,index,array){...}),返回的是结果为true的元素的数组。
   <4>b=arr.forEach(function(item,index,array){...}),没有返回值。
   <5>b=map(function(item,index,array){...}),返回每一项执行结果组成的数组。回调函数有四个形参,分别是pre上一次迭代的结果、cur当前迭代的元素、index和array。
   <6>b=reduce(function(pre,cur,index,array)),从左向右迭代每一项,计算一个最终的返回值,
   <7>b=reduceRight(function(pre,cur,index,array))从右向左迭代,
4.Date类型
(1)Date也是Object的派生类。用UTC存放时间,存放的是1970年1月1日0时依赖的毫秒数。调用构造函数new Date()不传参时,返回的是当前日期。如果传入参数,必须是UTC毫秒时间。
   <1>Date.parse()可以将字符串转换成UTC时间,想把2000年3月1日转换成时间,应该是Date.parse("3/1/2000")。
   <2>Date.UTC()也能起到同样的效果,但这个函数认为第一个月是0月,而且是一独立参数传入,所以想把2000年3月1日转换成时间,应该是Date.UTC(2000,2,1)。另外,可以在new Date()前加一个+,把时间转换成字符串。
(2)格式化结构
   <1>toDateString(),以特定格式返回星期、月、日、年;
   <2>toTimeString(),以特定格式返回时、分、秒、时区;
   <3>toUTCString(),以特定格式返回完整UTC时间。
5.RegExp类型
(1)js用RegExp表示正则表达式。
(2)浏览器对正则表达式的支持差异很大,这里不细展开二楼。
6.Function类型
(1)function实际上也是object。每一个函数,都是Function类型的实例。函数名,实际上是指向某个函数的指针,不会与某个函数绑定。
(2)js没有函数重载。两个函数重名的意义,其实是函数指针变量从一个函数指向另一个函数。
(3)产生一个函数,可以用函数声明的方式function a(){},也可以用函数表达式的方式var a=function(){}。这两种方法的区别是,解析器会率先读取函数声明,让其在执行前可用。而函数表达式,必须在该行执行了之后才可用。
(4)函数名是函数的指针,因此,可以把函数名当作形参传递,也可以当作返回值返回。
(5)内部属性
   <1>arguments。是个类数组对象,但不是数组,用于存放当前函数的形参。arguments没有数组的接口函数。arguments有length属性和callee属性,length表示形参个数,callee是当前函数的指针,通过它可以匿名调用当前函数。
   <2>this。js中的this与c#和java中的this类似,指的是这个函数所在的执行环境。它的值只有在函数执行的时候才能确定。this值的是什么,是个很常见的问题,面试中也常考到。
   <3>funcName.caller。指的是调用该函数的函数。匿名引用时,arguments.callee.caller。
(6)外部属性
   <1>funcName.length。是命名函数希望得到的形参的个数。
   <2>funcName.prototype。是ECMAScript的核心属性,保存这创建实例的原型。这在继承中非常有用。并且这个属性不可枚举,在for-in、for-each中看不见。
(7)外部方法(函数也是Object,可以任意添加方法,而且也有toString,这里说的是function特有的方法)
   <1>funcName1.apply(this,argm)。通过这种方法,可以深度调用函数funcName1。调用funcName1时,给funcName1指定了一个执行环境,同时,传给它几个其他的参数(argm可以是arguments对象,也可以是普通数组)。换句话说,apply能设置被调用者的this。
   <2>funcName1.call(this,argm1,argm2)。用法和apply完全相同,就是传值方式不同。
[javascript] view plain copy
  1. //小实验  
  2. window.color="red";  
  3. var obj={color:"blue"};  
  4. function getColor(){alert(this.color);}  
  5. getColor.call(this);//red  
  6. getColor.call(window);//red  
  7. getColor.call(o);//blue  
   <3>func=funcName1.bind(object)。通过bind方法,创建一个新的函数实体,功能和func1Name相同,但新函数的执行环境,被设定为object。
[javascript] view plain copy
  1. //小实验  
  2. window.color="red";  
  3. var obj={color:"blue"};  
  4. function getColor(){alert(this.color);}  
  5. var getColor2=getColor.bind(o);  
  6. getcolor2();//blue  

二、基本类型的包装

1.ECMAScript对基础数据类型boolean、string、number进行了一系列包装,使他们拥有了更多接口。我们知道基础类型不是对象,不应该有方法和属性,但为了保证操作的直观性,这种包装还是很有意义的。
2.可以用显示的方法调用Boolean、String、Number来包装对象,但尽量不要这样做。
3.Number类型常用方法
(1)toString(n),数转串,之前提到过。
(2)toFixed(n),小数点取舍。
(3)toExponential(),转科学计数法。
(4)toPrecision(n),保留n位有效数字。
4.String类型常用方法
(1)charAt、charCodeAt、fromCharCode,返回某个位置的字符或ASCII值,将ASCII转换成字符。
(2)slice、substring、substr,切割并返回子串。
(3)indexOf、lastIndexOf,查找字符位置。
(4)trim,去掉前后空格。
(5)toUpperCase、toLowerCase,大小写的转换。
(6)match(RegExp)、search(RegExp),根据正则表达式做匹配,或查找正则出现的位置。
(7)replace(RegExp,str2),replace(str1,str2)把正则匹配替换成str2,或把第一个str1替换成str2。
5.对基础数据进行包装时,使用new返回的是对象,否则返回的是对应类型。
[javascript] view plain copy
  1. //小实验  
  2. var a=Number(10);  
  3. var b=new Number(10);  
  4. alert(typeof a);//number  
  5. alert(typeof b);//object  

三、单体内置对象

1.Global对象
(1)这是个兜底对象。换句话说,不属于任何对象的属性或方法,都是它的属性和方法。比如parseInt、parseFloat、isNaN。
(2)Global其他常用方法
   <1>encodeURI,把空格替换成%20。对应的逆运算是decodeURI
   <2>encodeURIComponent,把所有非字母替换成URI编码。对应的逆运算是decodeURIComponent。
   <3>eval,把字符串翻译成代码并执行。一般用于实现json-string互转。这是一个非常危险的命令。
2.window对象,window对象可以看作BOM扩展的总接口。
3.document对象,document对象可以看作DOM扩展的总接口。
4.Math对象,封装了一些数学运算方法、数学比较方法和数学常量。
0 0
原创粉丝点击