在JavaScript中,假设undefined没有被覆盖,它有多危险?

Cos*_*con 84 javascript undefined

每次有人提到测试时undefined,都会指出undefined不是一个关键字,因此可以设置为"hello",所以你应该使用 typeof x == "undefined".这对我来说似乎很荒谬.没有人会这样做,如果他们这样做,那将是足够的理由永远不会使用他们写的任何代码......对吗?

我发现一例人谁无意中设定的undefinednull,这给出一个理由,以避免假设undefined不会被覆盖.但是,如果他们这样做了,那么这个bug就不会被发现,我也看不出它有多好.

在C++中,每个人都清楚地知道这是合法的#define true false,但没有人建议你避免true使用它0 == 0.你只是假设没有人会成为一个足够强大的混蛋,如果他们这样做,再也不会相信他们的代码了.

这有没有真正咬过别人分配给undefined(有意)的人而且它破坏了你的代码,或者这更像是一个假想的威胁?我愿意冒昧地让我的代码更具可读性.这是一个非常糟糕的主意吗?

重申一下,我并不是要求如何防止重新分配未定义.我已经看过那些已经写过100次的技巧了.我问不使用这些技巧是多么危险.

Ry-*_*Ry- 55

不,我从来没有.这主要是因为我在现代浏览器上开发,这些浏览器大多数符合ECMAScript 5.ES5标准规定undefined现在只读.如果您使用严格模式(应该),如果您不小心尝试修改它,将会引发错误.

undefined = 5;
alert(undefined); // still undefined
Run Code Online (Sandbox Code Playgroud)
'use strict';
undefined = 5; // throws TypeError
Run Code Online (Sandbox Code Playgroud)

你应该不会做的是建立自己的作用域,可变undefined:

(function (undefined) {
    // don't do this, because now `undefined` can be changed
    undefined = 5;
})();
Run Code Online (Sandbox Code Playgroud)

常数很好.仍然没必要,但很好.

(function () {
    const undefined = void 0;
})();
Run Code Online (Sandbox Code Playgroud)

  • +1,因为你是唯一一个真正部分回答问题的人...... (4认同)

Thi*_*ter 40

没有合适的代码会做这样的事情.但你永远不会知道一些想要聪明的开发人员或者你正在使用的插件/库/脚本.另一方面,它是极不可能的,现代浏览器根本不允许覆盖undefined,所以如果你使用这样的浏览器进行开发,你会很快注意到任何代码是否试图覆盖它.


即使你没有要求它 - 很多人在寻找更常见的"如何防止重新定义undefined"问题时可能会发现这个问题,所以无论如何我都会回答这个问题:

无论浏览器的年龄多大,都有一种非常好的方法可以获得真正的未定义 undefined:

(function(undefined) {
    // your code where undefined is undefined
})();
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为始终是未指定的参数undefined.您也可以使用接受一些真实参数的函数来完成它,例如当您使用jQuery时.以这种方式确保理智的环境通常是个好主意:

(function($, window, undefined) {
    // your code where undefined is undefined
})(jQuery, this);
Run Code Online (Sandbox Code Playgroud)

然后你可以确定在匿名函数里面有以下几点:

  • $ === jQuery
  • window === [the global object]
  • undefined === [undefined].

但是,请注意,有时typeof x === 'undefined'实际需要:如果变量x从未被设定为一个值(与被设置undefined),阅读x以不同的方式,如if(x === undefined)将抛出一个错误.这不适用于对象属性,所以如果你知道它y总是一个对象,那么它if(y.x === undefined)是绝对安全的.

  • 再说一次,如果有人意外地说"undefined = someVariable"这是一个错误而且你想要破坏的东西.至少我这样做. (5认同)
  • @Oleksandr_DJ完全正确.组成一个你知道*是'undefined`的值,并将其分配给范围中的`undefined`.**如果传入"太多"参数,请不要将"未定义"打开以进行覆盖.**这会引发错误,并且本身就是非防御模式,尤其是当[Lucero指出]时(http:/ /stackoverflow.com/a/8783534/1028230),有很简单的替代方法可以在范围内获得可靠的"未定义"值. (4认同)
  • 关于`x`没有设置为值的陈述并不完全正确(参见http://jsfiddle.net/MgADz/); 它确实是真的*没有定义*(见http://jsfiddle.net/MgADz/1/). (2认同)
  • 我已经使用了一个代码库,它有一个缩小的遗留脚本,覆盖了undefined,我们没有时间或预算来重写脚本,这是一个需要typeof x =="undefined"的例子,它并不奇怪,可能一个好习惯. (2认同)
  • 我感兴趣的是为什么所有的例子都使用"undefined"作为函数中的附加参数?但是如果有人通过错误传递一个额外的参数(已定义)并且所有逻辑都将失败,则可能存在这种情况.为什么不使用像function(){var _undef; if(someVal == _undef){做某事}}; (2认同)

Luc*_*ero 19

有一个简单的解决方案:比较void 0始终未定义.

请注意,您应该避免,==因为它可能强制值.使用===(和!==)代替.

也就是说,如果有人写,=而不是==在比较某些东西时,可能会错误地设置未定义的变量undefined.