其实我不懂 Javascript

本文摘自 勾三股四 更早时期的 不老歌 博客。

最近在读一本有关 javascript 的书。
这本书很有趣,虽然内容是枯燥的,但偏偏又是我感兴趣的——我总是看着它不知不觉的犯困,每次睡醒之后,又立刻想把它继续看下去。
它虽然是讲 javascript,可基本不讲浏览器环境,统统是在推敲和雕琢语言本身的细致入微的环节。透过这本书,我看到了很多 js 被 ie/ff/chrome/op 以及 web 设计师、架构师们打磨过后,被埋没的内容——而这些内容又是这么让人豁然开朗。我才发现,原来自己之前对这门语言的了解,是很片面的。同时,这本书还打破了我的一些迷信思想:

1. 不是只有老外的书才写的好——我们国人也写得出有深度有内容的好书;
2. 不是只有传说中的神仙才写得出艺术品一般的代码和产品——我们每个人都有这个潜力;
3. 不是只有起步早才有机会的——javascript 的历史也不过十余年,从作者的人生经历来看,想成大器,只要心已决,永远都不晚。

摘一些自己通过这本书认识到的知识盲点和知识体系:
1. 'abc' 和 new String('abc') 的区别在于前者传递的是值,后者是引用;
2. string 的值可以使用下面的方法书写:var str = 'abcdefg\
hijklmn\
opqrst\
uvwxyz';
反斜杠代表书写时要折行,字符本身并不属于字符串,它的值会是一个没有换行符的 26 个字符的字符串,但有一点要注意,反斜杠后不能跟注释;
3. == 和 === 的比较规律和原则如下:

运算符两个直接量比较直接量和引用比较两个引用比较
==比较两者的值是否相同先将引用转化为值,再与另一个值进行比较比较引用是否相同
===同时比较类型和数值肯定不相同比较引用是否相同
大于、小于等直接比较两者的“序列”大小先将引用转化为值,再与另一个值进行比较无法比较,直接返回 false

4. 正则表达式中的“引用匹配”,如:(\d)\.\1表示两个相同的数字用点连接起来的情况(如"12345.12345");
5. SpiderMonkey Javascript 引擎(即 ff 等浏览器的 js 引擎)中,表达式中的具名函数不会存在与整个命名空间中,如:((function foo(a,b) {...})(x,y));6. eval 语句中应该是一个完整的语句,而非表达式,此函数共执行三件事:解析语句 - 执行语句 - 返回语句的返回值;
7. 逻辑语句可以简写成下面的样子:while (...);if (...);
else {...}
8. 标签的写法以及 break 的一个不常用的用法:my_label: {
...
break my_label;
...
}
continue 也有类似的用法;
9. new constructor();在没有参数时可以简写成new constructor;这里 constructor() 并不能认为是函数调用,因为不能将其写成下面的样子:new (constructor());10. 对象的隐形属性(如一些 native code)被重写后在有些 js 引擎中会变为显性属性(即出现在 for ... in 循环中);
11. delete 不能删除的内容有:
a. 通过 var 声明的变量;
b. 对象的原型的成员;
12. 可以通过 in 语法判断对象是否具有某个属性:if (property in object) {...}
这本书还没看完,应该还有很多可以拿来完善我们的 js 知识体系的内容。这里做一个阶段性的自我整理。同时分享出来。

向本文提出修改或勘误建议