每个JavaScript程序员都应该知道什么?
是否有一套每一个JavaScript程序员都应该知道的东西可以说“我知道JavaScript”?jQuery将是我最好的推荐。不仅仅是代码本身,最值得效仿的是习惯用法、风格和背后的思想。Javascript对象和函数作为一等公民,回调,不要忘记事件,然后是JSLint,JavaScript与其他语言的区别可能比你想象的要大得多。观看这场精彩的谷歌技术演讲,给人留下深刻印象:如何。。javascript不是java:) 很多从网站开发开始的人都告诉我javascript只是简单的java每个JavaScript程序员都应该知道什么?,javascript,programming-languages,Javascript,Programming Languages,是否有一套每一个JavaScript程序员都应该知道的东西可以说“我知道JavaScript”?jQuery将是我最好的推荐。不仅仅是代码本身,最值得效仿的是习惯用法、风格和背后的思想。Javascript对象和函数作为一等公民,回调,不要忘记事件,然后是JSLint,JavaScript与其他语言的区别可能比你想象的要大得多。观看这场精彩的谷歌技术演讲,给人留下深刻印象:如何。。javascript不是java:) 很多从网站开发开始的人都告诉我javascript只是简单的java 至少熟悉
理解用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
操作符是如何工作的;利用它来创建您实际需要的普通类/子类/实例系统;当您可能希望使用基于闭包的对象而不是原型时。(关于这一点,大多数JS教程材料都非常糟糕;我花了好几年的时间才弄清楚。)new
,而不是绑定;如何从其他语言传递方法;如何使用闭包或如何在呼叫时确定此
来解决这个问题函数#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