javascript|JavaScript 鸡肋

【javascript|JavaScript 鸡肋】javascript|JavaScript 鸡肋

JavaScript 鸡肋这一章展示一些 JavaScript 一些有问题的特性 , 但我们很容易就能避免它们 。 通过这些简单的做法 , 你就可以使 JavaScript 成为一门更好的语言 , 也能让自己成为一个更好的程序员 。

==JavaScript 有两个相等运算符:=== 和 !== , 以及它们邪恶的孪生兄弟 == 和 != 。
=== 和 !== 这一组运算符会按照你期望的方式工作 。 如果两个运算数类型一致并且拥有相同的值 , 那么 === 才会返回 true , !== 返回 false 。
而它们邪恶的孪生兄弟只有在两个运算符类型一致时才会做出正确的判断 , 但如果两个运算数是不同类型时 , 它们试图去强制类型转换其值的类型 。
转换的规则复杂 , 且难以记忆 。
''  == '0' // false
0 == '' // true
0 == '0' // ture

false == 'false' // false
false == '0' // true

false == undefined // false
false == null // false
null == undefined // true

'\\t\\r\' == 0 // true

== 运算符对传递性的缺乏值得我们警惕 。
我的建议是永远不要使用那对邪恶的孪生兄弟 , 相反 , 请始终使用 === 和 !== 。 所有以上的比较如果使用 === 运算符 , 结果都是 false 。
with语句JavaScript 提供了一个 with 语句 , 本意是想用来快捷的访问对象的属性 , 不幸的是 , 它的结果可能有时不可预料 , 所以应该避免使用它 。
下面的语句:
with (obj) {
    a = b

和下面的代码做的是一样的事情:
if(obj.a === undefined){
    a = obj.b === undefined ? b : obj.b
 else {
    obj.a = obj.b = undefined ? b : obj.b

所以 , 它等于这些语句中的任何一条:
a = b
a = obj.b
obj.a = bobj.a = obj.b

通过阅读代码 , 你不可能辨别出你会得到是这些语句中的哪一条 。 它可能随着程序运行到下一步时发生变化 。 它甚至可能在程序运行过程中就发生变化了 。 如果你不能通过阅读程序而了解它将会做什么 , 你就无法确信它会正确地做你想要做的事情 。
with 语句在该门语言中存在 , 本身就严重影响了 JavaScript 处理器的速度 , 因为它阻止了变量名的词法作用域绑定 。 它的本意是好的 , 但如果没有它 , JavaScript 语言会更好一点 。
evaleval 函数传递字符串给 JavaScript 编译器 , 并且执行其结果 。 它是一个被滥用最多的 JavaScript 特性 , 那些对 JavaScript 语言一知半解的人们最长用到它 。 例如 , 你知道点表示法 , 但不知道下标表示法 , 就可能会这么写:
eval('my_value = myObject.' + myKey + ';')
而不是这么写:
my_value = myObject[myKey

使用 eval 形式的代码会更加难以阅读 , 这种形式将使得性能显著降低 , 因为它必须运行编译器 , 但也许只是为了执行一个微不足道的赋值语句 。 它也会让 JSLint 失效 。 因此该工具检测问题的能力也会显著降低 。
eval 函数还减弱了你的应用的安全性 , 因为它被求值的文本授予了太多的权力 。 而且就像 with 语句执行的方式一样 , 它降低了语言的性能 。