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

每个JavaScript程序员都应该知道什么?,javascript,programming-languages,Javascript,Programming Languages,是否有一套每一个JavaScript程序员都应该知道的东西可以说“我知道JavaScript”?jQuery将是我最好的推荐。不仅仅是代码本身,最值得效仿的是习惯用法、风格和背后的思想。Javascript对象和函数作为一等公民,回调,不要忘记事件,然后是JSLint,JavaScript与其他语言的区别可能比你想象的要大得多。观看这场精彩的谷歌技术演讲,给人留下深刻印象:如何。。javascript不是java:) 很多从网站开发开始的人都告诉我javascript只是简单的java 至少熟悉

是否有一套每一个JavaScript程序员都应该知道的东西可以说“我知道JavaScript”?

jQuery将是我最好的推荐。不仅仅是代码本身,最值得效仿的是习惯用法、风格和背后的思想。

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

JSLint

,JavaScript与其他语言的区别可能比你想象的要大得多。观看这场精彩的谷歌技术演讲,给人留下深刻印象:

如何。

。javascript不是java:)

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

  • 至少熟悉一个Javascript库(Jquery、Prototype等)

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

  • 了解业界:Douglas Crockford的网站是一个宝库,而Ajaxian.com是一个很好的博客,可以随时了解Javascript的新的、有趣的或奇怪的想法。还有很多其他的资源,但这些都是对我帮助最大的


  • 理解用Crockford编写的东西是一个很好的假设,即一个人是一个体面的JS程序员

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

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


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

    了解到Javascript最初被称为LiveScript,并且附加“Java”前缀是为了营销目的,而不是因为Java和Javascript是相关的(它们不是相关的)

    哦,还有拥有David Flanagan的任何版本的《Javascript:The Financial Guide》(Javascript:The Financial Guide)(此信息见第2页)

    。。。感谢那些曾经试图混淆InternetExplorer4的document.all[]和NetscapeNavigator4的document.layers[]的人,在像Jquery这样的东西消除痛苦之前

    编辑:


    正如@Kinopiko所指出的,JavaScript最初被称为project Mocha(也被称为project LiveWire),但人们普遍认为该语言(由Brendan Eich编写)将在1996年初采用Java前缀之前作为LiveScript发布。

    因为JS是一种功能性语言,一个像样的JS程序员必须能够编写Y-combinator,并能从头开始解释它是如何工作的。

    javascript是世界上部署最广泛的语言。(可能)它可以被禁用。

    不是jQuery。不是你。不(等等)

    框架可能很有用,但它们常常对您隐藏JavaScript和DOM如何实际工作的丑陋细节。如果您的目标是能够说“我知道JavaScript”,那么在一个框架上投入大量时间是与此相反的

    下面是一些JavaScript语言特性,您应该知道这些特性,以便了解它正在做什么,而不会被发现,但对于许多人来说,这些特性并不是很明显:

    • object.prop
      object['prop']
      是一样的东西(所以你能不能停止使用
      eval
      ,谢谢);对象属性始终是字符串(即使是数组);(和)

    • 财产嗅探;未定义的
      是什么(和);为什么
      中看似鲜为人知的
      操作符是有益的,并且不同于
      类型的
      /
      未定义的
      检查<代码>拥有自己的财产
      删除的目的

    • Number
      数据类型实际上是一个浮点数;与语言无关的使用浮动的困难;避免
      parseInt
      八进制陷阱

    • 嵌套函数作用域;在您希望避免意外全局事件的范围内使用
      var
      的必要性;如何将作用域用于闭包;这个

    • 全局变量和
      窗口
      属性如何冲突;全局变量和文档元素如何在IE中不发生冲突;在全球范围内使用
      var
      的必要性也是为了避免这种情况

    • 函数
      语句如何在定义前面的代码之前执行定义;函数语句和函数表达式之间的差异;为什么命名函数表达式

    • 构造函数是如何工作的,
      prototype
      属性和
      new
      操作符是如何工作的;利用它来创建您实际需要的普通类/子类/实例系统;当您可能希望使用基于闭包的对象而不是原型时。(关于这一点,大多数JS教程材料都非常糟糕;我花了好几年的时间才弄清楚。)

    • 如何在呼叫时确定此
      ,而不是绑定;如何从其他语言传递方法;如何使用闭包或
      函数#bind
      来解决这个问题

    • ECMAScript第五版的其他功能包括
      indexOf
      forEach
      和函数式编程;如何安装旧浏览器以确保您可以使用它们;将它们与内联匿名函数表达式一起使用,以获得紧凑、可读的代码

    • 浏览器和用户代码之间的控制流;同步和异步执行;在控制流内部触发的事件(如焦点)与控制返回时发生的事件和超时;调用所谓的同步内置(如
      警报
      )会导致潜在的灾难性重入

    • 跨窗口脚本如何影响
      的instanceof
      ;呵
      (function f(f){ 
        return typeof f(); 
      })(function(){ return 1; });
      
      function CountToTen()
      {
        for(i=0; i< 10; i++)
        {
          DoSomething(i);
        }
      }
      
      function countToFive()
      {
        for(i=0; i<5; i++)
        {
          CountToTen();
        }
      }
      
      CountToFive();
      
      function CountToTen()
      {
        var i;
        for(i=0; i< 10; i++)
        {
          DoSomething(i);
        }
      }
      
      function countToFive()
      {
        var i;
        for(i=0; i<5; i++)
        {
          CountToTen();
        }
      }
      
      CountToFive();
      
      function foo()
      {
          return
          {
              bar: 'something'
          };
      }
      
      $(function()
      {
          document.write(foo());
      });
      
      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') : '');
      }
      
      var a = [];
      a.length;   // === 0
      a[10];      // === undefined
      a[10] = undefined;
      a.length;   // === 11
      a.pop();    // === undefined
      a.length;   // === 10