每个JavaScript程序员应该知道什么?[关闭]


368

每个JavaScript程序员都应该具备能够说“我知道JavaScript”的东西吗?

Answers:


590

不是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,并承认由于历史原因,它是一种不完善的语言(甚至比大多数语言还多),并且避免了最糟糕的麻烦。克罗克福德在这方面的工作绝对值得一读(尽管我并不100%同意他所说的“好零件”)。


80
终于有了一个深思熟虑的彻底答案。如果我能+10,我会。了解框架并不意味着您可以有效地编写JavaScript。
Tim Down'4

6
非常感谢您的深思熟虑的答案。我想补充一点,如果您知道框架是如何完成的,那么使用框架会非常有益。在采用框架之前,您应该学会自己做这些事情。
哈维尔·帕拉

4
@Daniel:实际上并非如此,this无论您使用哪种方式绑定它。尝试:var o= {b: function(){alert(this===o);}};,然后o['b']();-> true。而且,如果您真的想要怪异,(o['b'])()-> true,但是(c= o['b'])()-> false,仅在Mozilla中,(true? o['b'] : null)()-> true。W,T,而事实上,F
bobince

7
真是太可笑了!并不是知道所有不同的浏览器怪癖都会使您成为更好的JS编码器。也许您的同龄人之间会有更多的街头信誉。
文斯·潘努乔

19
Psycho爵士:请注意,这个答案都没有提到DOM,这是大型图书馆可以为您提供帮助的内容。框架无法保护您免受此处提到的任何事情的影响。这对于无论是否使用框架都进行浏览器脚本编写的人员来说都很重要。
Tim Down'4

248

可以禁用它。


12
+1,我感到厌倦了页面,即使页面的正常降级也不会打扰,因为“这太难了,每个人都启用了JavaScript”。
wasatz

27
+1。没有JavaScript的页面是即使启用JS也会脆弱的页面。
bobince 2010年

9
@iconiK我要告诉所有出于安全原因在全球范围内禁用JavaScript的政府客户,他们都是傻瓜,是吗?
graphicdivine 2010年

16
-1这是没有主题的,与了解javascript作为一种语言没有任何关系。设计Web应用程序时要考虑这是一件好事,但这仍然不是该线程中的答案。
TM。

24
@TM,不,这确实是一个重要的考虑因素。在将值插入数据库之前测试它们时,这应该是您的首要考虑事项,或者是通过精美的javascript弹出框登录到您的网站的唯一方法。说到这...。我想我需要去检查一下。
伊丽莎白·巴克沃尔特

75

了解Crockford的Javascript:The Good Parts中的内容是一个很好的假设,即一个人是一个不错的JS程序员。

您几乎可以知道如何使用类似JQuery的良好库,而仍然不知道Javascript的隐藏部分。

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

哦! 而且知道JSLint会完全伤害您的感觉!!


+1忘掉那本书,很好的推荐。
David

8
developer.yahoo.com/yui/theater上也有很多具有启发性和见解的Crockford视频-我想我不必提crockfordfacts.com :-)
ndim 2010年

+1-当您尝试为具有零嵌入式调试支持的框架(咳嗽 Siebel,咳嗽 PDF)开发JS时,JSLint是一件很棒的事情。
J. Polfer

49

如果您想成为一名真正的JavaScript忍者,则应该了解Perfection Kills JavaScript Quiz中每个问题的答案。

激发食欲的一个例子:

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

此表达式返回什么?

  • “数”
  • “未定义”
  • “功能”
  • 错误

10
看一下我的答案:codingspot.com/2010/02/…–
CMS

@CMS很好!第一次您真的没事吗,还是其中包括一些研究?
Skilldrick

7
Skilldrick:我想我是第一次获得所有信息,我是ECMA-262标准的常识读者(我知道,我很奇怪:-)
CMS 2010年

46

如果您不知道,就不会使用JavaScript:

  1. 关闭
  2. 基于原型的继承
  3. 模块模式
  4. W3C-DOM
  5. 活动如何运作

我真的很喜欢这个答案。它可以帮助您发现知识中的黑暗区域。在此清单中,事件是唯一令我感到困惑的事情(如果模块模式表示“不要破坏全局名称空间”,则包括作用域和var运算符)。
silviot 2010年

11
我会争辩You don't know JavaScript if you don't know The W3C-DOM。两者是不同的。
gblazex

