简介
我想这是在我总结JavaScript系列中最为需要注意的,最为重要的内容。你必须要去了解这些问题特性,才能准备好应对措施,这真的很重要。
毒瘤
全局变量
全局变量的存在的确是带来了方便,但是我觉得JavaScript对于全局变量的依赖性已经到达一种恐怖的状态。如果某些全局变量的名称碰巧和子程序中的变量名称相同,那么它们就会相互冲突,可能导致程序无法执行,而且不好调试。
文章中定义了三种定义全局变量的方式,分别是:
-
在任何函数之外放置一个var语句,这个和其他语言一样:
var foo = value;
-
直接给全局对象添加一个属性。如果是在Web浏览器里,全局变量为Window:
window.foo = value;
-
直接使用未经处理的变量,这个称为隐式的全局变量:
foo = value;
工作中遇见的普遍的错误应该是第三种,这很普遍。
作用域
JavaScript并没有实现作用域,因此代码块中声明的变量在包含此代码块的函数的任何位置都是可见的。
所以,声明变量最好的方式是每个函数的开头部分声明所有变量。
自动插入分号
如果一个return语句返回一个值,这个值表达式的开始部分必须和return同一行。否则,比如
return
{
status : "value"
}
这明显返回是一个具有属性的对象。只需要将左括号和return同一行就避免了。
typeof
返回一个用于识别其运算数类型的字符串。
但是需要注意的是,比如typeof null返回的对象是object而不是null,因此尽量不使用。
parseInt
将字符串转化为整数。但是如果该字符串的第一个字符是0,那么该字符串会基于八进制而不是十进制来求值,而且在八进制中,8和9不是数字,所以参数为“08”或者“09” 产生的结果都是0;所以建议加上基数参数,不要省略掉。
NaN
NAN是一个特殊定义的值,不是一个数字,但是
typeof NaA ==== 'number'; // true
可以看出,typeof无法辨别数字和NaN,而且NaN也不等同于它自己。
判断一个值是否是数字的方法是
var isNumber = function isNumber(value) {
return typeof value ==== 'number' && isFinite(value);
}
伪数组
数组的监测:
if(Object.prototype.toStrings.apply(my_value)) === '[Object Array]') {} //return true;
注意,参数列表arguments数组不是一个数组,它只是一个存着length成员属性的对象。
假值
值 | 类型 |
---|---|
0 | Number |
NaN(非数字) | Number |
”(空字符串) | String |
false | Boolean |
null | Object |
undefined | Undefined |
表格里面的值全部都等同于假,但是它们是不可互换的,所以不要使用不安全的,而是应该使用=。
还有这个表格里面最需要注意的应该是NaN,null,undefined等等。
hasOwnProperty
注意,这是一个方法,而不是一个运算符,所以在任何对象中,它可能会被一个不同的函数甚至一个非函数的值所替换。比如说:
obj.hasOwnProperty = null; //地雷//...使用
obj.hasOwnProperty(...) //触碰地雷
对象
注意,在Object.prototype中,包含着一个名为constructor的成员对象,它的值是一个成员对象,这个是默认的。
糟粕
eval
谨慎使用,这是一个传递字符串给编译器返回执行结果的函数。
缺少块的语句
我感觉这个因人而异,不过我喜欢加上括号。
位运算符
JavaScript没有整数类型,它只有双精度的浮点数。因此,位操作符把它们的数字运算数先转换成整数,接着执行运算,然后再转换回去。但由于语言的执行环境接触不到硬件,所以非常慢。
function
推荐以function表达式代替function语句。因为能够明确的表示这是一个包含一个函数值的变量。
var foo = function() {};
类型的包装对象
尽量避免使用new Boolean(true)或者new Array或者new Object等等这些类型的包装对象,没有必要,用[],{}等等就好。
void
在其它语言中,void是一种类型,表示没有值,但是在JavaScript中,void是一个运算符,它接受一个运算符并且返回undefined。