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

gat*_*ath 368 javascript programming-languages

每个JavaScript程序员都应该知道一组能够说"我知道JavaScript"的东西吗?

bob*_*nce 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第五版的功能indexOf,forEach以及功能编程方法Array ; 如何修复旧浏览器以确保您可以使用它们; 使用它们与内联匿名函数表达式来获得紧凑,可读的代码.

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

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

有关最后两项,请参阅此答案.

最重要的是,你应该批判性地查看JavaScript,承认它是历史原因的一种不完美的语言(甚至超过大多数语言),并避免其最糟糕的麻烦.克罗克福德在这方面的工作绝对值得一读(虽然我并不是100%同意他的"好零件").

  • 啊,最后一个深思熟虑,彻底的答案.如果我能+10,我愿意.了解框架并不意味着您可以有效地编写JavaScript. (80认同)
  • Sir Psycho:请注意,这个答案都没有提到DOM,这就是大型图书馆可以帮助你的东西.**框架无法保护您免受此处提及的任何事情的影响**.对于使用框架或不使用框架的任何人来说,这个东西很重要. (19认同)
  • 什么缸!这并不是说知道所有不同的浏览器怪癖会让你成为一个更好的JS编码器.也许你的同龄人有更多的街头信誉......抽象让生活变得更轻松,并且是JS的重要组成部分,所以我会说知道一个框架让你成为一个更好的JS编码器,而不是一个没有并且想要做很长事情的人. (7认同)
  • 非常感谢那个深思熟虑的答案.我想补充一点,如果你知道它是如何完成的,那么使用框架会非常有用.在使用框架之前,您应该学会自己做这些事情. (6认同)
  • @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. (4认同)
  • "`object.prop和object ['prop']`是相同的"并不完全.如果后跟`()`,它们将`prop`作为函数执行,但只有第一个设置`this = object`,所以`prop`可以访问`object`. (2认同)

gra*_*ine 248

它可以被禁用.

  • +1.没有JavaScript的页面是一个即使启用了JS也会很脆弱的页面. (27认同)
  • @TM,不,这确实是一个重要的考虑因素.在将值插入数据库之前测试值或者只能通过精美的javascript弹出框登录到您的网站时,这应该是您的首要考虑因素.说到哪......我想我需要去检查一下. (24认同)
  • -1这是偏离主题,并没有任何与知道javascript作为语言有关.在设计Web应用程序时考虑是件好事,但它仍然不是属于此主题的答案. (16认同)
  • +1,我已经厌倦了甚至连优雅降级的基础都没有打扰的页面,因为"它太难了,而且每个人都启用了javascript". (12认同)
  • @iconiK我会告诉所有我的政府客户,他们因为安全原因而全球禁用JavaScript,他们都是白痴,好吗? (9认同)
  • @iconiK如果它可以优雅地降级那么它应该,如果它不能那么一个带警告的干净页面是等价的 - 它不是火箭手术.那里有那么多糟糕的JS,我禁用它,直到你向我证明你不是白痴. (7认同)
  • @Colonel Sponsz,警告很好,很容易做到.然而,期望它可以优雅地降解是太多了.今天,Web应用程序是REAL应用程序 在我的书中,如果你有JS禁用,你就是个白痴,因此我会警告你. (5认同)
  • +1更有趣的是,在没有样式表的情况下,您正在寻找新的javascripted和stylesheeted网站.javascript仍然循环播放幻灯片,菜单上的花式悬停功能在链接的默认蓝色下划线字体中看起来很滑稽.尝试一下. (4认同)
  • @graphiciviv,JS安全问题?什么,他们还在运行IE,您可以在哪里修改本地文件?(对于FAT分区来说,结果非常糟糕).这听起来很愚蠢. (3认同)

小智 75

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

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

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

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

  • 在http://developer.yahoo.com/yui/theater/上还有很多具有启发性和洞察力的Crockford视频 - 我想我不需要提及http://crockfordfacts.com/ :-) (8认同)

