我来到了这段代码,但我不太明白它的作用。
test.update = function(i)
{
return void 0 === i && (i = 3), 0 === i ? (..A..) : (..B..)
}
(..A..)和(.B..)只是我尚未发布的其他代码行。
假设i
的值为 0,函数将返回什么?
"void 0 === i && (i = 3)"有什么作用?特别(i = 3)
.这是否意味着if (void 0 === i)
是真的,i
可以得到3,i
将是3?那么逗号呢?我已经检查了这个问题,但我仍然不明白。
很抱歉有这么多问题,但我想有一个完整的答案,这样我就可以完全理解发生了什么。
谢谢
好的,首先让我们根据运算符优先级设置括号:
return (((void 0) === i) && (i = 3)), ((0 === i) ? A : B)
现在到单个操作
void 0
只需返回undefined
.我们也可以这样写:
undefined === i
这显然检查i
是否未定义。
i = 3
首先看起来像是比较,但实际上它是一个返回3
的作业。到目前为止,该行查找i
是否未定义,如果是,则为其分配值3
。
现在,以下逗号本身就是一个运算符。它从左到右计算所有表达式,并返回最后一个表达式(最右侧)。在这种情况下,最后一个表达式是0
和i
的比较。表示如果此时0
i
,则整个表达式的返回值为 true
。
最后有一个条件运算符,它是编写if .. else ..
的简短方法。
到目前为止,该行也可以写成:
if (i === undefined) {
i = 3;
}
if (i === 0) {
// return ( A )
}
else {
// return ( B )
}
只需运行它,看看第一件事是返回未定义,无论其余部分做什么
如果 i ===0,则运行 A,否则运行 B,如果 i ==",则 i=3 ->运行 b
var test= {}
test.update = function(i) {
return void 0 === i && (i = 3), 0 === i ? (console.log(i,"a")) : (console.log(i,"b"))
}
console.log("i is null, res:"+test.update(null));
console.log("no i, res:"+test.update());
console.log("i blank, res:"+test.update(""));
console.log("i=0,res:"+test.update(0));
console.log("i=1,res:"+test.update(1));
console.log("i=2,res:"+test.update(2));
console.log("i=3,res:"+test.update(3));
其余的都很重要,因为void
运算符计算表达式并返回undefined
。
,如果表达式是函数调用,例如
return void func();
然后调用该函数,void
返回undefined
,即使func
返回不同的东西。
我想它只是执行(.B..)语句块 无论传递什么 i 值。
-
void
运算符计算其操作数,然后返回undefined
不取决于评估结果; -
comma
运算符只是从左到右计算一件事,然后是另一件事(如var i = 0, j = 0;
) -
0 === i && (i = 3)
如果i
等于0
,则i
设置为3
-
0 === i ? (..A..) : (..B..)
执行A
或B
语句块,但如上所述,此时可以保证i
不等于0
。