你不知道的JavaScript(中卷)
第一部分 类型和语法
内置类型
- null
- undefined
- boolean
- number
- string
- symbol
- object
特殊数值
- 不是值的值:null、undefined
- 不是数字的数字:NaN
- 无穷数:infinity
- 零值:-0
简单标量基本类型值(字符串和数字等)通过值复制来赋值/传递,而复合值(对象等)通过引用复制来赋值/传递。JavaScript中的引用和其他语言中的引用/指针不同,他们不能指向别的变量/引用,只能指向值。
JavaScript为基本数据类型值提供了封装对象,称为原生函数(如String、Number、Boolean等)。对于简单标量基本类型值,比如“abc”,如果要访问它的length属性或String.prototype方法,JavaScript引擎会自动对该值进行封装(即用相应类型的封装对象来包装它)来实现对这些属性和方法的访问。
? : 是右关联,&& 运算符先于 || 执行,并且都高于?:的优先级。
finally中的代码总是会在try之后执行,如果有catch的话则在catch之后执行。可以将finally中的代码看作一个回调函数,即无论出现什么情况最后一定会被调用。
switch中如果case表达式的结果为真值,但不是严格意义上的true,则条件不成立。
附录
由于浏览器演进的历史遗留问题,在创建带有id属性的DOM元素时,也会创建同名的全局变量。
shim:一个shim是一个库,它将一系列新的、标准的API引入到一个旧的环境中,而且仅靠旧环境中已有的手段实现旧版兼容 polyfill:polyfill是解决跨浏览器API兼容性问题的shim,相当于一段代码。 我们通常的做法是先检查当前浏览器是否支持某个API,如果不支持的话就加载对应的polyfill,然后新旧浏览器就都可以使用这个API了。
异步与性能
new Promise —— 这个函数接受2个函数回调,resolve、reject。reject就是拒绝这个promise,但resolve既可能完成promise,也可能拒绝,根据传入参数而定。
Promise.resolve、Promise.reject —— 创建一个已被拒绝的Promise的快捷方式是使用Promise.reject。 所以以下2个Promise是等价的
var p1 = new Promise(function(resolve, reject){
reject('test');
});
var p2 = Promise.reject('test');
Promise.resolve会根据传入的值来决定最终决议值
then、catch —— Promise决议之后,立即会调用这2个处理函数之一,但不会两个都调用,而且总是异步调用。catch只接受一个拒绝回调作为参数,并自动替换默认完成回调。换句话说,它等价于then(null, ...)
需要的next(..)调用要比yield语句多一个。因为第一个next(..)总是启动一个生成器,并运行到第一个yield处。第二个next(..)调用完成第一个被暂停的yield表达式,第三个next(..)调用完成第二个yield,以此类推