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

是否有一套JavaScript程序员应该知道能够说“我知道JavaScript”?

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

框架可能是有用的,但是它们经常隐藏有关JavaScript和DOM实际上从你那里工作的有时非常丑陋的细节。 如果你的目标是能够说“我懂JavaScript”,那么在一个框架中投入大量时间是相反的。

以下是一些JavaScript语言特性,您应该知道它们正在做什么,不会被抓到,但是对于很多人来说这些特性并不是很明显:

  • object.propobject['prop']是一样的东西(所以你可以停止使用eval ,谢谢); 该对象的属性总是string(即使是数组); 什么forin是 什么不是 )。

  • 物业嗅探; 什么是undefined的( 为什么它闻起来 ); 为什么看起来不太知名in运营商是有益的,与typeof / undefined检查不同; hasOwnProperty ; delete的目的。

  • Number数据types实际上是一个浮点数; 使用花车的语言无关的困难; 避免parseInt八进制陷阱。

  • 嵌套函数范围; 在想要避免意外全局的范围内使用var的必要性; 如何范围可以用于closures; 闭环问题 。

  • 全局variables和window属性如何碰撞; 全局variables和文档元素不应该如何碰撞,而是在IE中执行; 避免在全球范围内使用var的必要性。

  • function声明如何在代码之前“ 提升 ”定义; 函数语句和函数expression式的区别; 为什么命名的函数expression式不应该被使用 。

  • 如何构造函数, prototype属性和new运营商真正的工作; 方法利用这个来创build你想要的正常的类/子类/实例系统; 当你可能想使用基于闭包的对象而不是原型。 (大多数JS教程资料在这方面是绝对可怕的,花了我好几年才弄清楚了。)

  • this是如何在通话时间确定的,而不是受限制的; 如何因此方法传递不像你期望从其他语言工作; 如何closures或Function#bind可能会被用来解决这个问题。

  • 其他ECMAScript第五版的function如indexOfforEachArray上的函数式编程方法 ; 如何修复旧的浏览器,以确保您可以使用它们; 使用它们与内联匿名函数expression式来获得紧凑的,可读的代码。

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

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

看到这个答案关于最后两个项目。

最重要的是,你应该批判性地观看JavaScript,承认由于历史原因,语言不完善(甚至比大多数语言更多),并避免最糟糕的麻烦点。 克罗克福德在这方面的工作绝对值得一读(尽pipe我不完全同意他的“好作品”)。

它可以被禁用。

了解用Crockford的Javascript编写的东西:好的部分是一个很好的假设,一个人是一个体面的JS程序员。

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

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

哦! 而知道JSLint将完全伤害你的感觉!

如果你想成为一个真正的JavaScript忍者,你应该知道在完美杀死JavaScript测验每个问题的答案。

一个例子来激发你的胃口:

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

这个expression式返回什么?

  • “数”
  • “不确定”
  • “function”
  • 错误

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

  1. closures
  2. 基于原型的inheritance
  3. 模块模式
  4. W3C-DOM
  5. 事件如何运作

..that JavaScript不是Java 🙂

很多人从网站开发开始就告诉我,javascript只是简单的java!

  1. 熟悉至less一个Javascript库(Jquery,Prototype等)。

  2. 学习如何使用主要浏览器的debugging工具(MSIE 7-8,Firefox,Chrome,Safari)

  3. 阅读行业:道格拉斯克罗克福德的网站是一个宝藏,而Ajaxian.com是一个很好的博客,以保持对Javascript新的,有趣的,或奇怪的想法。 还有其他一些资源,但那些对我最有帮助。

Javascript 对象和函数作为一等公民callback ,不要忘记事件 ,然后JQuery

那Javascript是不是可以在一小时内学会的东西!

variables是全球性的,除非声明为本地!

坏(DoSomething()只被称为10次):

 function CountToTen() { for(i=0; i< 10; i++) { DoSomething(i); } } function countToFive() { for(i=0; i<5; i++) { CountToTen(); } } CountToFive(); 

