每个JavaScript程序员应该知道什么?
是否有一套JavaScript程序员应该知道能够说“我知道JavaScript”?
不是jQuery。 不YUI。 不(等等)
框架可能是有用的,但是它们经常隐藏有关JavaScript和DOM实际上从你那里工作的有时非常丑陋的细节。 如果你的目标是能够说“我懂JavaScript”,那么在一个框架中投入大量时间是相反的。
以下是一些JavaScript语言特性,您应该知道它们正在做什么,不会被抓到,但是对于很多人来说这些特性并不是很明显:
-
那
object.prop
和object['prop']
是一样的东西(所以你可以停止使用eval
,谢谢); 该对象的属性总是string(即使是数组); 什么for
…in
是 什么不是 )。 -
物业嗅探; 什么是
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如
indexOf
,forEach
和Array
上的函数式编程方法 ; 如何修复旧的浏览器,以确保您可以使用它们; 使用它们与内联匿名函数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:
- closures
- 基于原型的inheritance
- 模块模式
- W3C-DOM
- 事件如何运作
..that JavaScript不是Java 🙂
很多人从网站开发开始就告诉我,javascript只是简单的java!
-
熟悉至less一个Javascript库(Jquery,Prototype等)。
-
学习如何使用主要浏览器的debugging工具(MSIE 7-8,Firefox,Chrome,Safari)
-
阅读行业:道格拉斯克罗克福德的网站是一个宝藏,而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”:
- JavaScript是好的,但DOM是一个痛点
- 跨浏览器问题可以让你发疯
- 除非在至less4个不同的好浏览器上testing代码,否则你不能说它的bug是免费的
- closures …………..必须知道
- 它的原型基于 ………..不错的一个很好玩的学习这个
- 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。 所以我觉得这两个问题也同样不相干。
JSLint http://www.JSLint.com/
阅读了以上所有内容,通过使用像jQuery这样的框架来学习Javascript也是非常好的 。 事实上,这是许多人首先selectJS的第一种方式。 不要羞愧。
arrays 。 length
方法不是数组项的数量,而是最高的索引。 即使该项目设置为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
- 知道有和没有
with()
的生活和在哪里画线。 - 您可以使用
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项目可能会以更方便的方式进行开发。