如果存在值,则使用该值,否则使用 or 运算符分配默认值。

11

我在一本书中发现了以下示例:

// Create _callbacks object, unless it already exists
var calls = this._callbacks || (this._callbacks = {});

我简化了它,这样我就不必使用特殊的对象作用域:

var a = b || (b = "Hello!");

当定义了变量b时,它可以正常工作。当未定义变量b时,它会出现错误并抛出一个ReferenceError。

ReferenceError: b is not defined

我有做错任何事吗?谢谢!

2个回答

11

在执行属性查找时,比如this._callback,如果this中不存在_callbacks属性,则会返回undefined。但是如果你只是查找一个裸名字,比如b,如果b不存在,则会返回引用错误。

这里的一个选项是使用带有typeof运算符的三元表达式,它将返回"undefined",如果操作数是尚未定义的变量。例如:

var a = typeof b !== "undefined" ? b : (b = "Hello!");

4
它应该以这种形式工作:

它应该以这种形式工作:

var b, a = b || (b = "Hello!", b);
//  ^ assign b
//                           ^ () and , for continuation
//                             ^ return the new value of b
//=>  result: a === b = "Hello!"

这将遮蔽任何全局的 b 并且实际上永远不会使用它。 另外,我认为对于如此简单的赋值语句来说,逗号是不必要的。 - Darkhogg
@Darkhogg 我假设 OP 已经在全局作用域中。 - John Dvorak
@JanDvorak 那你只是创建了 b,有什么必要在有条件地分配默认值呢? - Darkhogg
1
@Tobias 这是一个逗号表达式。它会评估所有的操作数并返回最后一个。 - John Dvorak
1
好的,我明白了。你定义了变量a和b,这样当b参与表达式时就不会再出现未定义的ReferenceError错误了。 - Xiphias
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接