What should every JavaScript programmer know?
每个javascript程序员都应该知道一套可以说"我知道javascript"的东西吗?
不是jQuery。不是YUI。不(等)
框架可能是有用的,但它们常常隐藏了JavaScript和DOM如何实际工作的一些有时不好的细节。如果你的目标是能够说"我知道javascript",那么在框架中投入大量时间是反对的。
下面是一些你应该知道的javascript语言特性,它们可以让你摸索它在做什么,而不会被人发现,但对很多人来说,这并不是显而易见的:
object.prop 和object['prop'] 是一样的(所以请停止使用eval ,谢谢);对象属性始终是字符串(甚至是数组);for …in 是用来(而不是用来)的。财产嗅探;
undefined 是什么(以及它为什么有气味);为什么看似不为人所知的in 操作员是有益的,并且与typeof /undefined 检查不同;hasOwnProperty ;delete 的目的。Number 数据类型实际上是一个float;使用float的语言独立困难;避免parseInt 八进制陷阱。嵌套函数作用域;在要避免意外全局的作用域中使用
var 的必要性;作用域如何用于闭包;闭包循环问题。全局变量和
window 属性如何冲突;全局变量和文档元素如何不应该冲突,而应该在ie中进行;在全局范围内使用var 的必要性也避免了这一点。function 语句如何"提升"其前面代码之前的定义;函数语句和函数表达式之间的差异;为什么不应使用命名函数表达式。构造器如何工作,
prototype 属性和new 运算符真正起作用;利用它创建实际需要的普通类/子类/实例系统的方法;何时可能希望使用基于闭包的对象而不是原型化。(大多数JS教程的材料在这方面都非常糟糕;我花了很多年才把它弄清楚。)this 是如何在调用时确定的,而不是如何绑定的;因此方法传递如何不像其他语言那样工作;如何使用闭包或Function#bind 来绕过这一点。其他EcmaScript第五版功能,如
indexOf 、forEach 和Array 上的函数编程方法;如何修复旧浏览器以确保您可以使用它们;将它们与内联匿名函数表达式一起使用以获得紧凑、可读的代码。浏览器和用户代码之间的控制流;同步和异步执行;在控制流内部触发的事件(如焦点)与控制返回时发生的事件和超时;调用像
alert 这样假定的同步内置项如何可能导致灾难性的重入。跨窗口脚本如何影响
instanceof ;跨窗口脚本如何影响跨不同文档的控制流;postMessage 将如何解决这一问题。
请参阅最后两项的答案。
最重要的是,您应该批判地查看JavaScript,承认它是一种不完美的语言(甚至比大多数语言都要多),并避免它最糟糕的麻烦点。克罗克福德在这方面的工作绝对值得一读(尽管我不完全同意他的"好部分"是什么)。
它可以被禁用。
理解用Crockford的javascript编写的东西:好的部分是一个相当好的假设,即一个人是一个优秀的JS程序员。
你几乎可以知道如何使用一个好的库,比如jquery,但仍然不知道javascript的隐藏部分。
另一个注意事项是在各种浏览器上调试工具。JS程序员应该知道如何在不同的浏览器中调试他的代码。
哦!而知道杰斯林会完全伤害你的感情!!
如果你想成为一个真正的javascript忍者,你应该知道完美杀死javascript测试中每个问题的答案。
激发食欲的一个例子:
1 2 3 | (function f(f){ return typeof f(); })(function(){ return 1; }); |
What does this expression return?
- "number"
- "undefined"
- "function"
- Error
如果你不知道,你就不知道javascript:
……JavaScript不是Java:
很多人从网站开发开始就告诉我JavaScript只是简单的Java!
至少熟悉一个javascript库(jquery、原型等)。
了解如何使用主要浏览器的调试工具(MSIE 7-8、Firefox、Chrome、Safari)
阅读业内消息:道格拉斯·克罗克福德的网站是一个宝库,而Ajaxian.com是一个很好的博客,可以跟上新的、有趣的或古怪的javascript想法。还有很多其他资源,但这些资源对我帮助最大。
javascript对象和作为第一类公民的功能,回调,不要忘记事件,然后jquery。
Javascript不是一个小时就能学会的东西!
除非声明为本地变量,否则变量是全局变量!!
错误(DoSomething()只调用了10次):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | function CountToTen() { for(i=0; i< 10; i++) { DoSomething(i); } } function countToFive() { for(i=0; i<5; i++) { CountToTen(); } } CountToFive(); |
好(dosomething()按预期调用50次):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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最初被称为LIFEScript,而"Java"前缀是为了营销目的而附加的,这不是因为Java和JavaScript是相关的(它们不是)。
哦,对于拥有任何版本的大卫·弗拉纳根的《javascript:权威指南》(此信息在第2页上)。
…感谢那些之前试图混淆Internet Explorer 4的文档.all[]和Netscape Navigator 4的文档.layers[]的人,在jquery之类的东西消除了痛苦。
编辑:
正如Kinopiko指出的,JavaScript最初被称为Project MoCa(一些源还认为它被称为项目LIVELoad),但是人们普遍认为,在1996年初发布的Java前缀被采纳之前,该语言(布兰登·艾奇编写的)被定义为LIFEScript。
要说"我知道javascript",应该注意以下几点:
每个javascript编码人员都应该知道什么?
怎么样,我可以通过两次单击关闭您的工作。因此,如果可能,请提供回退。
这个javascript与其他语言的差异比你想象的要大得多。观看这场伟大的谷歌科技谈话,获得一个印象:http://www.youtube.com/watch?V=HqvTijbZok
如果您能有效地使用数组、数字、字符串、日期和对象,您就知道JavaScript了。数学和regexp的加分。您应该能够编写函数和使用变量(在正确的范围内,即作为对象的"方法")。
我看到一些关于知道闭包、冗长的函数语法、blablabla的评论。这与这个问题完全无关。这就好比说,如果你能在11秒内跑完100米,你就是一个跑步者。
我说,要精通JavaScript可能需要几周时间。在那之后,要成为一名专家、忍者等需要数年、数十本书和数千行程序。
但这不是问题。
噢,dom不是javascript的一部分,jquery也不是。所以我认为这两个问题也同样无关。
我强烈推荐阅读javascript:好的部分
读完以上所有内容后,使用jquery这样的框架学习javascript也是非常好的。事实上,这是很多人第一次使用JS的第一种方式。没什么可耻的。
array.
1 2 3 4 5 6 7 | var a = []; a.length; // === 0 a[10]; // === undefined a[10] = undefined; a.length; // === 11 a.pop(); // === undefined a.length; // === 10 |
这种行为很难与语言设计错误区分开来。
jslint网址:http://www.jslint.com/
jquery是我最好的建议。不仅对于代码本身,最值得效仿的是习惯用法、风格和背后的思想。
Javascript是世界上部署最广泛的语言。(可能)
学好一门语言,了解它的各种怪癖,都来自(多年)的经验。如果你想成为一个更好的程序员,我会说,理解设计模式,如何和何时使用它们,甚至当你在使用它们时,却没有意识到它;技术架构和用户体验。
了解(javascript)语言意味着您可以随意选择并使用任何框架。您将不可避免地需要深入到源代码中,如果您所知道的只是语法A框架或2或3,那么您将不会走得太远。这么说来,了解几个不同框架的源代码可能是了解如何使用JavaScript的最佳方法之一。通过在Firebug或WebInspector中逐步浏览代码,然后检查JavaScript文档,尤其是Mozilla和WebKit文档,来进一步了解您所看到的内容。
了解面向对象编程和功能编程之间的区别,javascript是两者的性感组合,以及何时以及如何使用两者创建杀手级的代码库和出色的应用程序将使您成为更好的javascript程序员。
简单地阅读一些书籍,尤其是Crockford的"好的部分",这仅仅是他对javascript中好的部分的看法,而跳过javascript中的大部分精彩部分会让你走错路。
另一方面,通过查看像ThomasFuchs这样的人编写的代码,您将更深入地了解编写令人惊叹且高效的JavaScript的能力。
尝试记忆几个gotcha或wtfs也不会有太大帮助,如果你开始编码并逐步浏览库/框架的代码,特别是一个有帮助的注释代码,你会发现它们为什么使用了某些属性/值,而不是其他的,为什么以及当使用特定的操作数和运算符是好的时候,这些都在那里。在框架的代码中人们使用。有什么比以身作则更好呢?^)
在JavaScript中,性能很重要。
没有一个智能编译器来优化代码,所以在编写JavaScript代码时要比C语言、Java语言更仔细。
对象文本,因为它们写起来很好。
以下事项也很重要:
1)变吊。2)作用域链和激活对象。
然后像这样的事情::)
3)WTFJS.com
4)一切都是一个对象http://www.lifeinafolder.com/images/js.jpg
javascript不支持像下面的代码那样用换行符分隔返回关键字和返回语句(或在我的jsFiddle页面中尝试)。
1 2 3 4 5 6 7 8 9 10 11 12 | function foo() { return { bar: 'something' }; } $(function() { document.write(foo()); }); |
我不明白为什么javascript不支持这种样式,因为与默认的javascript样式相比,它更容易读取非常复杂的javascript源代码。
我已经写了将近6年的javascript。但是我在尝试执行以下函数时发现了这个bug。它总是返回未定义的。当我使用调试器并单步执行此函数时,一切都正常工作。我认为这应该是我生命中最糟糕的编程错误。
1 2 3 4 5 6 7 8 9 10 11 12 | function JqGridInlineEditor_GenerateTool(cellvalue, options, rowObject, disableEdit, disableDelete) { return (!disableEdit ? '<img src="{1}" alt="{2}" />'.format(options.rowId, getUrl('~/Content/Icons/Edit.gif'), 'Click here to Edit or Double-click row to edit.') : '') + (!disableDelete ? '<img src="{1}" alt="{2}" />'.format(options.rowId, getUrl('~/Content/Icons/Delete.png'), 'Click here to Delete or Select row and then press Delete') : '') + (!disableEdit ? '<img src="{1}" alt="{2}" />'.format(options.rowId, getUrl('~/Content/Icons/Save.png'), 'Click here to Save or Press Enter') : '') + (!disableEdit ? '<img src="{1}" alt="{2}" />'.format(options.rowId, getUrl('~/Content/Icons/Cancel.png'), 'Click here to Cancel or Press Esc') : ''); } |
因为JS是一种功能性语言,一个优秀的JS程序员必须能够编写Y组合器并解释它是如何工作的。
…关于GoogleWebToolkit,这意味着你的javascript项目可以以一种更为方便的方式开发。