什么返回 void 0 === i && (i = 3), 0 === i ? ( ..A.. ) : ( ..B.. ) 做吗?

Posted

技术标签:

【中文标题】什么返回 void 0 === i && (i = 3), 0 === i ? ( ..A.. ) : ( ..B.. ) 做吗?【英文标题】:What does return void 0 === i && (i = 3), 0 === i ? ( ..A.. ) : ( ..B.. ) do? 【发布时间】:2017-06-19 08:39:22 【问题描述】:

我来到了这段代码,但我不太明白它的作用..

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?那么逗号呢?我已经检查了这个question,但我还是不明白。

很抱歉有这么多问题,但我想得到一个完整的答案,这样我才能完全理解发生了什么。

谢谢

【问题讨论】:

我猜它只是执行 (..B..) 语句块,无论 i 值被传递。 void 0 === i 似乎检查i 是否为undefined。当i 未未定义时,i = 3i 设置为数字 3。 0 === i 检查i 是否为0,然后检查(..A..)(..B..)。此返回使用comma 和ternary operations。 如果你想计算表达式时使用void expression,但返回的值总是undefined 【参考方案1】:

好的,首先我们根据operator precedence设置括号:

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】:

只要运行它,看看第一件事是返回 undefined 不管其余的做什么

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

【讨论】:

【参考方案3】:

其余部分很重要,因为void operator 计算表达式并返回undefined

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

return void func();

然后函数被调用并且void 返回undefined,即使func 返回的是不同的东西。

【讨论】:

【参考方案4】:

我猜它只是执行 (..B..) 语句块,无论传递什么 i 值。

void 运算符计算其操作数,然后返回 undefined 不取决于评估结果; comma 运算符只评估一件事,然后从左到右评估另一件事(如var i = 0, j = 0;) 如果i 等于0,则0 === i && (i = 3)i 设置为3 0 === i ? (..A..) : (..B..) 执行AB 语句块,但如上所述,此时保证i 不等于0

【讨论】:

以上是关于什么返回 void 0 === i && (i = 3), 0 === i ? ( ..A.. ) : ( ..B.. ) 做吗?的主要内容,如果未能解决你的问题,请参考以下文章

在c语言中 if(0)是啥意思

排序专栏:希尔排序

一个线程多次调用一个函数

一种功能交换功能,在某些情况下除外

[JavaScript] void 0 与 undefined

第十四,十五周作业