第二遍看,收获不大,大部分内容都接触过了,书里介绍的并不深入,有些东西也略陈旧。(2018.12.28 - 2019.01.08)
第1章 精华
JavaScript的糟糕的想法:依赖于全局作用域。
ES6里面对于局部作用域的补充已经大大缓解了这个问题。
第2章 语法
注释
要注意,多行注释/* */
遇到正则表达式有可能失效:
const reg = /.*/g
数字
JavaScript中数字没有分离整数类型和小数类型,所以:
1 === 1.0; // true
1.0 === 1.00; // true
要注意,0
和-0
用===
是相等的,但是用Object.is
相比是不等的
0 === -0; // true
Object.is(0, -0); // false
如果不支持Object.is
,可以把0
和-0
作为除数,转换为Infinity
和-Infinity
来比较:
1 / 0 === 1 / -0; // false
// 等同于
Infinity === -Infinity
Infinity
是大于1.79e308
的值
字符串
JavaScript的字符串是16位的,\
反斜线是转义字符,\u
约定用来指定数字字符编码
'\u0030' === '0'; // true
语句
通过Object.hasOwnProperty(variable)
确定属性是该对象的成员,还是来自原型链
注意-=
操作符的简写:
let a -= 100;
// 等同于
let a = a - 100
第3章 对象
原型链
对象通过引用传递
通过对象字面量创建的对象也都是Object
的实例:
let obj = {};
obj.__proto__ === Object.prototype; // true
obj instanceof Object; // true
书里面实现的create
方法已经是原生的方法了result = Object.create(a, b)
,指定result
的原型对象是a
其实现是:
Object.prototype.create = Object.prototype.create || function (o) {
if (Object.prototype.toString.call(this) === '[object Object]') {
function F() {}
F.prototype = o;
return new F()
}
}
delete
操作符也不会触及原型链的对象
function Person(){}
Person.prototype.test = 123;
let p = new Person();
p.test; // 123
delete p.test; // true
p.test; // 123
delete Person.prototype.test; // true
p.test; // undefined