Stackoverflow上有人总结的JavaScript必知必会
框架的确好用,不过他们也隐藏了JavaScript中丑陋的细节和DOM的运作机制.如果你的目标是敢于自称"我懂JavaScript",那么花时间学习框架无异于南辕北辙.
下面这些JavaScript语言特性你应该熟记在心并避免被他们困扰,然而多数人可能对此还不熟悉.
-object.prop和object['prop']是一回事.(所以咱能不用eval么,谢谢嗷);对象的属性名都是以字符串来索引的,连数组的下标都是;for...in能拿来干啥,不能干啥.
-属性检测;undefined是个啥(及其肮脏之处);不出名的in操作符有何优势,它与typeof/undefined有何不同;hasOwnProperty方法;delete操作符的作用
-Number类型本质上只是浮点类型;语言无关地使用浮点类型的困难所在;避免parseInt方法的八进制陷阱
-潜逃函数的变量作用域;为避免产生全局变量而使用var关键字的必要性;作用域与闭包的结合应用;某个经典的闭包与循环的问题
-全局变量与window对象的属性其实是一回事;全局变量与DOM对象在IE中的命名冲突问题;以及使用var来规避此类问题.
-function语句被提升的机理,function语句与function表达式的区别;为什么避免使用具名函数表达式.
-构建函数,prototype属性,new关键字的工作机制;在此基础上实现一个基本的类-子类-实例OO系统;何时考虑使用基于闭包的对象来取代原型.(一般的JS教程这里讲的都很渣,我花了好几年才真正理解)
-this关键字在函数调用时确定而非函数定义时;传入作为参数函数为什么不像其他语言那样正常工作;如何用Function.prototype.bind来解决这个问题.
-ES5引入的新语言特性,如indexOf,forEach等;Array类的函数式编程方法;如何为旧浏览器引入这些方法;用匿名函数调用这些方法来提高代码可读性.
-浏览器与JS的控制流程交换机理;同步与异步执行;运行中主动触发的事件与真的事件间的区别,以及timeout的机制;调用同步执行的方法(比如alert)可能造成的控制流重进入的潜在异常;
-跨window编程中instanceof潜在的问题以及不同文档间控制流程是怎样互相影响的;postMessage会如何解决该问题.
这里绝大多数问题都需要你批判性地看待JavaScript,理解它由于历史原因而遗留下来的种种不完美(一般来说比别的语言都要糟糕),并学会规避这些陷阱.DouglasCrockford在这方面的研究很值得一读(虽然我并非100%同意他的"语言精粹")