0. 前言
这篇文章是《你所不知道的JavaScript》读书笔记系列的第八篇文章。在这篇文章中,我想跟大家聊一聊JS中不为人知的语法细节。
- 《你所不知道的JavaScript》读书笔记(一):作用域和闭包(上)
- 《你所不知道的JavaScript》读书笔记(一):作用域和闭包(下)
- 《你所不知道的JavaScript》读书笔记(二):this指向问题
- 《你所不知道的JavaScript》读书笔记(三):对象和类(上)
- 《你所不知道的JavaScript》读书笔记(三):对象和类(下)
- 《你所不知道的JavaScript》读书笔记(四):类型与值
- 《你所不知道的JavaScript》读书笔记(五):强制类型转换
1. 语句和表达式
- 语句相当于英语中的句子,表达式相当于短语,运算符相当于标点符号和连接词
- 语句都有一个结果值,获得结果值最直接的方法时在浏览器开发控制台中输入语句,默认情况下控制台会显示所执行的最后一条语句的结果值
- 表达式的副作用是指某一行语句执行完之后除了结果值之外对程序产生的影响。大多数表达式本身没有副作用,但是把他放到语句中可能就会产生副作用了。例如:
var a = 2
var b = a + 3
这个例子中,a + 3
这个表达式的结果值是5,它本身是没有副作用的。但是,通过b = a + 3
将这个值赋值给变变量b
就产生了副作用。var b = a + 3
这一行代码的结果值是undefined
,但是却改变了b的值,也就是产生了副作用
- 有两种情况会用到大括号:
- 用大括号定义对象常量:
var a = { foo: bar() }
- 标签语句:当我们把定义对象常量的
var a =
去掉之后,大号里面的内容就变成了一个代码块。拿上面的例子来说,大括号去掉之后就变成了:
这段代码中,{ foo: bar() }
foo
是语句bar()
的标签。 - JSON的确是JavaScript语法的一个子集,但是JSON本身并不是合法的JavaScript语法
[] + {};
的执行结果是"[object object]";而{} + [];
的执行结果是0- 解构:
{..name}
,{...}
2. 运算符优先级
a && b || c
的执行顺序是&&
先执行,||
后执行a && b || c ? c || b ? a : c && b : a
的执行顺序是(a && b || c) ? (c || b) ? a : (c && b) : a
,因为&&
运算符的优先级高于||
,而||
的优先级有高于? :
- 多个同级运算符同时出现时:运算符的关联不是从左到右就是从右到左,这取决于组合是从左开始还是从右开始:
&&
运算符和||
运算符都是左关联的,即a && b && c
会被处理成(a && b) && c
? :
是右关联的,即a ? b : c ? d : e
会被处理成a ? b : (c ? d : e)
3. 其他
- JavaScript的错误类型包括
- 运行时错误:
- TypeError:变量类型使用错误
- RefrenceError:提前使用变量
- SyntaxError:符号错误
- 编译时错误:编译时错误可以采用
try…catch…
捕捉
- 运行时错误:
try...finally
:finally
中的代码总是会在try
之后执行,如果有catch
的话则在catch
之后执行,。也可以将finally
中的代码看作一个回调函数,即无论出现什么情况最后一定会被调用。try
中出现return
:
function foo() {
try {
return 42
}
finally {
console.log("Hello")
}
console.log("never runs")
}
console.log( foo() )
// Hello
// 42
这里 return 42
先执行,并将foo()
函数的返回值设置为42.然后try
执行完毕,接着执行finally
。最后,foo()
函数执行完毕,console.log()
显示返回值。