是否有一套每个 JavaScript 程序员都应该知道的东西才能说“我知道 JavaScript”?
每个 JavaScript 程序员都应该知道什么?
不是 jQuery。不是 YUI。不是(等等等等)
框架可能很有用,但它们往往隐藏了 JavaScript 和 DOM 实际如何工作的有时很难看的细节。如果您的目标是能够说“我知道 JavaScript”,那么在框架上投入大量时间与此相反。
这里有一些 JavaScript 语言的特性,你应该知道它在做什么并且不会被发现,但对很多人来说并不是很明显:
那
object.prop
和object['prop']
是一样的东西(所以你能不能停止使用eval
,谢谢);对象属性始终是字符串(即使对于数组也是如此);什么for
......in
是为了(以及它不是什么)。属性嗅探;是什么
undefined
(以及为什么有气味);为什么看似鲜为人知的in
运算符是有益的,并且与typeof
/undefined
检查不同;hasOwnProperty
; 的目的delete
。该
Number
数据类型是一个真正的浮动; 使用浮动的与语言无关的困难;避免parseInt
八进制陷阱。嵌套函数作用域;在
var
您希望避免意外全局变量的范围内使用的必要性;作用域如何用于闭包;在闭合回路问题。全局变量和
window
属性如何冲突;全局变量和文档元素如何在 IE 中不发生冲突而发生冲突;也有必要var
在全局范围内使用以避免这种情况。构造函数、
prototype
属性和new
运算符如何真正起作用;方法利用这个来创建普通的类/子类/实例,你其实是想系统; 当您可能想要使用基于闭包的对象而不是原型设计时。(大多数 JS 教程材料在这方面绝对糟糕;我花了好几年才把它弄清楚。)如何
this
在调用时确定,不受约束;因此,方法传递如何不像您对其他语言所期望的那样工作;如何关闭或Function#bind
可以用来解决这个问题。其他 ECMAScript 第五版功能,如
indexOf
,forEach
以及 上的函数式编程方法Array
;如何修复旧浏览器以确保您可以使用它们;将它们与内联匿名函数表达式一起使用以获得紧凑、可读的代码。浏览器和用户代码之间的控制流程;同步和异步执行;在控制流(例如焦点)内触发的事件与控制返回时发生的事件和超时;如何调用一个所谓的同步内置
alert
函数最终会导致潜在的灾难性重入。跨窗口脚本如何影响
instanceof
;跨窗口脚本如何影响跨不同文档的控制流;postMessage
希望如何解决这个问题。
请参阅有关最后两项的答案。
最重要的是,您应该批判性地看待 JavaScript,承认由于历史原因,它是一种不完美的语言(甚至比大多数语言都多),并避免其最严重的问题。Crockford 在这方面的工作绝对值得一读(尽管我并不 100% 同意他的“好部分”)。
它可以被禁用。
理解用 Crockford 的Javascript: The Good Parts编写的东西是一个很好的假设,即一个人是一个体面的 JS 程序员。
您几乎可以知道如何使用像 JQuery 这样的好库,但仍然不知道 Javascript 的隐藏部分。
另一个注意事项是各种浏览器上的调试工具。JS 程序员应该知道如何在不同的浏览器中调试他的代码。
哦!并且知道 JSLint 会完全伤害你的感情!!
如果您想成为一名真正的 JavaScript 忍者,您应该知道Perfection kills JavaScript Quiz 中每个问题的答案。
一个让你胃口大开的例子:
(function f(f){
return typeof f();
})(function(){ return 1; });
这个表达式返回什么?
- “数字”
- “不明确的”
- “功能”
- 错误
如果你不知道,你就不会知道 JavaScript:
- 关闭
- 基于原型的继承
- module模式
- W3C-DOM
- 事件如何运作