Get 'undefined', если 'window.undefined' перезаписан

Похоже, что 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...

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

Ответ 1

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

var my_undefined = void 0;

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

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

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

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

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`.

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

Ответ 2

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

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

alert( blah );  // undefined

Ответ 3

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

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

Ответ 4

Достаточно просто объявить переменную, не присваивая ей ничего:

var local_undefined;
alert(typeof local_undefined);

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