37

..那个javascript不是java :)

很多从网站开发开始的人都告诉我javascript只是简单的Java!


+1这一点很基本!
amelvin '04

71
“ JavaScript对于Java来说就像地毯对汽车一样。”
Josh Lee

1
Javascript与Java差不多,就像C#与C一样。当然,语法看起来有点相似,但是方式却截然不同。
Earlz 2010年

4
除非他们使用Google Web Toolkit
Afriza N. Arief 2010年

有趣的是,Microsoft确实在基于IE3的JScript中将Y2k兼容日期函数基于java.util.Date。
拜亚德·兰德尔

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

  2. 了解如何使用主要浏览器(MSIE 7-8,Firefox,Chrome,Safari)的调试工具

  3. 阅读行业:Douglas Crockford的网站是一个宝库,而Ajaxian.com是一个很好的博客,可以跟上Javascript的新的,有趣的或奇怪的想法。还有许多其他资源,但是这些资源对我的帮助最大。


说真的,为什么要投反对票?
David

+1太多的战术投票,认真的人们应该赞成好的答案,而不仅仅是试图将他们的答案放在首位。
amelvin '04

1
@Murali副总裁我假设在浏览器的上下文中“了解” Javascript。在进行了类似的问候之后,您将需要弄清楚逻辑错误和运行时错误,每个解释器可能会有所不同。如果我不知道如何调试它,我不会声称会使用任何语言。至于框架要求,Javascript有点像早期的C语言,细微的实现差异将破坏人们的头脑。jQuery和prototypejs掩盖了这些差异,并使Javascript成为可靠的工具,同时添加了额外的API调用以提高生产率。(续)
大卫2010年

@Murali副总裁坦白地说,自从90年代我开始使用Java语言以来,Java已经走了很长一段路,除Microsoft外,其他Java解释器在遵循规范和公平竞赛方面都做得非常出色。
David

@David谢谢你的解释。倾向于同意你的看法。
Murali副总裁

24

Javascript 对象和函数充当一等公民,即回调,而不是忘记事件,然后是JQuery


20
啊,jQuery,过度炒作的JS框架!
Murali副总裁


23

除非声明为局部变量,否则变量是全局变量!

