第十章 优美的特性
在本章开头 老道写到:“我想避开不谈浏览器和其他适合javascript的地方。”我想要强调其更有分量的内容,以显示它是值得尊敬的语言。
我也这么认为,虽然我了解的语言种类不多,但是js强大的表现力还是使我深深的爱上了它。
以下是老道认为js种最精粹的部分:
函数是顶级对象 函数是有词法作用域的闭包。
基于原型继承的动态对象 对象是无类别的。我们可以通过普通的属性赋值给任何对象增加一个新成员属性,一个对象可以从另一个对象继承成员属性。
对象字面量和数组字面量 这对创建新的对象和数组来说是一种非常方便的表示法。javascript字面量是数据交换格式JSON的灵感之源。
附录A 毒瘤
在很多书中附录往往冗长而缺乏价值(干货),本书的附录才是真正的精华所在,它阐述了js这门语言的毒瘤,糟粕和精华所在。非常值得细细品味和了解。
全局变量
全局变量的三种声明方式:
1、var foo = value;
2、global.foo = value;
3、foo = value;
自动插入分号
js有自动插入分好的习惯,它试图通过自动插入分好来修正有缺损的程序。但是,这可能会掩盖更为严重的错误。
比如对于以下语句就是错误的,ex:
return // this will return undefined;
{
state : true;
}
通过一些编程约定能够避免这个问题,比如上例应该写作,就能返回正确的结果:
return {
state : true;
}
typeof
typeof null返回为‘object’,这说明typeof不能辨别出null对象,但你可以像下面这样做,已达到目的:
if(x && typeof x === ‘object‘) {
// x 是一个对象或者数组
}
parseInt
parseInt(“08”)回0,而不是8,因为这里按照8进制来处理”08”字符串,所以建议无论何时都为parseInt函数加上基数参数。
+
+号可以用来被连接字符串,这里导致一系列问题,想必你一定也碰到过100 + ‘11’ –> 10011的时候吧。所以如果打算做加法运算,请确保两个运算数都是整数。
浮点数
浮点数的小数点后运算不精确,比如0.1+0.2=0.30000000000000004,这个结果是遵循二进制浮点数算数运算标准的(IEEE 754),可以通过乘法来对其进行避免此处可参看(js精确四则运算)。
NAN
NAN不是一个数字,尽管typeof NAN === ‘number‘ // true
。NAN不等于它自己,它和任意数进行运算, 结果为NAN。
可以使用 typeof value === ‘number‘ && isFinite(value)
对数字进行判断,这是因为isFinite函数将会筛除掉NAN和Infinity。
假值
js种有一个很大的假值空间:“0, NAN, ”, false, null, undefined”都等同于假值,又不可互换,所以判断时应该使用‘===‘
而不是‘==‘
。
这里需要说明的是,在ie8及以下浏览器中,NAN和undefined不是常量,他们的是值是可以改变的,你可以将undefiend赋值成任何你想要的对象。
附录B 糟粕
==
由于js中的”==
“运算符会对左值和右值进行类型转换,所以他违反了传递性这种编程约定,所以如同前文提到的一样尽量使用”===
“和”!==
“来代替”==
“和”!=
“。
with和eval
这两个兄弟对js的运算速度有很大的影响,而又降低的js的可读性和可检测性,所以应该尽量避免使用。
continue语句
代码中移除continue后性能会得到提升。
++ –
当使用这两者时,代码变得拥挤,复杂和隐晦。因此,为了代码风格整洁,不建议使用他。
位运算符
由于js的运行环境导致其运行时基本解除不到硬件,位运算符在js种执行速度很慢,建议不要使用它。
function语句和function表达式
推荐使用function表达式,使用示例如下:
var foo = function foo() {}</code></pre>
这种方式可以明确的表示foo是一个包含一个函数值的变量。
new
new运算符帮助我们创建一个继承原型的新对象,然后调用该运算数,将新创建的对象绑定给this,使得运算数可以返回前者自定义创建的新对象,而当你忘记使用new的时候,得到的是一个普通的函数调用结果,并且this会保存到全局对象上,对其造成污染。
所以建议在可能的时候不要使用new运算符。
void
void是一个运算符,它接受一个运算数并返回undefined。这没有什么用,应该尽量避免使用它。在ie8及以下浏览器中为了防止undefined关键字被覆盖,常常使用void 0来代替undefined。
更多内容请查看zakwu的小站