Javascript语言精粹-毒瘤和糟粕


Javascript是一门语言,用久了肯定能够发现其中的好与不好的地方。不过大多数普通人没那么细心,所以也就忽略了,很难说出一二三来。但对于极客版的牛人就不同了,他们理解的远比普通人透彻。

二、糟粕(轻微)

一、毒瘤(严重)

1,全局变量

var foo = value;

window.foo = value;

foo = value;

隐患是很多时候是忘加var了

2,作用域

没有块级作用域,所以最好在开头部分声明所有变量。

而不是其他语言延迟声明。

3,自动插入分号

return

{

};

改成 return {

}

4,保留字

用在对象的key时,保留字需要加引号

不能用在点表示法中。

5,Unicode

Unicode把一对字符视为单一的字符,而js认为一对字符是两个不同的字符。

6,typeof

typeof null 返回的是object,以致无法判断到底是null,还是空对象。

对于null,可以用 my_value === null

对于空对象,用 if(my_value && typeof my_value === null){}

7,parseInt

遇到非数字会自动截掉,所以parseInt(“16″)与parseInt(“16 tons”)结果相同。

parseInt(“16″, 10);//因为遇0开头总认为是8进制,所以最好总加上基数参数。

8,浮点数

0.1+0.2不等于0.3,所以最好先乘以100,算完后再除以100

9,NaN

//isNaN() 函数用于检查其参数是否是非数字值。

//isFinite() 函数用于检查其参数是否是无穷大

typeof NaN === ‘number'; //true

判断是否是一个数字,可以用:

var isNumber = function (value){

    return typeof value === ‘number’ && isFinite(value);

}

10,伪数组

typeof不能辨别数组和对象。要判断一共值是否为数组,还需要检查他的constructor属性:

if(my_value && typeof my_value === ‘object’ && my_value.constructor === Array){

    //my_value是一共数组

}

11,假值

0          ->  Number

NaN        ->  Number

”         ->  String

false      ->  Boolean

null       ->  Object

undefined  ->  Undefined

12,hasOwnProperty

由于hasOwnProperty是一共方法,而不是一个运算符,所以在任何对象中,他可能会被一个不同的函数甚至一个非函数的值所替换:

var another_stooge.hasOwnProperty = null; //地雷

for (var name in another_stooge){

    if ( another_stooge.hasOwnProperty(name) ) {//触雷

        document.writeln( name + ‘: ‘+another_stooge[name] );

    }

}

13,对象

由于对象永远不会是真的空对象,因为他们可以从原型链中取得成员属性。有时那会带来麻烦。例如计算一段文斌每个单词出现次数。此时单词种可能包含constructor等关键词导致计算异常。

例子详见原书。


发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>