是否有一组东西是每个JavaScript程序员都应该知道的,以便能够说“我懂JavaScript”?
JavaScript与其他语言的差异比您想象的要大得多。观看这个很棒的谷歌技术讲座,获得印象:http://www.youtube.com/watch?v=hQVTIJBZook
熟悉至少一个Javascript库(Jquery, Prototype等)。 学习如何使用主要浏览器的调试工具(MSIE 7-8, Firefox, Chrome, Safari) 深入了解这个行业:Douglas Crockford的网站是一个宝库,ajajana.com是一个很好的博客,可以让你了解关于Javascript的新的、有趣的或奇怪的想法。还有很多其他的资源,但这些是对我帮助最大的。
理解Crockford的《Javascript: the Good Parts》中所写的内容是一个很好的假设,即一个人是一个体面的JS程序员。
你可以知道如何使用一个好的库,如JQuery,但仍然不知道Javascript隐藏的部分。
另一个注意事项是各种浏览器上的调试工具。JS程序员应该知道如何在不同的浏览器中调试代码。
哦!知道JSLint会完全伤害你的感情!!
知道Javascript最初被称为LiveScript,加上“Java”前缀是出于营销目的,而不是因为Java和Javascript有关系(它们并没有关系)。
哦,对于拥有任何版本的David Flanagan的“Javascript:权威指南”(这一信息在第2页)。
... 感谢那些之前试图混淆ie4文档的人。all[]和Netscape Navigator 4的文档。在Jquery之前使用layers[]消除了这种痛苦。
编辑:
正如@Kinopiko指出的,JavaScript最初被称为项目Mocha(一些消息来源也认为它被称为项目LiveWire),但人们普遍认为,该语言(由Brendan Eich编写)在1996年初发布时采用Java前缀之前,计划以LiveScript的形式发布。
jQuery。YUI。不是(等等等等)
框架可能很有用,但它们经常隐藏JavaScript和DOM实际工作的细节,这些细节有时很难看。如果你的目标是能够说“我懂JavaScript”,那么在一个框架上投入大量的时间是与此相反的。
这里有一些JavaScript语言的特性,你应该知道它在做什么,不会被发现,但对很多人来说不是很明显:
That object.prop and object['prop'] are the same thing (so can you please stop using eval, thanks); that object properties are always strings (even for arrays); what for...in is for (and what it isn't). Property-sniffing; what undefined is (and why it smells); why the seemingly-little-known in operator is beneficial and different from typeof/undefined checks; hasOwnProperty; the purpose of delete. That the Number datatype is really a float; the language-independent difficulties of using floats; avoiding the parseInt octal trap. Nested function scoping; the necessity of using var in the scope you want to avoid accidental globals; how scopes can be used for closures; the closure loop problem. How global variables and window properties collide; how global variables and document elements shouldn't collide but do in IE; the necessity of using var in global scope too to avoid this. How the function statement acts to ‘hoist’ a definition before code preceding it; the difference between function statements and function expressions; why named function expressions should not be used. How constructor functions, the prototype property and the new operator really work; methods of exploiting this to create the normal class/subclass/instance system you actually wanted; when you might want to use closure-based objects instead of prototyping. (Most JS tutorial material is absolutely terrible on this; it took me years to get it straight in my head.) How this is determined at call-time, not bound; how consequently method-passing doesn't work like you expect from other languages; how closures or Function#bind may be used to get around that. Other ECMAScript Fifth Edition features like indexOf, forEach and the functional-programming methods on Array; how to fix up older browsers to ensure you can use them; using them with inline anonymous function expressions to get compact, readable code. The flow of control between the browser and user code; synchronous and asynchronous execution; events that fire inside the flow of control (eg. focus) vs. events and timeouts that occur when control returns; how calling a supposedly-synchronous builtin like alert can end up causing potentially-disastrous re-entrancy. How cross-window scripting affects instanceof; how cross-window scripting affects the control flow across different documents; how postMessage will hopefully fix this.
请看关于最后两项的答案。
最重要的是,你应该批判性地看待JavaScript,承认由于历史原因,它是一种不完美的语言(甚至比大多数语言都不完美),并避免它最糟糕的故障点。Crockford在这方面的工作绝对值得一读(尽管我并不100%同意他关于“好的部分”是什么)。
如果你想成为一个真正的JavaScript高手,你应该知道完美JavaScript测试中每个问题的答案。
下面这个例子可以让你胃口大开:
(function f(f){
return typeof f();
})(function(){ return 1; });
这个表达式返回什么? “数量” “定义” “功能” 错误
要说“我懂JavaScript”,你应该注意以下几点:
JavaScript很好,但DOM是个痛点 跨浏览器问题会让你抓狂 除非代码在至少4个不同的好浏览器上测试过,否则你不能说它没有bug 关闭 ..............必须知道 其原型基于...........很好,学习这个很有趣 调试器关键字.....在危机中提供帮助
变量是全局的,除非声明为局部的!!
Bad (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();
以下几点也很重要:
1)可变提升。 2)作用域链和激活对象。
然后是这样的::)
3) wtfjs.com
4)一切都是一个对象http://www.lifeinafolder.com/images/Js.jpg
你知道javascript,如果你能有效地使用数组,数字,字符串,日期和对象。为Math和RegExp加分。你应该能够编写函数和使用变量(在正确的范围内,即作为对象的“方法”)。
我看到一些关于了解闭包的评论,奢侈的函数语法,blabla。所有这些都与这个问题无关。这就好比说,如果你能在11秒内跑完100米,你就是一名跑步者。
我说可能需要几周的时间来精通javascript。在那之后,你需要花费数年时间,阅读数十本书,编写数千行程序,才能成为专家、忍者等等。
但这不是问题所在。
对了,DOM不是javascript的一部分,jQuery也不是。所以我认为两者都与这个问题无关。
真正学好一门语言并理解它的各种怪癖来自(多年的)经验。如果你想成为一个更好的程序员,我会说,了解设计模式,如何以及何时使用它们,甚至在你没有意识到的情况下使用它们;技术架构和用户体验。
Knowing the (JavaScript) language means you can pick up any framework and use it at will. You'll inevitably need to dive into the source code, and if all you know is the syntax a framework or 2 or 3, then you won't go far. In saying that, getting into a few different frameworks' source code is probably one of the best ways to see how JavaScript can be used. Messing about by stepping through the code in Firebug or Web Inspector, then checking JavaScript Documentation, especially the Mozilla and Webkit docs, to get further understanding of what you're looking at.
了解面向对象和函数式编程之间的区别,了解JavaScript是两者的完美结合,以及何时以及如何使用这两者来创建杀手级代码库和出色的应用程序,将使你成为更好的JavaScript程序员。
简单地阅读一些书籍,尤其是Crockford的“good parts”,它只展示了他对JavaScript中什么是好的观点,而跳过JavaScript的大部分“AWESOME”部分会让你一开始就走错了路。
另一方面,看看像Thomas Fuchs这样的人写的代码会让你更深入地了解编写令人惊叹和高效的JavaScript的力量。
试图记住一些陷阱或wtf也不会有多大帮助,如果你开始编码并逐步浏览一个库/框架的代码,特别是一个有帮助的注释的代码,你会发现为什么他们使用某些属性/值,而不是其他为什么以及什么时候使用特定的操作数和操作符是好的,这些都存在于框架的代码中。有什么比以身作则更好呢?: ^)
数组中。Length方法不是数组项的计数,而是最高索引。即使该项被设置为undefined
var a = [];
a.length; // === 0
a[10]; // === undefined
a[10] = undefined;
a.length; // === 11
a.pop(); // === undefined
a.length; // === 10
这种行为很难与语言设计错误区分开来。
推荐文章
- 如何使用Jest测试对象键和值是否相等?
- 将长模板文字行换行为多行,而无需在字符串中创建新行
- 如何在JavaScript中映射/减少/过滤一个集?
- Bower: ENOGIT Git未安装或不在PATH中
- 添加javascript选项选择
- 在Node.js中克隆对象
- 为什么在JavaScript的Date构造函数中month参数的范围从0到11 ?
- 使用JavaScript更改URL参数并指定默认值
- 在window.setTimeout()发生之前取消/终止
- 如何删除未定义和空值从一个对象使用lodash?
- 检测当用户滚动到底部的div与jQuery
- 在JavaScript中检查字符串包含另一个子字符串的最快方法?
- 检测视口方向,如果方向是纵向显示警告消息通知用户的指示
- ASP。NET MVC 3 Razor:在head标签中包含JavaScript文件
- 禁用从HTML页面中拖动图像