Это серьезный вопрос. Он какое-то время подталкивал меня. В JavaScript вы можете объявить переменную, которая не имеет типа. Этот тип часто является динамическим, зависит от другого присвоенного ему значения.
например
var text;
typeof(text); //undefined
text = 'someText';
typeof(text); //string
Итак, как мы знаем, что Javascript может динамически изменять тип переменной, почему эти назначения недействительны?
например
var someObj;
someObj.a = 'hello world';
console.log(someObj) //TypeError
var someTable;
someTable[0] = 'hello world';
console.log(someTable[0]) //TypeError
где эту проблему можно устранить, просто добавив определение в объявление переменной:
var someObj = {};
var someTable = [];
Я бы ожидал хорошего объяснения этой проблемы. Спасибо за ответы.
1) Типы данных в Javascript не являются динамическими, они изменяемы. Это означает, что в зависимости от типа операции, к которой вы обращаетесь, они могут перейти от того, чтобы быть чем-то другим (например, число может стать строкой, выполняющей что-то вроде этого: 4 + 'a').
2) "Ошибка" является следствием того, что переменная не инициализирована. В Javascript, когда вы это делаете: var something = 'a'
вы делаете две операции, декларацию и задание. Если вы не выполняете задание, и вы пытаетесь получить доступ к свойству объекта, который вы объявили, он выдает ошибку. В вашем случае вы объявляете переменную, но не инициализируете ее, чтобы "компилятор" не мог получить доступ к свойству "a" или позиции 1, поскольку он имеет тип undefined
.
Там большая разница между декларацией и инициализацией переменных.
Когда вы объявляете переменную без инициализации ее value
, ее тип будет undefined
, поэтому, когда вы попытаетесь вызвать его или получить к нему, он будет давать undefined
, потому что просто нет value
определенного для переменной.
Вот почему он должен быть инициализирован:
var someObj = {};
var someTable = [];
Таким образом, вы можете рассматривать его как string
, object
или array
согласно его инициализированному value
.
Документация:
Пожалуйста, взгляните на переменные MDN Reference для дальнейшего чтения, где говорится:
Оператор
var
объявляет переменные, которые привязаны к текущим контекстам выполнения VariableEnvironment. Переменные Var создаются, когда их содержащая Лексическая среда создается и инициализируется неопределенной при создании. [...] Переменной, определенной переменной VariableDeclaration с инициализатором, присваивается значение ее инициализатора AssignmentExpression при выполнении VariableDeclaration, а не при создании переменной.
Вы путаетесь о том, где ошибка. В первом примере:
var someObj;
someObj.a = 'hello world'; // the error is thrown here
Эта ошибка возникает, потому что someObj
не undefined
(не необъявлен). Таким образом, вы не можете получить доступ к свойству a
по undefined
.
Это же объяснение относится и к вашему второму примеру:
var someTable;
someTable[0] = 'hello world'; // the error is thrown here
Вы пытаетесь получить доступ к индексу 0
undefined
.
Причина, определяющая их как {}
и []
, соответственно, устраняет вашу проблему, заключается в том, что вы получаете доступ к свойству a
из {}
и индексу 0
из []
.
undefined
которых нет свойстваa
и свойства0
.typeof
является оператором, а не функцией.