作者的意思是需要特殊注意的部分。
1、全局变量
JavaScript 依赖全局变量。定义全局变量的三种方式,尽量减少全局变量的使用。
第一种,在任何函数之外放置一个 var 语句。
var foo = value;
第二种,直接给全局变量增加一个属性,在 web 浏览器中,全局对象名为 window。
window.foo = value;
第三种,直接使用未声明的变量,被称为隐式的全局变量
foo = value ;
2、作用域
JavaScript 采用了块语法,却没有提供块级作用域:代码块中声明的所有变量在包含此代码块的函数的任何位置是可见的。在JavaScript中,声明变量最好的方式是在每个函数的开头部分声明所有变量。
3、自动插入分号
这是 JavaScript 的自动修复机制。把 { 放在上一行的尾部而不是下一行的头部,避免这种方式带来的错误。
4、保留字
保留字不能用来命名变量或参数。当保留字作为对象字面量的键值时,它们必须被引号括起来,而不能被用在点表示法中。
var method ; // ok
var class ; // 非法
object = {box: value}; // ok
object = {case: value}; // 非法
object = {'case': value}; // ok
object.box = value; // ok
object.case = value; // 非法
object['case'] = value; // ok
5、Unicode
Unicode 认为一对字符是一个字符,而 JavaScript 认为一对字符是两个不同的字符。
6、typeof
typeof null 等于 'object',不能识别 null 和 object。可使用以下方式来识别 null 和 对象
typeof null // 返回 'object'
if ( my_value && typeof my_value === 'object'){ // null 值为假
// my_value 是一个对象或数组
}
7、parseInt
parseInt 函数将字符串转换为整数,在遇到非数字时停止,但是遇到非数字时不会给出提示或额外文本。
由 '0' 开头的字符串,会基于八进制来求值,八进制中 8 和 9 不是数字,因此 parseInt("08") 和 parseInt("09") 都产生 0 的结果。建议总是加上第二个参数——基数, parseInt("08",10) 的结果为 8。
8、+
+ 运算符可以用于加法运算或字符串连接。如果想使用 + 做加法运算,请保证两个运算数都是整数。
9、浮点数
0.1 + 0.2 不等于 0.3,小数位的运算是不精确的,浮点数中整数运算是精确的。
10、NaN
NaN 是一个特殊的数量值。typeof 不能区别 数字和 NaN,而且 NaN 也不等同于它自己。
typeof NaN === 'number' // true<pre name="code" class="javascript">NaN === NaN // true
NaN !== NaN // true
JavaScript 提供了一个函数,可以辨别数字和 NaN。
isNaN(NaN) // true
isNaN(0) // false
isNaN('oops') // true
isNaN('0') // false
isFinite 函数会筛掉 NaN 和 Infinity ,但是不能识别参数是不是数值。结合一下,判断是不是数值:
var isNumber = function isNumber (value) {
return typeof value === 'number' && isFinite(value); // 先判断是不是数值,再筛掉 NaN 和 Infinity
}
11、伪数组
JavaScript 没有真正的数组。typeof 不能识别数组和对象,要识别数组,可检查它的 constructor 属性:
if (my_value && typeof my_value === 'object' && my_value.constructor === Array){
// my_value 是一个数组
}
但不能识别在不同帧或窗口中创建的数组,结果为false。可以检测对象的原型来判断是不是数组:
if (object.prototype.toString.apply(my_value) ==== '[ object Array] '){
// my_value 确实是一个数组
}
argument 不是一个真正的数组。
12、假值
JavaScript 拥有6个假值,这些值全都等于假,但这些值不能互换,就是不相等。
undefined 和 NaN 在 IE8 及以下的 IE 浏览器不是常量,而是全局变量,其值可以被更改,这是非常可怕的一件事。
值 | 类型 |
0 | Number |
NaN(非数字) | Number |
' ' (空字符串) | String |
false | Boolean |
null | Object |
undefined | Undefined |
13、hasOwnProperty
hasOwnProperty 是一个方法,而不是一个运算符,在任何对象中,可能会被一个不同的函数甚至一个非函数的值所替代。
14、对象
JavaScript 的对象永远不会是真的空对象,因为它们可能从原型链中取得成员属性。为了避免这个原因带来的问题,用 hasOwnProperty 方法检测成员关系,或者查找指定的类型。