javascript - 分配现有或空对象

标签 javascript

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

为什么

var test = test || {};

工作,但是

var test = testing || {};

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

编辑

抛出的错误是“引用错误:测试未定义”

最佳答案

undefined variable (即不存在的变量)与保存值未定义的变量之间是有区别的。

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

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

编辑:我认为进一步的解释也许不会有什么坏处。

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

至于这样的代码:

var test = test || {};

...它基本上是在说“test 是否已经存在并具有真值?如果是,则使用它,否则将其设置为一个新的空对象。”

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

关于javascript - 分配现有或空对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13511029/

相关文章:

javascript - 用另一个指令包装 Angular 2+ 指令

javascript - 在 jquery 中查找动态复选框,但只使用一个函数?

javascript - html5 视频 - 使整个视频可以在 Android 上点击播放?

javascript - JS中闭包和匿名函数有什么区别

javascript - 根据文本输入动态改变图片

javascript - 使用奇数和偶数逻辑执行 2 次 ng-repeat 循环

javascript - 我真的不知道javascript闭包

对象引用的 Javascript 字符串(没有 eval() 或索引)

javascript - 更新 redux 状态

javascript - 如何动态更新其他页面的内容