JavaScript启示录
首先,摘录一下总结部分:
- 对象是由存储值的已命名属性组成的
- JS中几乎所有对象都可以表现的像对象。复杂值(引用)是对象,原始值可以!看做!对象
- 对象是通过new调用构造函数或者通过使用字面量表达式创建的
- 构造函数时对象(Function对象),因此,JS中对象创建对象
- JS有9个原生构造函数Object(),Array(),String(),Number(),Boolean(),Function(),Date(),RegExp(),Error()。
- String(),Number()和Boolean()构造函数可以提供原始值和对象包装器,以便原始值被当做对象时,表现的像个对象
- null, undefined,“string”,10,true,false都是原始值,没有对象特性,除非将他们看做对象(使用相应对象的属性方法时,即是被看做对象)。看做对象时,JS会在后台创建临时包装器对象,就可以表现的像对象了。
- 使用new调用Object(),Array(),String(),Number(),Boolean(),Function(),Date(),RegExp(),Error()构造函数时,会创建一个对象,叫做复杂对象,或者引用对象。
- 原始值是通过值存储,复制时是通过字面进行复制。复杂值对象是通过引用进行存储的,复制时通过引用进行复制。
- 当原始值的值相等时,既是相等。复杂对象只有在引用相同值的情况下才相等,即指向同一个对象才相等。
- 由于复杂对象和引用的特性,JS对象具有动态属性
- JS是可变的,意味着可以在任何时间操作与那声对象和用户自定义对象的属性
- 可以使用点表示法或者括号表示法获取,设置,更新对象的属性。
- 当查找对象属性时,查找链首先查看对象引用的属性;如果没找到,则继续在构造函数.constructor的.prototype属性上进行查找;如果仍找不到,由于原型拥有一个对象值,并且该值由Object()构造函数创建的,因此在Object()构造函数的prototype属性(Object.prototype)上查找;如果还查不到,确定为undefined
- 原型查找链表明了继承(原型继承)在JS中如何实现
- 由于对象属性查找链的存在,所有对象都继承自Object(),因为prototype属性本身就是一个Object()对象
- JS函数是一等公民,是拥有属性和值的对象
- 在函数内部使用this关键字时,它是一种用于引用包含该函数的对象的通用方法
- 在运行时基于调用函数所在上下文,可以确定this的值
- 在全局作用域内使用this,this引用全局对象
- JS将函数作为创建唯一作用域的方法,没有其他的块作用域!
- JS提供全局作用域,所有的JS代码都在这个作用域内
- 函数(特别是封装函数)创建一个作用域链来解决变量查找问题
- 作用域链是基于代码编写方式创建的,而不是基于调用函数所在的上下文。这使得函数即使从一个不同的上下文调用函数,也能够访问最初编写代码时所在的作用域,这就叫做闭包。
- 函数内部定义的函数表达式和变量,如果没有使用var声明,则都会变成全局属性,然而函数作用域内部的函数语句仍在编写代码时所在的作用域内定义。
- 全局作用域内,定义的函数和变量,不用var声明,会成为全局对象的属性
- 全局作用域内,定义的函数和变量,使用var声明,会成为全局变量