Javascript 指定现有对象或空对象

Javascript 指定现有对象或空对象,javascript,Javascript,这可能是一个重复,但我不知道如何搜索它 为什么 var test = test || {}; 工作,但是 var test = testing || {}; 抛出错误?就定义而言,test和testing都是未定义的 编辑 抛出的错误是“参考错误:未定义测试”这是由于var关键字引起的。 因为变量是声明的,所以它也存在,尽管值未定义。|接下来要做的是检查真实性,当它发现对象未定义时,它会给你一个新的对象来处理 后者的作用与此完全相同,但由于您是在“一行”上进行测试,测试对象在求值时没有定义,

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

为什么

var test = test || {};
工作,但是

var test = testing || {};
抛出错误?就定义而言,
test
testing
都是未定义的

编辑


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

这是由于
var
关键字引起的。 因为变量是声明的,所以它也存在,尽管值未定义。
|
接下来要做的是检查真实性,当它发现对象未定义时,它会给你一个新的对象来处理


后者的作用与此完全相同,但由于您是在“一行”上进行测试,
测试对象在求值时没有定义,因此抛出异常。

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

在第一个示例中,您使用
var
声明
test
,这样当计算
=
右侧的表达式时,变量
test
存在,但其值
未定义

在第二个示例中,您根本没有定义测试,因此出现了错误

编辑:我突然想到,也许进一步的解释不会有什么坏处

为了简化,JavaScript引擎对代码进行两次遍历。第一步是解析/编译阶段,然后是变量声明,而不是赋值。第二步是实际执行,然后才发生赋值。这导致了一种通常被称为“变量提升”的效果——这就好像JS引擎将声明“提升”到其作用域的顶部,但仍然执行适当的赋值

关于代码的要点,如下所示:

var test = test || {};
…它的基本意思是“测试是否已经存在一个真实值?如果存在,请使用它,否则将它设置为一个新的空对象。”

JS引擎不介意同一变量是否在同一范围内多次声明——它基本上忽略了第二个声明,但不忽略第二个声明中包含的任何赋值。因此,如果
test
是在其他脚本块中声明的,可能是在一个单独的JS include文件中,那么所讨论的行只会将
test
赋值给它自己(假设它有一个truthy值,其中所有对象都是truthy)。但是如果它没有在其他地方声明,它仍然会作为当前
var
语句的结果而存在,但在当前赋值之前它将是
未定义的,因此
|
操作符返回右手操作数
{}

var test = test || {};
这里,
test
已被
声明
,但未被
定义

但是在

var test = testing || {};
没有任何关于
测试的参考,您仍在尝试分配它的值

第一种情况的对应代码为

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

@马特林:但我也没有定义
测试,或者我定义了吗?@nozzleman:什么?只需复制并粘贴
var test=testing | |{}到你的控制台。@Amberlamps是的,没关系,我把你的问题搞错了,我还以为你在…
之前声明了
var测试。
在不存在的意义上未定义的变量和持有未定义值的变量之间是有区别的。
。这是电话线+1.