JavaScript入门——语句和表达式(二)

2018-03-20  本文已影响0人  黄昏少年

语句与表达式的区别是,表达式会产生一个值,语句不会。例如 var a = 1 + 1 是语句,右边是表达式。

控制语句:if switch while for do break return continue throw try catch

一个 try 只能有一个 catch,捕获所有(各种)异常。

假值

下列值被当做假:

其他值都被当作真,包括 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
上一篇下一篇

猜你喜欢

热点阅读