错误(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();

2
我什至从未考虑过这一点。很好的一点。
橄榄色

6
我尝试养成for (var i=0;我所有循环的习惯
ghoppe

2
Crockford倾向于将放在var函数的顶部,因为它不会欺骗您变量范围的大小。js2-mode如果您var ifor同一个函数中的两个单独的循环中会抱怨,因为这表明您认为您有两个单独的变量,而您没有。但是,我确实尝试不要将任何var事情与初始化它们的地方分开。
Kragen Javier Sitaker

我不在乎是否没有范围。我不能忍受在使用变量之前声明20行
Juan Mendes 2012年


8

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

哦,并且拥有David Flanagan的“ Javascript:The Definitive Guide”的任何版本(此信息在第2页上)。

...并感谢那些在试图消除Jquery之类的麻烦之前试图混淆Internet Explorer 4的document.all []和Netscape Navigator 4的document.layers []的人。

编辑:

正如@Kinopiko指出的那样,JavaScript最初被称为Project Mocha(一些消息来源也认为它称为Project LiveWire),但人们普遍认为,该语言(由Brendan Eich编写)计划在采用Java前缀之前以LiveScript的形式发布。在1996年初发行。


+1从道格拉斯·克罗克福德(Douglas Crockford)采摘山雀!
gath

1
我以为JavaScript最初称为Mocha?

1
@Kinopiko根据我的David Flanaghan的《 Javascript:权威指南》第3版(1998年6月),它被称为LiveScript。
amelvin '04

@gath学到东西的一天是美好的一天!
amelvin '04

1
@amelvin每天都是上学日。
上校Sponsz

8

应该注意以下几句话:“我知道JavaScript”:

  1. JavaScript不错,但DOM是痛点
  2. 跨浏览器问题可能会让您发疯
  3. 除非在至少4种不同的优秀浏览器上对代码进行了测试,否则不能说没有bug
  4. 关闭 ..............一定要知道
  5. 它的原型基于 ...........不错,学习它很有趣
  6. 调试器关键字.....帮助应对危机

不错的清单,很苗条。我对“ 4”种好的浏览器笑了起来。:)我觉得7号应该是IE浏览器的一个健康的仇恨下8版
希亚姆

@Shyam,是什么让您认为我们不应该对IE8怀有强烈的仇恨?我仍然在IE8中有问题...那只是在IE8中的问题。
Tracker1 2010年

@ Tracker1:总会有问题。猛击我没碰过的浏览器,那会有点不公平。这就是为什么我嘲笑4种优秀的浏览器:“ Firefox,Chrome,Safari和Opera”是我唯一开发的。我停止了对IE的黑客攻击,只是让它运行Fisher Fisher代码,就像禁用JavaScript一样。
Shyam '04


7

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

怎么样,我可以通过单击两次关闭您的工作。因此,如有可能,请提供备用。


您也可以卸载Web浏览器。最近很少有人禁用javascript。那些人可能不需要浏览网络。唯一的例外是网络爬虫需要访问您的公共内容,并且不能依靠JS来访问。
让·文森特

我对提供非JS方式访问事物更感兴趣。我知道有人禁止使用JS进行浏览或使用屏幕阅读器。他们并不总是与JS配合良好。我见过一些网站,这些网站通过ajax提交了一个简单的登录页面,而没有任何回退。没有JS,没有登录。该网站甚至不使用太多JS,仅用于提交表单。
Khainestar 2011年

我相信,像您暗示的那样有意禁用JS的用户在今天非常罕见,肯定比十年前少了很多。这就是为什么我不明白为什么我们应该为那些根本不想访问您的网站的人设计两次网站的原因。那么在您的示例中,他们无法登录,那又如何呢?另一件事是,没有JS,绝对不可能设计现代站点。
Jean Vincent


6

您知道javascript是否可以有效使用数组,数字,字符串,日期和对象。加上Math和RegExp的分数。您应该能够编写函数并使用变量(在正确的范围内,即作为对象的“方法”)。

我看到一些有关了解闭包,奢侈的函数语法,等等的评论。所有这些与这个问题都没有关系。这就像说如果您可以在11秒内跑完100m短跑,您就是赛跑者。

我说精通javascript可能需要几个星期。之后,要成为专家,忍者等人,需要花费数年时间,数十本书和数千行编程。

但这不是问题。

哦,DOM不是javascript的一部分,jQuery也不是。因此,我认为两者同样与这个问题无关。


1
不管您是否在乎,都存在封闭。它功能强大,但很容易被滥用。如果您不知道该语言的工作原理,那么您将不知道该语言。
gblazex

除了封危害可引起,如内存泄漏,特别是我们真正的朋友的Internet Explorer 6
马塞尔Korpel


4

阅读了以上所有内容之后,通过使用类似jQuery的框架来学习Javascript 也非常好。事实是,这是许多人首先选择JS的第一种方法。没什么可耻的。


4

数组length方法不是数组项的计数,而是最高索引。即使将项目设置为undefined

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

这种行为很难与语言设计错误区分开。


3

jQuery是我最好的建议。不只是代码本身,最​​值得模仿的是惯用法,样式和背后的思想。


2
+1 jQuery彻底改变了我对javascript的使用。
amelvin '04

1
好的论点概述。扩展将是一个很好的答案。
Donal Fellows 2010年

jQuery强制您进入过程模式。我更喜欢写OO JS
Juan Mendes

面向对象没有什么神奇的。我宁愿使用John Resig设计的框架,并由成千上万的其他开发人员使用,而不管您或我写的任何内容如何,​​无论使用哪种模式。
duffymo

3

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


8
部署最广泛的母语是普通话。知道这会让你成为普通话吗?知道这个事实甚至与您对语言的掌握有关系吗?
Zano

11
世界上使用最广泛的语言是控制细胞内蛋白质合成的DNA遗传密码。
埃内利2010年

在使用普通话和脱氧核糖核酸之前,必须首先使用“爱”的语言:因此,它赢得了胜利。AM!
Christopher

3

真正的学习语言并理解其各种怪癖来自(多年的)经验。如果您想成为一个更好的程序员,我想说的是,了解设计模式,如何以及何时使用它们,和/或什至在没有意识到的情况下使用它们。技术架构和用户体验。

知道(JavaScript)语言意味着您可以选择任何框架并随意使用。您将不可避免地需要深入研究源代码,并且如果您只知道语法是框架还是2或3,那么您将走得很远。话虽如此,进入几个不同框架的源代码可能是了解如何使用JavaScript的最佳方法之一。逐步解决Firebug或Web Inspector中的代码,然后检查JavaScript文档,尤其是Mozilla和Webkit文档,以进一步了解您正在查看的内容。

了解面向对象编程和函数式编程之间的区别,JavaScript是两者的完美结合,何时以及如何使用它们来创建杀手级代码库和出色的应用程序将使您成为更好的JavaScript程序员。

只需阅读一些书,尤其是Crockford的“好书”,只介绍他对JavaScript的优点的看法,而跳过大部分JavaScript的AWESOME部分将使您误入歧途。

另一方面,查看由Thomas Fuchs之类的人编写的代码,将使您对编写出色而高效的JavaScript的力量有更多的了解。

尝试记住一些陷阱或WTF也无济于事,如果您开始编码并逐步浏览库/框架的代码,特别是在注释中有所帮助的代码,就会发现它们的用处,以了解它们为什么使用了某些属性/值,而不是其他原因,以及为什么以及何时使用特定的操作数和运算符比较好,这一切都在框架的人员使用的代码中。有什么比通过榜样学习更好?:^)


