什么是顶级的JavaScript陷阱?

goo*_*orp 35 javascript debugging

我正在计划关于JavaScript的介绍性演讲,在准备过程中,我想知道新秀陷入的最大陷阱是什么.

我知道在我完全理解闭包之前我已经遇到了一些问题,但JavaScript中的许多奇怪行为都不是我想的了......

那么,你应该向新秀指出哪些陷阱?

Dan*_*ert 34

布尔类型转换.

''        ==   '0'           //false
0         ==   ''            //true
0         ==   '0'           //true
false     ==   'false'       //false
false     ==   '0'           //true
false     ==   undefined     //false
false     ==   null          //false
null      ==   undefined     //true
" \t\r\n" ==   0             //true
Run Code Online (Sandbox Code Playgroud)

以及之间的差异nullundefined.如表中列出的以上,比较nullundefined==返回true,但===它返回false.一旦您理解了undefined与具有null值的变量非常不同,并且持有该值的 undefined某些内容未定义的内容不同,则此行为是有意义的.


Ben*_*tto 27

不要在对象定义文字中意外留下尾随逗号,否则IE将失败,直到很久以后你才会注意到,因为你从未使用IE进行开发,到那时它可能会搞清楚发生了什么.

var foo = { 
    bar: "bar", 
    baz: "baz", 
};
Run Code Online (Sandbox Code Playgroud)

注意@ JulianR的评论:在数组中,IE不会直接通过抛出一些语法错误而失败,但是当你尝试使用数组时会失败,因为添加的逗号让IE认为数组中还有一个元素,有价值undefined,比那里实际上是.因此,如果您遇到错误,因为某些原因,数组中的最后一个元素是undefined:它是逗号.

  • +1非常容易识别这个.在数组中,IE不会直接通过抛出一些语法错误而失败,但是当你尝试使用数组时会失败,因为添加的逗号会让IE认为数组中还有一个元素,其值为"undefined",而不是实际存在.因此,如果您遇到错误,因为某些原因,数组中的最后一个元素是"未定义":它是逗号. (10认同)
  • +1 非常好的评论,这是一个非常令人讨厌的陷阱。 (2认同)

And*_*y E 22

不可否认,过去我曾经为其中的一些人感到内疚,为了你的娱乐,这是大胆的:

  • 不知道不正确(以及极少数正确)的使用 eval
    eval("obj."+prop);
    Run Code Online (Sandbox Code Playgroud)
  • 使用with语句
  • 使用时parseInt(str, base)不指定base参数.
  • 使用this计时器/回调函数.
  • 在计时器中使用类似eval的表达式
    setTimeout("someFunc(myScopedVarWhoops)");
  • 思考jQuery是你正在编码的语言的名称
  • 使用框架执行简单的JavaScript任务 - $(1).plus(1)任何人?;-)
  • continue不增加或调整条件变量的情况下使用.
  • 使用变量泛滥全局命名空间
  • varfor陈述中或之前忘记.for (i=0;i<10;i++)
  • 使用混淆器,让它在代码上运行
  • 不是一个陷阱,而是毫无意义 - return condition ? true : false;而不是return condition;
  • 不评论您的代码,真正适用于所有语言.
  • 使用try...catch...finally语句来捕获错误而不是使用if语句来检查变量.
  • 愚蠢地试图通过阻止你的页面上的鼠标右键来阻止"查看源"(我年轻*呜咽*!)
  • 使用{ 0: "Foo", 1:"Bar", 2:"Foobar" }而不是[ "Foo", "Bar", "Foobar" ]
  • 使用parseInt()用户输入
    parseInt("1,000") // -> 1, wrong!
    +"1,000" // -> NaN, correct!

一些人已经提到:

  • ===尽可能不使用严格的equality()运算符
  • 将事件处理程序设置为函数的返回值,而不是对所述函数的引用
  • 没有;正确终止陈述
  • for...in在数组上使用循环

我睡觉后可能会想到更多:-)


Poi*_*nty 15

  • 忘记用变量声明变量 var
  • 误解(或不理解)变量范围和闭包
  • 试图解决框架团队已经解决的令人讨厌的兼容性问题

  • 绝对是框架.无论如何,有人应该在使用之前理解JS.但他们应该知道他们在那里. (4认同)

Kob*_*obi 14

+ 连接字符串:

var a = '2';
var b = 3;

a * b #  6
a - b # -1
a + b #  23
Run Code Online (Sandbox Code Playgroud)

  • 我同意你的看法.这么多次我不得不写一些像'a*1 + b*1`来做这个技巧或者将它们解析为int.这太荒谬了. (2认同)

Joe*_*ams 9

JavaScript字符串不是字节字符串,也不是Unicode字符串.它们是UTF-16字符串.

例:

> "?".length
1
> "".length
2
> "".charAt(0)
"\uD800"
> "".charAt(1)
"\uDF08"
> "" === "\uD800\uDF08"
true
Run Code Online (Sandbox Code Playgroud)

如果上面看起来像垃圾,责怪您的浏览器有错误的Unicode处理(或可能是您的字体,因为没有'OLD ITALIC LETTER THE'字符).

  • 只是为了挑剔:拥有UTF-16字符串并没有错,错误的是抽象漏洞(如Javascript,.NET,Java等等).由UTF-16支持的理智文本API的一个例子是Haskell的数据.文字:`(T.length $ T.pack"")== 1`返回'True` (4认同)

Rob*_*sto 7

我为初学者看到的最大困难是理解执行上下文(即,"这"意味着何时何地遇到)以及原型继承系统.


JL.*_*JL. 5

  • 闭包 - 也称为lambda函数 - 注意内存泄漏.
  • 浏览器差异,在Internet Explorer和至少一个其他浏览器中进行测试是必须的.通常应避免仅在某些浏览器中工作或在不同浏览器中以不同方式工作的函数.如果不可能,则可以更好地检测浏览器特定分支,而不是浏览器版本.这增加了代码在未经测试的未来浏览器和浏览器中工作的机会.
  • 过于关注jQueryAjax框架抽象,并且不足以了解如何解决框架问题.
  • 不知道JavaScript可以在某种程度上用于编写OOP代码.实际上它可以为您提供一个非常基本的OOP框架和对象.
  • 区分大小写(如果您是VB.NET开发人员)
  • 知识产权保护 - 知道您可以对JavaScript进行模糊处理,但您在那里提供的源代码将很容易被窃取和反向工程.这可能不是一个问题,这取决于您正在编写的客户端应用程序的复杂性.

我再也想不到了,但我希望这会有所帮助.

  • 浏览器检测是邪恶的.您应该使用功能检测,而不是浏览器检测. (13认同)
  • @ el.pescado:浏览器检测不是邪恶的,它只是无效且容易出错. (3认同)