Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用值(如果存在),否则使用or运算符指定默认值_Javascript_Variable Assignment_Or Operator - Fatal编程技术网

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在未定义之前参与表达式时不再导致引用错误。