Чтобы попробовать это, я использовал два разных редактора кода Javascript. Он дает два разных вывода для одного и того же кода. Почему это так? Один из них дает значение «ноль», другой — «неопределено».
Вот код, который я написал.
let a ;
var b ;
console.info(a);
console.info(b);
КодПен
Я пытался проверить версии javascript для редакторов кода, но решения нет. заранее спасибо.
В общем, ожидаемое значение неинициализированной переменной равно undefined
:
Подъем переменных позволяет использовать переменную в программе JavaScript даже до ее объявления. По умолчанию такие переменные будут инициализированы как неопределенные. Среда выполнения JavaScript сканирует объявления переменных и помещает их в начало функции или скрипта. Переменные, объявленные с ключевым словом var, поднимаются наверх.
https://www.tutorialspoint.com/es6/es6_variables.htm
Однако Javascript реализуется в нескольких проектах, и совсем неудивительно, что эти реализации могут различаться. В этом случае использование null
для неинициализированных переменных кажется ошибкой, если только для этого нет очень веской причины, которой я на данный момент не вижу.
Хорошим подходом для предотвращения таких аномалий, возникающих из-за отсутствия инициализации, является явная инициализация переменных тура, например
let x = undefined;
если тип неопределенности (null
и/или undefined
) может иметь значение в вашем контексте, вы также можете заключить соглашение об инициализации всех переменных, поскольку это не усложняет ваше кодирование, но добавляет некоторую предсказуемость в разных вариантах использования.
Это проблема онлайн-редактора. Кажется, что вместо того, чтобы воссоздавать контекст JavaScript каждый раз при изменении кода, он пытается сбросить все, что скрипт мог установить при последнем запуске, а затем выполняет новый код.
В случае глобальных переменных a
и b
происходит следующее:
Редактор создает список всех свойств window
, которые есть при первом запуске (до выполнения вашего кода), а затем при каждом изменении кода редактор запускает все имеющиеся свойства window
, а для тех, которых нет в исходном списке, он делает:
window[key] = null;
delete window[key];
Хотя delete
обычно удаляет заданное свойство и приводит к тому, что оно становится undefined
, в данном случае этого не произойдет, поэтому a
и b
становятся null
после второго запуска.
Потому что эта IDE глючная. Сначала они
undefined
, затем при повторе становятсяnull
. И это не просто визуальный баг.b === undefined
сначала приводит кtrue
, затем кfalse
.