动态对象定义

时间:2018-02-12 09:40:15

标签: javascript variables undefined declaration

这是一个严肃的问题,它一直在唠叨我。在JavaScript中,您可以声明一个没有类型的变量。它的类型通常是动态的,取决于分配给它的更多值。

e.g

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 = [];

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

3 个答案:

答案 0 :(得分:2)

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

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

由于someObjundefined未声明),因此引发该错误。因此,您无法访问a上的媒体资源undefined

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

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

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

分别将它们定义为{}[]的原因可以解决您的问题,那就是您正在访问a的属性{}和索引{{1 } 0

答案 1 :(得分:2)

变量的声明初始化之间存在很大差异。

如果您声明变量而未使用value进行初始化,则其类型将为undefined,因此当您尝试调用或访问时,它将会给undefined,因为根本没有为变量定义value

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

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

因此,根据其初始化string,您可以将其视为objectarrayvalue

<强>文档

请查看variables MDN Reference进一步阅读,其中包含:

  

var语句声明了作用于正在运行的执行上下文的VariableEnvironment的变量。 Var变量在实例化包含词法环境时创建,在创建时初始化为未定义。 [...]在执行VariableDeclaration时,由VariableDeclaration定义的带有初始化程序的变量被赋予其初始化程序的AssignmentExpression 的值,而不是在创建变量时。

答案 2 :(得分:1)

1)Javascript中的数据类型不是动态的,它们是可变的。这意味着根据您应用于它们的操作类型,它们可以从某物变为另一种物体(例如,数字可以变为字符串,类似于:4 +'a')。

2)“错误”是未初始化变量的结果。在Javascript中执行此操作时:var something = 'a' 你正在做两个操作,一个声明和一个任务。如果您不进行分配,并且尝试访问已声明的对象的属性,则会引发错误。在您的情况下,您声明一个变量但未初始化为“编译器”无法访问“a”属性或位置1,因为它是undefined类型。