持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情
阅读《JavaScript语言精粹》(修订版)的笔记记录,这章讲的是js一些难以避免的问题特性,我们有必要知道这些问题并准备好应对的措施。
- 全局变量 程序越大越难管,可靠性低。 以前不是严格模式的时候,可以这样
foo=value,没有声明,查bug困难。 【现在基本都是严格模式】 - 作用域 以前有块级语法,没有块级作用域 【es6有了】
- 自动插入分号 没出现过
- 保留字 像
export可以被对象当属性,但是必须加引号,使用的时候不能直接点,要o['export']这样使用,我也没用过保留字来当属性就是了 Unicode把一对字符视为一个单一的字符,js认为两个字符是两个不同的字符。 es6用括号解决'\u{1F680}' === '\uD83D\uDE80'typeof null = object奇葩,判断正则会返回对象或者函数。 判断null可以o&&typeof o=='object'parseInt把字符串转整数,遇到非数字就停止解析,参数是16n和16没有区别。如果第一个字符是0会导致字符串基于八进制求值。如时间解析时有必要带基数parseInt('08',10)不加 10就是返回0,加了返回8。parseInt(0x16)==22【但是我用浏览器测了不加也是返回8,也许是优化了。总之以后尽量加第二个参数。】+运算符,可以用于加法和字符串连接,常常引起bug,如果是加法要确保两个运算数都是整数。 【同事教我学了个黑科技,就是 +'123' =>123 有时候我是直接这么转字符串能数字的】- 浮点数,二进制的浮点数不能正确处理十进制的小数,如
0.1+0.2!==0.3,因为遵循的是二进制浮点数算术标准。 NaN,表示not a number,他不表示数字,但是typeof NaN === 'number',在把非数字形式的字符串转换成数字就会产生这个,和NaN计算的结果都是NaN,NaN不等于本身,js提供了一个isNaN函数来判断,判断是否是数字可以用typeof value=='number'&&isFinite(value)筛选掉NaN- 伪数组,可以用
Object.prototype.toString.apply(value)==='[object Array]'检查是否是真数组 hasOwnProperty,对象的一个方法,可以被替换,有雷。- 对象不是真的空对象,所以小心点别用到继承的属性来存值什么的,如
constructor【我用Object.create(null)ok】