好(DoSomething()被调用50次):

 function CountToTen() { var i; for(i=0; i< 10; i++) { DoSomething(i); } } function countToFive() { var i; for(i=0; i<5; i++) { CountToTen(); } } CountToFive(); 

如何使用好的部件,以及如何避免可怕的部分 。

因为知道Javascript最初被称为LiveScript ,并且“Java”前缀被附加用于营销目的,不是因为Java和Javascript是相关的(他们不是)。

哦,拥有任何版本的David Flanagan的“Javascript:权威指南” (这个信息在第2页)。

…以及欣赏那些之前尝试混淆IE浏览器4的document.all []和Netscape Navigator 4的document.layers []之类的东西之前,Jquery带走了痛苦。

编辑:

正如@Kinopiko所指出的,JavaScript最初被称为摩卡项目( 有些人也认为它被称为项目LiveWire),但人们普遍接受的是,这个语言(由Brendan Eich编写)预定在Java前缀被采用之前作为LiveScript发布在1996年初发布。

一个人应该知道以下说“我知道JavaScript”:

  1. JavaScript是好的,但DOM是一个痛点
  2. 跨浏览器问题可以让你发疯
  3. 除非在至less4个不同的好浏览器上testing代码,否则你不能说它的bug是免费的
  4. closures …………..必须知道
  5. 它的原型基于 ………..不错的一个很好玩的学习这个
  6. debugging器关键字…..帮助危机

这个JavaScript和其他语言比你想像的要差很多。 观看这个伟大的Google技术讲座,获得一个印象: http : //www.youtube.com/watch?v=hQVTIJBZook

每个JavaScript编码器应该知道什么?

如何,我可以closures你的努力,点击两下。 所以如果可能的话提供一个回退。

我强烈build议阅读Javascript:好的部分

如果你可以有效地使用数组,数字,string,date和对象,你就知道了JavaScript。 Math和RegExp的加分。 你应该能够编写函数和使用variables(在正确的范围内,即作为对象的“方法”)。

我看到关于知道闭包,奢侈函数语法,blabla的一些意见。 所有这些对于这个问题来说都是毫不相干的。 如果你能在11秒内跑完100米短跑,就好像说你是一名跑步者。

我说这可能需要几个星期才能熟练使用javascript。 之后,需要数十年的时间,几十本书和数千行编程才能成为专家,忍者等等。

但这不是问题。

呵呵,DOM不是javascript的一部分,也不是jQuery。 所以我觉得这两个问题也同样不相干。

阅读了以上所有内容,通过使用像jQuery这样的框架来学习Javascript也是非常好的 。 事实上,这是许多人首先selectJS的第一种方式。 不要羞愧。

arrayslength方法不是数组项的数量,而是最高的索引。 即使该项目设置为undefined

 var a = []; a.length; // === 0 a[10]; // === undefined a[10] = undefined; a.length; // === 11 a.pop(); // === undefined a.length; // === 10 

这种行为很难从语言devise错误中区分出来。

jQuery将是我最好的build议。 不仅仅是代码本身,它的成语,风格和背后的思想是最值得仿效的。

这个javascript是世界上使用最广泛的语言。 (大概)

学好一门语言,理解它的各种怪癖来自(多年)的经验。 如果你想成为一个更好的程序员,我会说,理解devise模式,如何以及何时使用它们和/或甚至在你没有意识到的情况下使用它们; 技术架构和用户体验。

了解(JavaScript)语言意味着您可以select任何框架并随意使用它。 你将不可避免地需要潜入源代码,如果你知道的只是一个框架或2或3的语法,那么你就不会走得太远。 在说,进入几个不同的框架的源代码可能是最好的方法之一,看看如何使用JavaScript。 通过逐步浏览Firebug或Web Inspector中的代码,然后检查JavaScript文档(尤其是Mozilla和Webkit文档)来了解您正在查看的内容。

