![《JavaScript高级程序设计》Chapter 5 引用类型](https://600zi.400zi.cn/uploadfile/img/14/852/adb0ddae064d49dc00ebd067045a2265.jpg)
Chapter 5 引用类型
使用表格进行归纳,对表格中某些内容会进行必要解释,并把解释放在表格下方。引用类型(一类,与“类”相似,但实际上,JS并没有类的概念),对象定义--->引用类型的值(对象)的一个实例。new+构造函数--->创建一个引用类型的实例。原生引用类型:下面罗列的这些都属于原生引用类型。Object类型 一般来说,通过字面量创建的对象实例不会调用构造函数。Array类型 JS数组同样是有序表,但比起其他语言灵活许多,可以存储的数据类型十分灵活。检测数组:instanceof只适合单一网页(全局作用域)的情况,多个全局执行环境可以使用Array.isArray()方法。sort方法默认升序排列,且调用toString()按照字符串排列,最好和比较函数连用。对于比较函数返回的正负数与升降序的关系,可以结合一维坐标理解。slice()方法中的两项不包含结尾那项。参数为负数,则用数组长度加上该参数。若结束位置小于起始位置,则返回空数组。迭代方法:参数为函数,以及可选的作用域。函数的参数有三个:数组项的值,索引,数组对象自己。(value, index, array)缩小方法:参数为函数,以及(可选的)初始值。函数参数有4个:prev, cur, index, arrayDate类型 Date()不传入参数的时候可以获取当前时间。传入参数的话需要毫秒值,这个时候就可以隐式或者显式的配合Date.parse()/Date.UTC()将日期/时间转换为毫秒值之后再传入。RegExp类型 字面量创建:var expressions = /patterns/flags构造函数创建: var expressions = new RegExp("patterns", "flags");构造函数创建的时候需要对patterns进行双重转义处理(一般是针对“\”符号),flags可以是g、m、i。ES3创建的正则表达式字面量共享一个RegExp实例,而构造函数则是不同的。共享一个RegExp实例会对下一次匹配的开始索引产生印象。ES5将这一点纠正。Function类型 函数声明语法会发生“声明提前”,而作为表达式,函数表达式只有执行到这里的时候才会进行解释。构造函数创建functoin实例同样属于函数表达式,传入的最后一个参数始终会被认为是函数体的执行代码。由于经历了两次解析,所以不推荐这种方式。注意理解,“函数是对象,函数名是指针”。函数是对象,有方法和属性,函数名是指针,实际上是指向函数的一个引用而已--->函数没有重载,就是因为函数的名称实际上只是引用,指向同一位置。注意,区分this所指的环境与函数本身引用的位置的差别,二者是不同的概念:注意:无论在window下调用this还是在什么其他的对象环境中调用,虽然this的指向环境不一样,但是函数的引用(函数名)始终指向一个函数的位置。函数是对象,是值,所以可以传入到另一个函数,也可以作为值被返回:访问函数指针而不是执行函数,不需要圆括号,例如,访问指针:addSum 执行函数 addSum() 可以帮助理解以后的内容。基本包装类型 基本类型有的时候需要一些属性和方法,这显然不该发生在基本类型身上(基本类型不该有属性和方法)。为了解决这一问题出现了对应的基本包装类型Number、Boolean、String。实际上,当我们对基本类型使用方法或者属性的时候,后台隐式创建了对应的基本包装类型(然而声明周期很短,使用完成之后便销毁。)不仅可以通过各自的构造函数显示创建基本包装类型,还可以通过Object的类工厂函数的方法创建:var v = new Object(true)--此举创建了个Boolean包装类型。这里提出了一个需要区分的地方(虽然我认为并没有什么必要):Number()和new Number()的区别。前者是转型函数(转换为数字),后者为构造函数,所以利用typeof的时候,前者是“number”,后者是“object” 再次理解typeof和instanceof的区别: typeof someThing:返回字符串。区分具体的基本类型(boolean\number\string\null\undefined)和引用类型(object)以及特别些的functionsomeThing instanceof object/String/Boolean/Number/Function/RegExp/Date/Array -- 区分具体的引用类型。 Boolean造成误解的地方:基本包装类型都会被认为是true:所以无论new Boolean(true)还是new Boolean(false)放在逻辑判断语句中都会被认为是true。alert()函数接收的是字符串数据。 单体内置对象 Global:所有不属于其他对象的属性和方法都属于Global(即无法严格分类的那些) 方法: URL编码、解码方法: ecodeURL()/ecodeURLComponent/decodeURL/decodeURLComponenteval()方法:输出执行的结果、将原位置替换位代码段。由于是按照字符串解析,所以不会出现函数声明的提升。注意防止代码注入,慎用。属性:如undefined、NULL、NaN、String、Object等等通过window对象取得Global对象Math:存储数学方法和属性的对象。