Ski*_*ick 49

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

一个激发你胃口的例子:

(function f(f){ 
  return typeof f(); 
})(function(){ return 1; });
Run Code Online (Sandbox Code Playgroud)

这个表达式返回了什么?

  • "数"
  • "不确定"
  • "功能"
  • 错误

  • 看看我的答案:http://codingspot.com/2010/02/answering-the-juriy-zaytsev-javascript-quiz/ (10认同)
  • Skilldrick:我想我第一次得到它们,我经常读到ECMA-262标准(我知道,我是一个怪胎:-) (7认同)

edw*_*win 46

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

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

  • 我认为,如果你不了解W3C-DOM,你就不懂JavaScript.这两件事情是不同的. (11认同)

Sri*_*nan 37

..这个javascript不是java :)

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

  • "JavaScript就是Java,因为地毯就是汽车." (71认同)
  • 除非他们使用Google Web Toolkit (4认同)

Dav*_*vid 27

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

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

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


Sar*_*raz 24

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

  • 啊jQuery,过度使用的JS框架! (20认同)

Ash*_*bhu 24

Javascript不是一小时内可以学到的东西!

  • 但这似乎是受欢迎的信念 (4认同)

the*_*rty 23

变量是全球变量,除非声明为本地变量!!

坏(DoSomething()只被调用10次):

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

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

CountToFive();
Run Code Online (Sandbox Code Playgroud)

好(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();
Run Code Online (Sandbox Code Playgroud)

  • 我试着养成`for(var i = 0;`在我所有循环中的习惯) (6认同)
  • 我甚至都没想过这个.很好的一点. (2认同)
  • Crockford更喜欢将`var`放在函数的顶部,因为它不会欺骗你关于变量范围的大小.如果你在同一个函数中的两个单独的`for`循环中`var i`,`js2-mode`会抱怨,因为它表明你认为你有两个独立的变量,而你没有.尽管如此,我确实试图将`var`事物与我初始化它们的地方区分开来. (2认同)

ame*_*vin 8

要知道Javascript最初被称为LiveScript,并且出于营销目的附加了"Java"前缀,而不是因为Java和Javascript是相关的(它们不是).

哦,拥有任何版本的David Flanagan的"Javascript:The Definitive Guide"(此信息在第2页).

...并且为了欣赏那些曾经试图混淆Internet Explorer 4的document.all []和Netscape Navigator 4的document.layers []之前的那些,在Jquery之前带走了痛苦.

编辑:

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


Ani*_*mde 8

人们应该注意以下内容来说"我知道JavaScript":

  1. JavaScript很好,但DOM是痛点
  2. 跨浏览器问题会让你发疯
  3. 除非代码在至少4种不同的好浏览器上进行测试,否则你无法说它没有bug
  4. 关闭 ..............必须知道
  5. 它的原型基于 ...........很好的学习它的乐趣
  6. 调试器关键字.....帮助陷入危机


eri*_*ert 7

JavaScript与其他语言的区别远远超出您的想象.观看这个精彩的Google Tech Talk以获得一个印象:http://www.youtube.com/watch?v = hQVTIJBZook


Kha*_*tar 7

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

怎么样,我可以通过2次点击来关闭你的努力.因此,如果可能的话,提供后备.


Sun*_*Lim 6

我强烈建议您阅读Javascript:The Good Parts


Mic*_*onk 6

如果你能有效地使用数组,数字,字符串,日期和对象,你就知道javascript.加上Math和RegExp的积分.您应该能够编写函数并使用变量(在正确的范围内,即作为对象的'方法').

我看到一些关于知道闭包,奢侈函数语法,blabla的评论.所有这一切都与这个问题无关.如果你可以在11秒内完成100米短跑,那就像说你是跑步者.

我说可能需要几个星期才能熟练掌握javascript.在此之后,需要数年和数十本书和数千行编程才能成为专家,忍者等.

但那不是问题.

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