《javascript语言精粹》读书笔记五

第十章 优美的特性

在本章开头 老道写到:“我想避开不谈浏览器和其他适合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() {}

这种方式可以明确的表示foo是一个包含一个函数值的变量

new

new运算符帮助我们创建一个继承原型的新对象,然后调用该运算数,将新创建的对象绑定给this,使得运算数可以返回前者自定义创建的新对象,而当你忘记使用new的时候,得到的是一个普通的函数调用结果,并且this会保存到全局对象上,对其造成污染。

所以建议在可能的时候不要使用new运算符。

void

void是一个运算符,它接受一个运算数并返回undefined。这没有什么用,应该尽量避免使用它。在ie8及以下浏览器中为了防止undefined关键字被覆盖,常常使用void 0来代替undefined。

Table of Contents