情况1的代码:
var s =function(options){
options || options = {}
}
s();
情况1的结果:
Uncaught ReferenceError: Invalid left-hand side in assignment
情况2的代码:
var s = function(options){
if(!options){
options = {};
}
console.log(options);
}
s();
情况2的结果:
Object {}
这两种情况为啥不是都能用啊?感觉功能相似。
到底哪里错了啊?
情况一的问题在于运算符优先级,我们先来看看文档是怎么说的:
从表格里看到,逻辑运算符||
的优先级要比赋值运算符=
的优先级高,所以运算的行为实际是这样的:
(options || options) = {}
(options || options)
运算后的结果是一个boolean
值的结果,并且是一个"左值"(即:不可被赋值的数据),于是当你想把{}
赋值给她时,就报错了。
var options = options || {};
提示已经说的非常清楚了,等号左边的值无效。
实际上情况1的代码等价于:
(options || options)={};
等号左边的运算结果没有对象空间,因此其不可写,自然无法赋值喽。
正确的写法应该手动指定运算结果存储位置:
options=options||{};
options || (options = {})
或者 options = options || {}
或者
if(!options){
options = {};
}