每个 JavaScript 程序员都应该知道什么?

IT技术 javascript programming-languages
2021-01-27 19:43:12

是否有一套每个 JavaScript 程序员都应该知道的东西才能说“我知道 JavaScript”?

6个回答

不是 jQuery。不是 YUI。不是(等等等等)

框架可能很有用,但它们往往隐藏了 JavaScript 和 DOM 实际如何工作的有时很难看的细节。如果您的目标是能够说“我知道 JavaScript”,那么在框架上投入大量时间与此相反。

这里有一些 JavaScript 语言的特性,你应该知道它在做什么并且不会被发现,但对很多人来说并不是很明显:

  • object.propobject['prop']是一样的东西(所以你能不能停止使用eval,谢谢);对象属性始终是字符串(即使对于数组也是如此);什么for......in是为了(以及它不是什么)。

  • 属性嗅探;是什么undefined(以及为什么有气味);为什么看似鲜为人知的in运算符是有益的,并且与typeof/undefined检查不同hasOwnProperty; 的目的delete

  • Number数据类型是一个真正的浮动; 使用浮动的与语言无关的困难;避免parseInt八进制陷阱。

  • 嵌套函数作用域;var您希望避免意外全局变量的范围内使用的必要性作用域如何用于闭包;闭合回路问题

  • 全局变量和window属性如何冲突;全局变量和文档元素如何在 IE 中不发生冲突而发生冲突;也有必要var在全局范围内使用以避免这种情况。

  • function语句如何在其前面的代码之前提升”一个定义;函数语句和函数表达式的区别;为什么不应使用命名函数表达式

  • 构造函数、prototype属性和new运算符如何真正起作用;方法利用这个来创建普通的类/子类/实例,你其实是想系统; 当您可能想要使用基于闭包的对象而不是原型设计时。(大多数 JS 教程材料在这方面绝对糟糕;我花了好几年才把它弄清楚。)

  • 如何this在调用时确定,不受约束;因此,方法传递如何不像您对其他语言所期望的那样工作如何关闭或Function#bind可以用来解决这个问题。

  • 其他 ECMAScript 第五版功能,如indexOfforEach以及 上的函数式编程方法Array如何修复旧浏览器以确保您可以使用它们;将它们与内联匿名函数表达式一起使用以获得紧凑、可读的代码。

  • 浏览器和用户代码之间的控制流程;同步和异步执行;在控制流(例如焦点)内触发的事件与控制返回时发生的事件和超时;如何调用一个所谓的同步内置alert函数最终会导致潜在的灾难性重入。

  • 跨窗口脚本如何影响instanceof跨窗口脚本如何影响跨不同文档的控制流;postMessage希望如何解决这个问题。

请参阅有关最后两项的答案

最重要的是,您应该批判性地看待 JavaScript,承认由于历史原因,它是一种不完美的语言(甚至比大多数语言都多),并避免其最严重的问题。Crockford 在这方面的工作绝对值得一读(尽管我并不 100% 同意他的“好部分”)。

啊哈,终于有一个深思熟虑的,彻底的答案。如果我可以+10,我会的。了解框架并不意味着您可以有效地编写 JavaScript。
2021-03-18 19:43:12
Sir Psycho:请注意,这个答案都没有提到 DOM,这是大型库可以帮助您的。框架不能保护您免受这里提到的任何事情的影响这些东西对于任何使用框架或不使用框架进行浏览器脚本编写的人来说都很重要。
2021-04-07 19:43:12
非常感谢这个深思熟虑的答案。我想补充一点,如果您知道框架是如何完成的,那么使用框架会非常有益。在求助于框架之前,您应该学会自己做这些事情。
2021-04-09 19:43:12
@Daniel:实际上并非如此,this无论您以何种方式访问​​它都受到约束。试试看:var o= {b: function(){alert(this===o);}};,然后o['b']();-> true如果你真的很奇怪,(o['b'])()-> true,但是(c= o['b'])()-> false,并且仅在 Mozilla 中,(true? o['b'] : null)()-> trueW、T,事实上,F。
2021-04-12 19:43:12
多棒啊!并不是说了解所有不同的浏览器怪癖会让您成为更好的 JS 编码员。也许在你的同龄人中更多的街头信誉......抽象使生活更轻松,并且是 JS 的重要组成部分,所以我想说,与那些不知道并且想要长期做事的人相比,了解一个框架会让你成为一个更好的 JS 编码员。
2021-04-12 19:43:12

它可以被禁用。

+1。一个没有 JavaScript 就无法工作的页面是一个即使启用了 JS 也会脆弱的页面。
2021-03-24 19:43:12
+1,我厌倦了那些甚至连优雅降级的基础知识都不关心的页面,因为“这太难了,无论如何每个人都启用了 javascript”。
2021-03-31 19:43:12
@iconiK 我会去告诉我所有出于安全原因在全球范围内禁用 JavaScript 的政府客户,他们都是白痴,对吗?
2021-04-02 19:43:12
@TM,不,这确实是一个重要的考虑因素。这应该是您在将值插入数据库之前测试值或通过花哨的 javascript 弹出框登录您的网站的唯一方法时的首要考虑。说起来……我想我需要去检查一下。
2021-04-05 19:43:12
-1 这是题外话,与了解 javascript 作为一种语言没有任何关系。在设计 Web 应用程序时考虑这是一件好事,但它仍然不是属于该线程的答案。
2021-04-08 19:43:12

理解用 Crockford 的Javascript: The Good Parts编写的东西是一个很好的假设,即一个人是一个体面的 JS 程序员。

您几乎可以知道如何使用像 JQuery 这样的好库,但仍然不知道 Javascript 的隐藏部分。

另一个注意事项是各种浏览器上的调试工具。JS 程序员应该知道如何在不同的浏览器中调试他的代码。

哦!并且知道 JSLint 会完全伤害你的感情!!

+1 一直忘记那本书,极好的推荐。
2021-03-16 19:43:12
+1 - 当您尝试为具有零嵌入式调试支持(Siebel,PDF)的框架开发 JS 时,JSLint 是一件很棒的事情
2021-03-19 19:43:12
developer.yahoo.com/yui/theater上也有很多有启发性和洞察力的 Crockford 视频- 我想我不需要提到crockfordfacts.com :-)
2021-04-09 19:43:12

如果您想成为一名真正的 JavaScript 忍者,您应该知道Perfection kills JavaScript Quiz 中每个问题的答案

一个让你胃口大开的例子:

(function f(f){ 
  return typeof f(); 
})(function(){ return 1; });

这个表达式返回什么?

  • “数字”
  • “不明确的”
  • “功能”
  • 错误
看看我的回答:codingspot.com/2010/02/...
2021-03-14 19:43:12
@CMS 非常好!你第一次真的没问题吗,或者这包括一些研究吗?
2021-03-18 19:43:12
Skilldrick:我想我第一次就知道了,我是 ECMA-262 标准的常客(我知道,我是个怪胎:-)
2021-04-01 19:43:12

如果你不知道,你就不会知道 JavaScript:

  1. 关闭
  2. 基于原型的继承
  3. module模式
  4. W3C-DOM
  5. 事件如何运作
我真的很喜欢这个答案。它可以帮助您发现知识中的黑暗区域。在这个清单中,事件是唯一对我来说仍然有点模糊的东西(如果module模式意味着“不要破坏全局命名空间”,因此包括范围和 var 运算符)。
2021-03-28 19:43:12
我会争辩说You don't know JavaScript if you don't know The W3C-DOM这两件事是不同的。
2021-04-09 19:43:12