第四章 表达式和运算符
1 new调用构造函数的过程
a 创建一个新的空对象
b 设置空对象的_proto_指向构造函数原型prototype
c 将这个新对象当做this的值来调用构造函数
d 如果构造函数不返回一个对象值,则返回新对象
2 左值:表示存储在计算机内存的对象。
3 除数为0的运算结果是正无穷大或负无穷大,0/0的结果是NaN。
4 位运算符会将NaN、Infinity和-Infinity都转换为0。
5 in运算符希望它的左操作数是一个字符串或可以转换为字符串,右操作数是一个对象。
6 a op = b => a = a op b,只有在a包含具有副作用的表达式(比如函数调用和赋值操作)的时候,两者才不相等。
a data[i++]*= 2 和 data[i++]=data[i++]*2是不等价的
7 关于eval()最重要的是,它使用了它的变量作用域环境。也就是说,它查找变量的值和定义新变量和函数的操作和局部作用域中的代码完全一样。
8 eval具有更改局部变量的能力,这对于JS优化器来说是一个大问题。在非严格模式下,允许var geval = eval,这样间接调用eval( geval(params)),则使用全局对象作为上下文作用域,并且无法读写、定义局部变量和函数。
9 typeof区分对象和原始值
10 delete的操作数是一个左值,否则将不进行任何操作同时返回true
第五章 语句
1 ;(空语句),JS解释器执行空语句时不会执行任何动作。
2 var 和 function都是声明语句,它们声明或定义变量或函数。
3 函数声明和函数定义的区别
a 函数声明:函数的名字可以在函数内部和父作用域中取到(实质上是声明了一个变量,并将函数对象赋值给这个变量);
b 函数定义:函数的名字只能在函数内部取到。
4 return和break语句都用于终止switch语句。
5 switch对每个case匹配操作执行恒等。
6 break 和 continue 是JS中唯一使用语句标签的语句。
7 try/catch/finally 语句是JS的异常处理机制。
8 with 语句用于临时扩展作用域链,with () {}。
第六章 对象
1 属性名可以是包含空字符串在内的任意字符串,但对象中不能存在两个同名的属性。
2 属性特性
a 值(value)
b 可写性(writable),表明是否可以设置该属性的值
c 可枚举性(enumerable),表明是否可以通过for/in循环返回属性
d 可配置性(configurable),表明是否可以删除或修改该属性
3 存储器属性特性
读取(get) 写入(set)可枚举性和可配置性
4 对象特性
a 对象的原型(prototype)
b 对象的类(class)是一个标识对象类型的字符串
c 对象的扩展标记(extensible)指明了是否可以向该对象添加新属性
5 可以通过对象直接量、关键字 new 和 Object.create() 函数来创建对象。
6 Object.create可以通过传入参数为null来创建一个没有原型的新对象,通过这种方式创建的对象不会继承任何东西,甚至不包括基础方法。
7 属性赋值操作首先检查原型链,以此判断是否允许赋值操作。如果对象o继承一个只读属性x,那么赋值操作是不允许的。如果允许属性赋值操作,它也总是在原始对象上创建属性或者对已有的属性赋值。只有在查询属性时与继承有关,设置属性则与继承无关。有一个例外,如果o继承自属性x,而这个属性是一个具有setter方法的accessor属性,那么这时将调用setter方法,而不是给o创建一个属性x。需要注意的是,setter方法是由对象o调用的,而不是原型对象调用。
8 检测属性:可以通过in 运算符、hasOwnProperty() 和 propertyIsEnumerable() 方法完成
9 propertyIsEnumerable是hasOwnProperty的增强版,只有检测到自有属性且这个属性的可枚举性为true时它才返回true。
10 枚举属性:
a 可以通过for/in 循环(可枚举的自有属性和继承属性)
b Object.keys() (可枚举的自有属性)
c Object.getOwnPropertyNames() (所有自有属性)
11 由getter 和 setter 定义的属性称为"存取器属性",也是可以继承的。
12 通过调用Object.getOwnPropertyDescriptor()可以获得某个对象特定属性的属性描述符。
13 通过调用Object.defineProperty()可以设置属性的特性。
14 可写性控制着对值特性的修改。
15 可配置性控制着对其他特性的修改(包括属性是否可以删除)。具体规则:
a 如果属性(数据属性&存储器属性)是不可配置的,则不能修改可配置性和可枚举性;
b 如果存储器属性是不可配置的,则不能修改其getter 和 setter 方法,也不能将它转换为数据属性;
c 如果数据属性是不可配置的,则不能将它转换为存储器属性;
d 如果数据属性是不可配置的,则不能将它的可写性从false修改为true,但是可以从true修改为false;
e 如果数据属性是不可配置且不可写的,则不能修改它的值。然而可配置但不可写的属性的值是可以手动修改的(实际上是先将它标记为可写的,修改值后,再转换为不可写的)
f 如果对象是不可扩展的,不能给它添加新属性。
16 通过调用isPrototypeOf() 检测一个对象是否是另一个对象的原型。
17 通过内置构造函数(Array Date等)创建的对象均有类属性。
18 Object.prototype.toString.call(o).slice(8, -1) => 类属性
19 对象可扩展性
a Object.isExtensible() 是否可扩展
b Object.preventExtensions() 转换为不可扩展的
c Object.seal() 除了转换为不可扩展的,还将对象的所有自有属性设置为不可配置的
d Objetct.freeze() 除了转换为不可扩展的,还将对象的属性设置为不可配置的,另外所有数据属性都设置为只读的(setter方法不收影响)
20 JSON.stringify() 和 JSON.parse() 序列化和还原对象。