Что делает эта строка ниже?
undefined = 'A value';
Если это не изменит значение undefined
, то что происходит за кулисами?
Что делает эта строка ниже?
undefined = 'A value';
Если это не изменит значение undefined
, то что происходит за кулисами?
undefined
является свойством глобального объекта, т.е. является переменной в глобальной области. Начальное значениеundefined
- это примитивное значениеundefined
.
См. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined
Итак, это просто переменная, ничего особенного. Теперь, чтобы ответить на ваши вопросы:
undefined = 'A value';
пытается присвоить строку 'A value'
глобальной переменной undefined
undefined === 'A value'; // true
. В новых браузерах в строгом режиме операция приводит к ошибке.Вы можете протестировать следующее в консоли браузера (я использую современный браузер здесь - Google Chrome):
undefined = true;
console.log(undefined); // undefined
// in older browsers like the older Internet Explorer it would have logged true
В приведенном выше примере значение undefined
не изменяется. Это потому, что (внимание мое):
В современных браузерах (JavaScript 1.8.5/Firefox 4+) undefined представляет собой неконфигурируемое, не записываемое свойство по спецификации ECMAScript 5.
В строгом режиме:
'use strict';
undefined = true; // VM358:2 Uncaught TypeError: Cannot assign to read only property 'undefined' of object
В отличие от true
, 123
или null
, undefined
не является литералом. Это означает, что использование идентификатора undefined
не является надежным способом получения значения undefined. Вместо этого можно использовать оператор void
, например. void 0
.
По умолчанию undefined
определено свойство глобального объекта то есть глобальная переменная, До ECMAScript 5 это свойство было доступно для записи, поэтому
undefined = "A value";
заменил значение window.undefined
, считая, что оно не затенено локальной переменной. Тогда, если вы использовали "A value" === undefined
, вы получили бы true
. И void 0 === undefined
создаст false
.
ECMAScript 5 изменил это поведение, и теперь свойство не доступно для записи и не настраивается. Поэтому присваивания undefined
будут игнорироваться в нестрогом режиме и будут вызывать исключение строгого режима. Под капотом
undefined = "A value";
является Простым назначением"A value"
в ссылку с базой глобального объекта, имя ссылки "undefined"
и строгий флаг, если задание выполнено в строгом режиме."undefined"
в качестве имени свойства, "A value"
в качестве значения, и строгий флаг как флаг throw."undefined"
, дескриптор свойства {[[Value]]: "A value"}
и флаг throw в качестве аргументов.Однако вы все же можете объявлять локальные переменные undefined
:
(function() {
var undefined = "A value";
alert(undefined); // "A value";
})();
Я сделал небольшой POC с и без strict mode
.
Эффект заключается в том, что если вы не используете strict mode
, все будет хорошо. Если вы используете strict mode
, вам будет приятно:
TypeError: не может назначить свойство только для чтения 'undefined'
Теперь перейдите в POC:
"use strict"
var c;
if (c === undefined) {
console.log("nothing happened")
}
undefined = "goofy"
c = "goofy"
if (c === undefined) {
console.log("c is 'goofy' and it equal to undefined.. gosh.. we broke js")
}
Теперь, как я уже сказал, при строгом режиме вы получаете TypeError
, а при удалении "use strict"
script идет нормально, а выход - просто nothing happened
.
Я нашел этот Q/A, который может быть полезен, если вы хотите узнать больше
ПРИМЕЧАНИЕ. Я тестировал этот код с помощью Node.js
.