Получить 'undefined', если 'window.undefined' перезаписан - PullRequest
11 голосов
/ 16 февраля 2011

Похоже, что window.undefined доступно для записи, то есть для него может быть установлено что-то другое, чем его значение по умолчанию (что неудивительно, undefined).

Суть в том, что всякий раз, когда я ссылаюсь наundefined, это относится к window.undefined (поскольку window может быть удалено в подобных случаях).

Так как же на самом деле получить, так сказать, доступ к undefined 'экземпляру'?Как бы я мог установить другую переменную на undefined, если window.undefined был изменен?

Если я кодирую:

window.undefined = 'foo'; // This code might have been executed by someone/something
var blah = undefined; // blah is not undefined, but equals to 'foo' instead...

Как я мог бы решить эту проблему?

Ответы [ 4 ]

17 голосов
/ 16 февраля 2011

В дополнение к другим решениям вы можете выполнить трюк void 0, который всегда возвращает undefined независимо от свойства window.

window.undefined = 'foo';
var blah = void 0;

alert( blah );  // undefined
17 голосов
/ 16 февраля 2011

«Стандартным» решением этой проблемы является использование встроенного оператора void. Его единственная цель - вернуть undefined:

var my_undefined = void 0;

В дополнение к этому, есть и другие способы получить undefined:

Функции возвращают undefined, если вы ничего не делаете return, чтобы вы могли сделать что-то вроде

this_is_undefined = (function(){}());

Вы также получите неопределенное значение, если не передадите достаточное количество аргументов функции. Таким образом, общая идиома это

function foo(arg1, arg2, undefined){ //undefined is the last argument
    //Use `undefined` here without worrying.
    //It is a local variable so no one else can overwrite it
}
foo(arg1, arg2);
//since you didn't pass the 3rd argument,
//the local variable `undefined` in foo is set to the real `undefined`.

Этот тип особенно хорош для случаев, когда вы определяете и вызываете функцию одновременно, чтобы не было риска забыть и передать неверное число аргументов.

3 голосов
/ 08 июля 2011

Этого должно быть достаточно, чтобы объявить переменную, не назначая ее ни для чего:

var local_undefined;
alert(typeof local_undefined);

Но почему на Земле можно изменить неопределенное значение? Кто-нибудь знает историю этого?

3 голосов
/ 16 февраля 2011

На самом деле, сравнивать что-либо с undefined не очень хорошая идея.Вместо этого следует использовать оператор typeof:

function isUndefined ( variant ) { return typeof variant === 'undefined' }
...