奇怪的JS:0 ? 1 : 2 ? 3 : 4

168 阅读2分钟

奇怪的JS:0 ? 1 : 2 ? 3 : 4

今天在看demo的时候,看到了一个表达式

type: isActive ? 'paragraph' : isList ? 'list-item' : format,

我:???

这是啥奇怪的玩意,虽然大概知道他要表达的是啥意思,但是脑袋总是懵懵的。于是打算潜下心来看看这个到底是个啥

为了简单语义,我自己写了个demo

console.log(0 ? 1 : 2 ? 3 : 4 ? 5 : 6)

我第一感觉,这个表达式是根据根据bollean排序,会首先打印出非false的值,然后根据三元表达式的特性,所以应该是2?于是我敲下命令

node test.,js // 3

哦好吧,结果是3。于是我又测试了几个实例:

console.log(0 ? 1 : 2 ? 3 : 4 ? 5 : 6) //3
console.log(1 ? 1 : 2 ? 3 : 4 ? 5 : 6) // 1
console.log(10 ? 1 : 2 ? 3 : 4) // 1
console.log(0 ? 0 : 2 ? 3 : 4) // 3
console.log(0 ? 1 : 2 ? 3 : 4) // 3

有了这些例子,大概就能猜出他的逻辑了,接下来我以第一个例子为例解释:

0 ? 1 : (2 ? 3 : 4 ? 5 : 6)

首先他是一个二重三元表达式,我们先判断level-1。首先是0,是个false的值,根据三元表达式的逻辑,会跳过1然后我们来到了:

2 ? 3 : 4 ? 5 : 6

这时候,2是一个true的值,我们再把后面的看做两部分 3 : (4 ? 5 : 6)

这时候我们就得出了最终结果是3。

奇怪,那后面的4 ? 5 : 6呢?他也是一个表达式,3是true,我们是不是还要再做一次运算,得出最终结果5?

刚开始我特色这么想的,但是其实三元表达式,只要发现了true,就不会再继续下去了,所以后面的那个表达式就不会被执行了

那我非要得出456的其中一个值呢?

其实也简单,只要我们把他第一次跳转的时候,给他一个false的值,这个表达式的运算就能再跳跃一次,比如这样:

console.log(0 ? 1 : 0 ? 3 : 4 ? 5 : 6)

他的执行逻辑是:0 -> 0 -> 4 -> 5

最终就能得到比较靠后的数字了。

哦,回到主题,那为什么这个demo要写成这样呢?秀肌肉吗?

哈哈,其实好像还真是的,我们再看一次他的表达式isActive ? 'paragraph' : isList ? 'list-item' : format,

其实他要表达的意思是这样的:

if (isActive) {
  return 'paragraph'
} else {
  if (isList) return 'list-item'
  else return 'format'
}

这么一看,是不是清晰多了。一行代码的逻辑就解决了两层if嵌套。大佬果然还是大佬啊哈哈。

又是感慨自己是菜鸟的一天~