определение динамического объекта

1

Это серьезный вопрос. Он какое-то время подталкивал меня. В 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 = [];

Я бы ожидал хорошего объяснения этой проблемы. Спасибо за ответы.

  • 0
    Вопреки тому, что вы сказали, ошибка не возникает, когда вы регистрируете переменную, потому что код никогда не достигает этой точки. Обе переменные инициализируются как undefined которых нет свойства a и свойства 0 .
  • 2
    Кстати, typeof является оператором, а не функцией.
Показать ещё 1 комментарий
Теги:
variables
undefined
declaration

3 ответа

1
Лучший ответ

1) Типы данных в Javascript не являются динамическими, они изменяемы. Это означает, что в зависимости от типа операции, к которой вы обращаетесь, они могут перейти от того, чтобы быть чем-то другим (например, число может стать строкой, выполняющей что-то вроде этого: 4 + 'a').

2) "Ошибка" является следствием того, что переменная не инициализирована. В Javascript, когда вы это делаете: var something = 'a' вы делаете две операции, декларацию и задание. Если вы не выполняете задание, и вы пытаетесь получить доступ к свойству объекта, который вы объявили, он выдает ошибку. В вашем случае вы объявляете переменную, но не инициализируете ее, чтобы "компилятор" не мог получить доступ к свойству "a" или позиции 1, поскольку он имеет тип undefined.

  • 2
    Более того, переменная не имеет типа, ее значение имеет тип.
  • 0
    Спасибо. Вы объяснили, где проблема кроется в деталях, и предоставили дополнительное объяснение, в котором я нуждался.
2

Там большая разница между декларацией и инициализацией переменных.

Когда вы объявляете переменную без инициализации ее value, ее тип будет undefined, поэтому, когда вы попытаетесь вызвать его или получить к нему, он будет давать undefined, потому что просто нет value определенного для переменной.

Вот почему он должен быть инициализирован:

var someObj = {};
var someTable = [];

Таким образом, вы можете рассматривать его как string, object или array согласно его инициализированному value.

Документация:

Пожалуйста, взгляните на переменные MDN Reference для дальнейшего чтения, где говорится:

Оператор var объявляет переменные, которые привязаны к текущим контекстам выполнения VariableEnvironment. Переменные Var создаются, когда их содержащая Лексическая среда создается и инициализируется неопределенной при создании. [...] Переменной, определенной переменной VariableDeclaration с инициализатором, присваивается значение ее инициализатора AssignmentExpression при выполнении VariableDeclaration, а не при создании переменной.

2

Вы путаетесь о том, где ошибка. В первом примере:

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 из [].

  • 1
    И последнее, причина, по которой они объявляются как {} и [] , это на самом деле инициализация, а не только объявление .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню