动态对象定义

dynamic object definition

这是一个严肃的问题,困扰了我一段时间。在 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 = [];

我希望对这个问题有一个很好的解释。感谢您的回答。

您对抛出错误的位置感到困惑。在你的第一个例子中:

var someObj;
someObj.a = 'hello world'; // the error is thrown here

抛出该错误是因为 someObjundefined 不是 未声明)。因此,您无法在 undefined.

上访问 属性 a

同样的解释适用于你的第二个例子:

var someTable;
someTable[0] = 'hello world'; // the error is thrown here

您正在尝试访问 undefined 的索引 0

之所以将它们分别定义为 {}[] 解决了您的问题,是因为您随后访问了 属性 a of {}[] 的索引 0

变量的声明初始化有很大区别。

当你声明一个变量而不用 value 初始化它时,它的类型将是 undefined所以当你尝试调用它或访问它时,它会给出 undefined,因为根本没有为变量定义 value

这就是它应该被初始化的原因:

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

因此您可以根据其初始化的 value.

将其视为 stringobjectarray

文档:

请查看 variables MDN Reference 进一步阅读,其中写着:

A var statement declares variables that are scoped to the running execution context’s VariableEnvironment. Var variables are created when their containing Lexical Environment is instantiated and are initialized to undefined when created. [...] A variable defined by a VariableDeclaration with an Initializer is assigned the value of its Initializer’s AssignmentExpression when the VariableDeclaration is executed, not when the variable is created.

1) Javascript 中的数据类型不是动态的,它们是可变的。这意味着根据您对它们应用的操作类型,它们可以从某种东西变成另一种东西(例如,一个数字可以变成一个字符串,做这样的事情:4 + 'a')。

2) "error" 是变量未初始化的结果。在 Javascript 当你这样做时:var something = 'a' 您正在执行两个操作,一个声明和一个赋值。如果您不执行分配并尝试访问您声明的对象的 属性 ,它将引发错误。在您的情况下,您正在声明一个变量但未将其初始化为 "compiler" 无法访问 "a" 属性 或位置 1,因为它的类型为 undefined