语句与表达式的区别是,表达式会产生一个值,语句不会。例如 var a = 1 + 1
是语句,右边是表达式。
控制语句:if
switch
while
for
do
break
return
continue
throw
try
catch
。
一个 try
只能有一个 catch
,捕获所有(各种)异常。
假值
下列值被当做假:
- false
- null
- undefined
- 空字符串
- 数字 0
- 数字 NaN
其他值都被当作真,包括 true
、字符串"false"
、空数组 []
,空对象 {}
。
相等
两组运算符 ===
、!==
和 ==
、!=
。===
只有在两个操作数类型相同且值相同时才会返回 true。但 ==
和 !=
在做比较时,如果操作数类型不同,会尝试做转换,转换规则非常奇怪。一些例子:
'' == '0' // false
0 == '' // true
0 == '0' // true
false == 'false' // false
false == '0' // true
false == undefined // false
false == null // false
null == undefined // true
' \t\r\n ' == 0 // true
建议,始终使用 ===
、!==
。永远不要使用 ==
、!=
。
赋值
赋值运算符的结合性是从右至左,也就是说,如果一个表达式中出现了多个赋值运算符,运算顺序是从右到左。因此,可以通过下面的方式来给多个变量赋值:
i=j=k=0
解构赋值(ES6)
解构(Destructuring)能将数组或对象匹配到变量。解构是错误容忍的:若找不到赋值 undefined
。
// 数组
var [a, ,b] = [1, 2, 3]
a === 1
b === 3
// 对象
var { op: a, lhs: { op: b }, rhs: c } = getASTNode()
// 对象,缩写
var {op, lhs, rhs} = getASTNode()
// 可以用于形参处
function g({name: x}) {
console.log(x)
}
g({name: 5})
// 错误容忍
var [a] = []
a === undefined
// 错误容忍+默认值
var [a = 1] = []
a === 1
// 错误容忍+默认参数
function r({x, y, w = 10, h = 10}) {
return x + y + w + h;
}
r({x:1, y:2}) === 23
switch
switch 结构如下:
switch(value) {
case 1:
doSome()
break
case 2:
doSome()
break
default
doSome()
}
case 比较使用 ===
运算符,即严格比较。
JavaScript 的 switch 匹配一个 case 后,会继续检测后续的 case,除非显式使用 break
。
一个 switch 是一个语句块,case 不形成新的语句块或作用域,因此不要 case 中使用 let
定义变量。例如
switch(value) {
case 1:
let a = 1
doSome()
break
case 2:
let a = 1 // 报错!a 已声明!
doSome()
break
default
doSome()
}
循环
基本 for 循环:
for(initializtion; condition; increment)
for-in 枚举对象的所有属性名(或键名)。用于数组,枚举所有的 index。
通常需要检查 object.hasOwnProperty(varibale)
来确定这个属性名就是该对象的成员,还是从其原型链中得到的。
for (myvar in obj) {
if (obj.hasownProperty(myvar)) {
...
}
}
for-of 可以遍历可迭代的对象,最常见的例子是数组。
let a = [1, 2, 3]
for(let item of a) console.log(item) // 1 2 3
三元运算符与布尔短路
JavaScript 常利用布尔短路和动态类型的特性,编写快捷代码,如:
window.onload = window.onload || funciton() {...}
var a = obj && obj.field || ""
如果 obj
存在则尝试访问它的一个字段。否则,或者字段本身为空,返回空字符串。
三元运算符即 ?:
,与 JavaScript 代码中常见的快捷写法 a && a.b || c
并不一定等同。比如:
var a = obj && obj.field || -1
如果 obj
存在,但 obj.field
为 0,结果将是 -1
。因为 0 也是假值。但用三元运算符就没有这个问题。
var a = obj ? obj.field : -1
网友评论