这是一个严肃的问题,它一直在唠叨我。在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 = [];
我希望对这个问题有一个很好的解释。谢谢你的回答。
答案 0 :(得分: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
的属性{}
和索引{{1 } 0
。
答案 1 :(得分:2)
变量的声明和初始化之间存在很大差异。
如果您声明变量而未使用value
进行初始化,则其类型将为undefined
,,因此当您尝试调用或访问时,它将会给undefined
,因为根本没有为变量定义value
。
这就是它应该被初始化的原因:
var someObj = {};
var someTable = [];
因此,根据其初始化string
,您可以将其视为object
,array
或value
。
<强>文档强>
请查看variables MDN Reference进一步阅读,其中包含:
var
语句声明了作用于正在运行的执行上下文的VariableEnvironment的变量。 Var变量在实例化包含词法环境时创建,在创建时初始化为未定义。 [...]在执行VariableDeclaration时,由VariableDeclaration定义的带有初始化程序的变量被赋予其初始化程序的AssignmentExpression 的值,而不是在创建变量时。
答案 2 :(得分:1)
1)Javascript中的数据类型不是动态的,它们是可变的。这意味着根据您应用于它们的操作类型,它们可以从某物变为另一种物体(例如,数字可以变为字符串,类似于:4 +'a')。
2)“错误”是未初始化变量的结果。在Javascript中执行此操作时:var something = 'a'
你正在做两个操作,一个声明和一个任务。如果您不进行分配,并且尝试访问已声明的对象的属性,则会引发错误。在您的情况下,您声明一个变量但未初始化为“编译器”无法访问“a”属性或位置1,因为它是undefined
类型。