是否有一组每个 JavaScript 程序员都应该知道才能说“我知道 JavaScript”的事情?
不是 jQuery。 不是YUI。不是(等等等等)
框架可能很有用,但它们通常会向您隐藏 JavaScript 和 DOM 实际工作方式的有时丑陋的细节。如果你的目标是能够说“你懂 JavaScript”,那么在框架上投入大量时间是不合时宜的。
这里有一些 JavaScript 语言特性,你应该知道它们在做什么,而不是被抓住,但对很多人来说并不是很明显:
那object.prop和object['prop']是一回事(请停止使用eval,谢谢);该对象属性始终是字符串(即使对于数组);什么for......in是为了(和它不是)。
object.prop
object['prop']
eval
for
in
属性嗅探;什么undefined是(以及为什么闻起来);为什么看似鲜为人知的in运算符是有益的,并且不同于typeof/undefined检查;hasOwnProperty; 的目的delete。
undefined
typeof
hasOwnProperty
delete
Number数据类型实际上是浮点数;使用浮点数的与语言无关的困难;避免parseInt八进制陷阱。
Number
parseInt
嵌套函数作用域;var在要避免意外全局变量的范围内使用的必要性;范围如何用于闭包;闭环问题。
var
全局变量和window属性如何冲突;全局变量和文档元素如何在 IE 中不发生冲突而发生冲突;也必须var在全局范围内使用以避免这种情况。
window
function该语句如何在其前面的代码之前“提升”定义;函数语句和函数表达式的区别;为什么不应该使用命名函数表达式。
function
构造函数、prototype属性和new运算符如何真正起作用;利用它来创建您真正想要的普通类/子类/实例系统的方法当您可能想要使用基于闭包的对象而不是原型时。(大多数 JS 教程材料在这方面都非常糟糕;我花了好几年才明白这一点。)
prototype
new
如何this在调用时确定,不受约束;因此,方法传递如何不像您对其他语言所期望的那样工作;如何关闭或Function#bind可以用来解决这个问题。
this
Function#bind
其他 ECMAScript 第五版功能,如indexOf,forEach以及函数式编程方法Array;如何修复旧浏览器以确保您可以使用它们;将它们与内联匿名函数表达式一起使用以获得紧凑、可读的代码。
indexOf
forEach
Array
浏览器和用户代码之间的控制流;同步和异步执行;在控制流中触发的事件(例如焦点)与控制返回时发生的事件和超时;如何调用所谓的同步内置alert函数最终会导致潜在的灾难性重入。
alert
跨窗口脚本如何影响instanceof;跨窗口脚本如何影响跨不同文档的控制流;postMessage希望如何解决这个问题。
instanceof
postMessage
最重要的是,您应该以批判的眼光看待JavaScript,承认由于历史原因它是一种不完美的语言(甚至比大多数语言还要多),并避免其最严重的问题。克罗克福德在这方面的工作绝对值得一读(尽管我不是100% 同意他的“好零件”是什么)。