JavaScript语言精粹-读书笔记(4)
作者:互联网
附录A 毒瘤
全局变量
全局变量可能造成内存泄漏;大型程序中可能和另一个变量名冲突;可以被程序的任何部分在任何时间修改(降低了程序的可靠性)
定义全局变量的三种方法:在函数外部使用 var foo = value; 给全局对象window增加一个属性 window.foo = value; 使用未声明的变量(隐式全局变量,会造成很大的麻烦)
作用域
JS具有代码块,但是没有块级作用域。其他语言中,声明变量在第一次使用是,在JS中可以在每个函数开头部分声明变量。
自动插入分号
如果return后没有加分号,就会自动增加分号 return; 返回一个undefined
typeof
typeof(null) => Object 所以不能用这种方法检测null
可以使用 null === null (true) 检测null
对于正则表达式,大部分浏览器返回 object
parseInt
parseInt 会把字符串转化成整数,如果遇到非字符就会停止解析。parseInt(‘16 tons’) => 16.
s如果遇到的字符串第一个是0,parseInt 会按照八进制转换,这可能造成错误。
parseInt(‘089’) => 0
解决 parseInt(‘089’, 10) => 89 按照十进制进行转化。
加法
确保加法的两个数都是整数。如果计算货币需要圆角分,需要先转化成分进行计算(之后再还原成元)。
NaN
计算错误会产生NaN。如果一个计算结果是NaN,那么可能输入项或者计算过程中产生了NaN。可以使用 isNaN 判断。
isNaN('oop'); //true
isNaN('0'); //false
伪数组
JS 中的数组实际上是对象。不需要考虑越界的问题,但是性能比C语言中的数组差很多。判断数据不能使用 typeof,需要判断 constructor.
if (my_value && typeof(my_value) === 'object' && my_value.constructor === Array) {
console.log('parameter is an array');
}
函数参数构成伪数组 arguments 不是一个数据,是一个对象,具有 length 属性。
hasOwnProperty 是对象的一个方法,可以判断对象内部是否有一个键;但是这个方法可以被更改(object.hasOwnProperty = null;),此时就会出错。
附录B 糟粕
避免使用 ==
两个等号比较时,如果变量类型不同会强制转换,这些规则很复杂。所以尽量避免使用两个等号,最好使用三个等号。
'' == '0' //false
0 == '' // true
0 == '0' // true
避免使用 with 语句
避免使用 eval 语句
避免在函数参数中传递字符串
减少使用 continue
减少使用 switch_case 穿越(两种情况对应一个结果,不写 return 语句。)这样在 JSLint监测效果不好
尽量使用代码块(if while) 避免因为换行程序错误。因为JS中空格不严格限制。
附录C JSlint
使用 JSLint 可以减少错误发生(代码行末加入分号等,避免语句错误)
使用 ++ — 避免在前面写空格,因为可能造成 + + 这样的错误
在选择结构中,JSLint不希望出现赋值语句。因为可能是比较语句(a == b) 少写了一个等号造成的赋值语句。
可以避免很多语法问题造成的潜在的bug。
这一点对于自己很有用。在自己的项目中最好可以这个库。
附录 JSON
JSON 主要用于不同语言数据交换。
JSON 对象可以被插入任何数据类型的值,对象可以无限层次的嵌套。但是最好的办法是扁平的数据。其他语言具有映射成JSON对象的数据类型。
可以使用 eval 函数把文本字符串转化成一个有用的数据结构,但是这种方法存在风险。
替代的方法是 JSON.parse 如果内部包含一个危险的数据,就会跑出一个错误。
标签:语句,精粹,读书笔记,JavaScript,value,JSON,使用,parseInt,null 来源: https://blog.csdn.net/weixin_41697143/article/details/90706309