语法

2018-12-14  本文已影响0人  广州芦苇科技web前端

标签: 语法,语句,表达式,you don't know javascript


语句和表达式


var a = 3 * 6;
var b = a;
b;

表达式:

  1. 第一行 3 * 6
  2. 第二行 a
  3. 第三行 b

语句:
这三行代码叫做包含表达式的语句。

语句的结果值

> var a = 30
< undefined

> a = 40
< 40

{..}代码块的结果值

> {
    var b = 10;
    b = 20
  }
< 20
var result = {
  var b = 10;
  b = 20
}
// SyntaxError
var result = eval(`{
  var b = 10;
  b = 20
}`)

result // 20

表达式的副作用

var a = 30;

a++; // 30
a; // 31

++a; // 32
a; // 32

赋值运算符

var a,b,c

a = b = c = 30;
// c = 30的副作用是将30复制给c,返回值是表达式c = 30的结果值,同样原理左依次执行。
function foo (a) {
  return a > 20
}

var num = 30

if (num > 10) {
  var result = foo(num)
  if (result) {
    console.log(result)
  }
}

上面的两个if可以合并成

var result
if (num > 10 && (result = foo(num))) {
  console.log(result)
}

大括号

对象字面量

  var a = {
    foo: 1
  }

代码块

{
  let a = 10;
  a
}

对象解构

let {a, b} = {a: 10, b: 20}

else if问题

if (a) console.log(a)

if (a) {

} else if (b) {

}

// 规范写法
if (a) {

} else {
  if (b) {

  }
}

大括号的“歧义”

function foo () {

}

{
foo: foo()
}

上面代码像是创建了一个对象但是没有变量接收,但是实际上是{}代表了一个代码块,而foo:在正常代码中写法显得奇怪但是没有报错,是因为这里有个我们不常用的label代码标签。

代码标签在循环中的作用

for (var i = 0; i < 3; i++) {
  for (var j = 0; j < 3; j++) {
    if (i === j) {
      break;
    }
    console.log(i,j)
  }
}

// 1 0
foo: for (var i = 0; i < 2; i++) {
  for (var j = 0; j < 2; j++) {
    if (i === j) {
      break foo; // 表示跳出标签为foo的循环,即外层循环
    }
    console.log(i,j)
  }
}
// 没有打印任何i,j

分号问题

自动分号

纠错机制

异议

json语法在控制台直接输入的报错解释

书中的说法:
以下代码在控制台直接输入会报错,因为{..}被解析成代码块,foo被解析成标签,而标签不能带有引号

> {
  "a": 20
  }

实际的结果:

chrome中会解析成创建了一个对象和{a:20}相同。

以下两种{}的运行结果
报错:

> ;{
    "a": 20
  }

不报错:

> ;{
    a: 20
  }
< 20

强制类型转换的问题

[] + {} // "[object Object]"
{} + [] // 0

{} + [] 中{}被视为代码块,空代码块被强制类型转换后的值怎么确定的不太明确。
但可以测试空代码块的返回值是undefined

> eval("{}")
< undefined

> ;{}
< undefined

往期精彩回顾


叶茂 广州芦苇科技web前端工程师

上一篇 下一篇

猜你喜欢

热点阅读