+1(不崇拜克罗福德)。我对待他的观点就像在教堂做传教士一样。我尊重他们说的话,但请放心。
Juan Mendes

2

在Javascript中,性能至关重要。

没有智能的编译器可以优化您的代码,因此在编写JavaScript代码时要比C#,Java等语言更加小心。


1
实际上,浏览器编译器非常擅长优化代码。
爱德华多

1
Chrome是非常聪明的优化代码,这个答案是不与所有的新JS引擎真
胡安·门德斯

IE,移动浏览器呢?
caltuntas 2012年



0
  1. 知道有没有有生命,with()在哪里划界。
  2. 您可以使用该throw语句创建自定义错误,以有目的地停止javascript运行时。

-1

JavaScript不支持使用换行符分隔return关键字和return语句,如以下代码(或在我的jsFiddle页面上尝试)

function foo()
{
    return
    {
        bar: 'something'
    };
}

$(function()
{
    document.write(foo());
});

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

PS。我已经写了将近6年的JavaScript。但是,当我尝试执行以下功能时,我只是发现了这个错误。它总是返回未定义的。当我使用调试器并进入此功能时,一切正常。我认为这应该是我一生中最糟糕的编程错误。

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') : '');
}

3
在JavaScript中,换行符通常用作语句的分隔符。仅当不可能结束的语句(例如var foo = "bar" +)解析器读取时。
Marcel Korpel,2010年


2
@Marcel —事实并非如此;例如,这两行var foo = 5-1;将导致foo设置为4,即使它们各自都是有效的语句也是如此。
本·布兰克

4
这是因为该语言会自动将分号插入到单独的语句中。这是该语言的陷阱。您的return语句将转换为以下形式:return; {key:value,}为避免此问题,应采用将分号放在同一行中的做法,例如:return {key:value}; 另外,请帮自己一个忙,并拿下《道格拉斯·克罗克福德》(Douglas Crockford:The Good Parts)的副本。书中明确提到了这一点。
拉杰

@Ben –有趣的情况,感谢您指出。就是说,我建议不要依赖这些极端的情况,而只是将所有内容放在以分号结尾的一行上,并且仅将一行代码以某条语句或表达式无法结尾的代码放在多行上。
马塞尔·科佩尔

-3

由于JS是一种功能语言,因此,一个体面的JS程序员必须能够编写Y-combinator并解释其工作原理。


1
能够编写Y组合器有什么问题?是的,javascript是一种功能语言。如果您想说“了解javascript”,则必须对函数式编程有充分的了解。
雷诺斯2010年

C也可以用作功能语言。
kzh11 '02

我最近阅读了有关Y组合器的信息,了解了它的工作原理以及在什么情况下可以使用它。
Evert

-5

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


2
GWT并不是真正的JavaScript,它是Java编写JavaScript的方式。
利文斯顿·塞缪尔

...并且每个Javascipt程序员都应该知道这一点。
维克多·塞尔

您的javascript项目可能会以更加方便的方式进行开发。
维克多·塞尔

6
我个人认为Javascript比Java更容易处理。
timw4mail 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.