“return void 0 === i && (i = 3), 0 === i ? ( ..A.. ) : ( ..B.. )” 是什么意思?

3

我看了这段代码,但是不太理解它的作用...

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? 那逗号又是怎么回事呢? 我查了一下这个问题,但我还是不明白。

对不起,问题比较多,但我希望得到完整的答案,以便完全理解发生了什么。

谢谢


1
我猜无论传递什么i值,它只是执行(..B..)语句块。 - pttsky
void 0 === i 看起来是在检查 i 是否为 undefined。当 i 不是 undefined 时,i = 3i 设置为数字 3。 - evolutionxbox
0 === i 检查 i 是否为 0,然后执行 (..A..)(..B..)。此返回值使用 逗号操作符三元运算符 - evolutionxbox
2
如果您想评估表达式,但返回的值始终为“未定义”,则可以使用“void expression”。 - Kaddath
4个回答

5

首先,让我们根据运算符优先级设置括号:

return (((void 0) === i) && (i = 3)), ((0 === i) ? A : B)

现在来看单个操作。
void 0

仅返回undefined。我们也可以这样写:

undefined === i

这显然是检查i是否未定义。

i = 3

看起来像是一个比较,但实际上它是一个赋值语句,返回值为3。目前这一行代码检查i是否未定义,如果是,则将其赋值为3

现在逗号成为了一个独立的运算符。它从左到右计算所有表达式,并返回最后一个(最右边的)。在这种情况下,最后一个表达式是0i的比较。这意味着如果此时i0,整个表达式的返回值为true

最后出现了一个条件运算符,这是一种简写形式的if .. else ..语句。

因此,这一行代码也可以写成:

if (i === undefined) {
  i = 3;
}
if (i === 0) {
  // return ( A )
}
else {
  // return ( B )
}

2

只需运行它并查看第一件事返回的是未定义,不管其余内容如何。

如果 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));


1
我想它只是执行(..B..)语句块,无论传递什么i的值。
  • void运算符评估其操作数,然后返回undefined,不依赖于评估结果;
  • comma运算符只评估一件事情,然后按从左到右的顺序评估另一件事情(如var i = 0, j = 0;
  • 0 === i && (i = 3)如果i等于0,则将i设置为3
  • 0 === i ? (..A..) : (..B..)执行AB代码块,但如上所述,此时保证i不等于0

1

剩下的部分很重要,因为void运算符会评估表达式并返回undefined

例如,如果表达式是函数调用,比如

return void func();

然后调用该函数,void 返回 undefined,即使 func 返回不同的内容。

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