Javascript 使用值(如果存在),否则使用or运算符指定默认值
我在一本书中发现了这个例子:Javascript 使用值(如果存在),否则使用or运算符指定默认值,javascript,variable-assignment,or-operator,Javascript,Variable Assignment,Or Operator,我在一本书中发现了这个例子: // 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
// 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
我做错什么了吗?谢谢大家! 它应该以这种形式工作:
var b, a = b || (b = "Hello!", b);
// ^ assign b
// ^ () and , for continuation
// ^ return the new value of b
//=> result: a === b = "Hello!"
执行类似于
this.\u callback
的属性查找时,如果this
的\u callbacks
属性不存在,您将得到未定义的。但是,如果您只是在诸如b
之类的裸名称上进行查找,那么如果b
不存在,您将得到一个引用错误
这里的一个选项是使用带有typeof
运算符的三元数,如果操作数是未定义的变量,它将返回“未定义”
。例如:
var a = typeof b !== "undefined" ? b : (b = "Hello!");
这将影响任何全局b
,并且永远不会实际使用它。另外,我认为逗号对于这样一个简单的赋值是不必要的。@Darkhogg我假设OP是全局的scope@JanDvorak那么您只是在创建b
,有条件地指定默认值有什么意义呢?@Tobias这是一个逗号表达式。它计算所有操作数并返回最后一个好的,我知道了。您定义了a和b,以便b在未定义之前参与表达式时不再导致引用错误。