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? Кто-нибудь знает историю за этим?