分配现有或空对象

时间:2012-11-22 10:46:21

标签: javascript

这可能是重复但我不知道如何搜索它。

为什么

var test = test || {};

工作,但

var test = testing || {};

抛出错误?在定义时,testtesting都未定义。

修改

抛出的错误是“参考错误:未定义测试”

3 个答案:

答案 0 :(得分:3)

在不存在的意义下变量未定义的变量与保持值undefined的变量之间存在差异。

在您的第一个示例中,您使用test声明var,以便在评估=右侧的表达式时,变量test存在,但其值为{ {1}}。

在你的第二个例子中,你根本没有定义undefined,因此错误。

编辑:我觉得可能进一步的解释不会受到伤害。

为了简化,JavaScript引擎需要两次通过代码。第一遍是解析/编译阶段,然后是变量声明而不是赋值。第二遍是实际执行,然后发生分配。这导致了一种通常被称为“变量提升”的效果 - 就好像JS引擎将声明“提升”到其范围的顶部但仍然进行了分配。

关于这样的代码点:

testing

...它基本上是说“var test = test || {}; 是否已经存在真值?如果是,请使用它,否则将其设置为新的空对象。”

JS引擎不介意在同一范围内多次声明同一个变量 - 它基本上忽略了第二个声明但不忽略任何赋值包含在第二个声明中。因此,如果在某个其他脚本块中声明test,也许在单独的JS包含文件中,那么所讨论的行只会将test赋给自己(假设它具有真值,其中所有对象都是真实的)。但如果它尚未在其他地方声明,它仍然会因当前test语句而存在,但在当前分配之前它将为var,因此undefined运算符将返回右侧 - 操作数,||

答案 1 :(得分:1)

这是由var关键字引起的。 因为声明了变量,所以它也存在,尽管值未定义。然后||做的是检查真实性,当它发现对象未定义时,它会为你提供一个新对象。

后者完全相同,但由于你在“一行”上执行它,testing对象在评估时没有被定义,因此会抛出异常。

答案 2 :(得分:1)

var test = test || {};

此处,testdeclared但未defined

但在,

var test = testing || {};

没有任何testing的引用,您仍在尝试分配其值。

第一种情况的相应代码是,

var testing;  // See testing is still undefined
var test = testing || {};