理解面向对象和函数式编程之间的区别,JavaScript是两者的性感组合,何时以及如何使用这两者来创build一个杀手级的代码库和令人敬畏的应用程序将使您成为一个更好的JavaScript程序员。

简单地阅读一些书籍,尤其是Crockford的“好的部分”,它只是提出他对JavaScript中的好东西的看法,而跳过JavaScript的绝大部分优秀的部分将会让你走错路。

另一方面,检查由Thomas Fuchs这样的人编写的代码,将使您更深入地了解编写惊人而高效的JavaScript的强大function。

试着记住一些小问题或者WTF也不会有太大的帮助,如果你开始编码,并通过一个库/框架的代码,特别是一个有帮助的评论,你会select它,看看为什么他们使用某些属性/值而不是别人为什么和什么时候使用特定的操作数和操作符是好的,这些都在框架的人们使用的代码中。 比通过例子学习更好吗? :^)

在Javascript中,性能很重要。

没有一个智能的编译器来优化你的代码,所以在编写JavaScript代码的时候应该比C#,Java等语言更加小心。

对象文字,因为他们写得很好。

以下几点也很重要:

1)variables提升。 2)范围链和激活对象。

然后像这样的东西:)

3) wtfjs.com

4) 一切都是一个对象http://www.lifeinafolder.comhttp://img.dovov.comJs.jpg

  1. 知道有和没有with()的生活和在哪里画线。
  2. 您可以使用throw语句创build自定义错误,以有意停止JavaScript运行时。

JavaScript是不支持分隔返回关键字和返回语句与换行符如下面的代码(或尝试在我的jsFiddle页面 )

 function foo() { return { bar: 'something' }; } $(function() { document.write(foo()); }); 

我不明白为什么JavaScript不支持这种风格,因为与默认的JavaScript风格相比,阅读非常复杂的JavaScript源代码要容易得多。

PS。 我写了近6年的JavaScript。 但是当我尝试执行下面的函数时,我只是发现了这个bug。 它总是返回undefined。 当我使用debugging器,并进入这个function一切工作正常。 我认为这应该是我生命中最糟糕的编程错误。

 function JqGridInlineEditor_GenerateTool(cellvalue, options, rowObject, disableEdit, disableDelete) { return (!disableEdit ? '<a class="button edit" href="javascript: void(0);" onclick="JqGridInlineEditor_EditRow(this, \'{0}\');return false;" title="{2}"><img src="{1}" alt="{2}" /></a>'.format(options.rowId, getUrl('~/Content/Icons/Edit.gif'), 'Click here to Edit or \nDouble-click row to edit.') : '') + (!disableDelete ? '<a class="button delete" href="javascript: void(0);" onclick="JqGridInlineEditor_DeleteRow(this, \'{0}\');return false;" title="{2}"><img src="{1}" alt="{2}" /></a>'.format(options.rowId, getUrl('~/Content/Icons/Delete.png'), 'Click here to Delete or \nSelect row and then press Delete') : '') + (!disableEdit ? '<a class="button save" style="display:none" href="javascript: void(0);" onclick="JqGridInlineEditor_SaveRow(this, \'{0}\');return false;" title="{2}"><img src="{1}" alt="{2}" /></a>'.format(options.rowId, getUrl('~/Content/Icons/Save.png'), 'Click here to Save or \nPress Enter') : '') + (!disableEdit ? '<a class="button cancel" style="display:none" href="javascript: void(0);" onclick="JqGridInlineEditor_RestoreRow(this, \'{0}\');return false;" title="{2}"><img src="{1}" alt="{2}" /></a>'.format(options.rowId, getUrl('~/Content/Icons/Cancel.png'), 'Click here to Cancel or \nPress Esc') : ''); } 

由于JS是一种function性的语言,一个体面的JS程序员必须能够编写Y-combinator并解释它如何在头顶工作。

…关于Google Web Toolkit ,这意味着您的JavaScript项目可能会以更方便的方式进行开发。