Skip to content

JavaScript 冷知识

JavaScript 中不太为人知(有些不建议使用)的特性,在此收集一下。

标签语句(不建议使用)

此时,foo 被当作 obj 对象一个属性。

js
function bar() {}
const obj = {
  foo: bar()
}

当去掉赋值操作,{} 被当作是一个代码块解析,和 for/while 循环以及 if 条件语句中代码块的作用基本相同,此时 foo 是语句 bar()的标签(后面没有;)。

js
{
  foo: bar()
}

continue 和 break 语句都可以带一个标签,因此能够像 goto 那样进行跳转,但并非跳转到标签 foo 所在位置继续执行,而是“执行 foo 循环的下一轮循环。

js
foo: for (let i = 0; i < 4; i++) {
  for (let j = 0; j < 4; j++) {
    if (i === j) {
      continue foo
    }
    console.log(i, j)
  }
}
// 1 0
// 2 0
// 2 1
// 3 0
// 3 1
// 3 2

奇特的~运算符

~x 大致等同于-(x+1)

js
const arr = [1, 2, 3]

// 不够优雅
if (arr.indexOf(item => item === 3) > -1) {
  // ...
}

// 真不错
if (~arr.indexOf(item => item === 3)) {
  // ...
}