JavaScript流程控制语句(红宝书笔记&摘录)

198 阅读7分钟

JavaScript流程控制语句

专栏:JavaScript基础

[JavaScript基础](写文章 - JavaScript流程控制语句 - 掘金 (juejin.cn))

关于学习JavaScript,与c语言进行求同和求异;

 操作符

一元操作符

只操作一个值的操作符叫一元操作符(unary operator)。

1.递增/递减操作符

有两种分别是前缀版和后缀版(同c语言), 前缀操作,变量的值都会在语句被求值前改变。

let age = 29
++age   // 等于 age = age + 1

let age = 29
let anotherAge = --age + 2

console.log(age)         // 28
console.log(anotherAge)  // 30

后缀操作与前缀操作的主要区别在于,后缀版递增和递减在语句被求值后才发生


let num1 = 2
let num2 = 20
let num3 = num1-- + num2
let num4 = num1 + num2

console.log(num3)      // 22
console.log(num4)      // 21

这4个操作符可以作用于任何值,意思是不限于整数,字符串、布尔值、浮点值,甚至对象都可以。递增和递减操作符遵循如下规则。(这点事不同于c的)

  • 对于字符串,如果是有效的数值形式,则转换为数值再应用改变。变量类型从字符串变为数值。
  • 对于字符串,如果不是有效的数值形式,则将变量的值设置为NaN。变量类型从字符串变为数值。
  • 对于布尔值,如果是false则转换为0再应用改变。变量类型从布尔值变为数值。
  • 对于布尔值,如果是true则转换为1再应用改变。变量类型从布尔值变为数值。
  • 对于浮点值,加1或减1。
  • 如果是对象,则调用valueOf()方法取得可以操作的值。对得到的值应用上述规则。如果是NaN,则调用toString()并再次应用其他规则。变量类型从对象变为数值。

2.一元加和减

一元加由一个加号(+)表示。对数值没有任何影响。 如果将一元操作符应用到非数值,则会执行与使用Number()转型函数一样的类型转换。

let s1 = '01'
let s2 = '1.1'
let s3 = 'z'
let b = false
let f = 1.1
let o = {
    valueOf(){
        return -1
    }
}

s1 = +s1        // 值变成数值1
s2 = +s2        // 值变成数值1.1
s3 = +s3        // 值变成NaN
b = +b	        // 值变成数值0
f = +f          // 不变,还是1.1
o = +o          // 值变成数值-1 

位操作符(同c 这里建议可以看看计算机组成原理,里面有详解)

1. 按位非

let num1 = 25		// 二进制00000000000000000000000000011001
let num2 = ~num1            // 二进制11111111111111111111111111100110
console.log(num2)           // -26

按位非的最终效果是对数值取反并减1

2. 按位与

按位与操作符用和号(&)表示。

3. 按位或

按位或操作符用管道符(|)表示。

4.按位异或

按位异或操作符用脱字符(^)表示。

5. 有符号左移右移

有符号左移:<<

有符号右移:>>

6. 无符号左移右移

无符号左移:<<<

无符号右移:>>>

布尔操作符

布尔操作由3个: 逻辑非、逻辑与和逻辑或。

1. 逻辑非

逻辑非操作符由一个叹号(!)表示,可用于任何值。这个操作符始终返回布尔值。逻辑非操作符首先将操作数转换为布尔值,然后取反。逻辑非操作符遵循以下规则:

  • 如果操作数是对象,则返回false
  • 如果操作数是空字符串,则返回true
  • 如果操作数是非空字符串,则返回false
  • 如果操作数是数值0,则返回true
  • 如果操作数是非0数值(包括Infinity),则返回false
  • 如果操作数是null,则返回true
  • 如果操作数是NaN,则返回true
  • 如果操作数是undefind,则返回true

2. 逻辑与

逻辑与操作符由两个和号(&&)表示。 逻辑与操作符是一种短路操作符,如果第一个运算子的布尔值为true,则返回第二个运算子的值(注意是值,不是布尔值);如果第一个运算子的布尔值为false,则直接返回第一个运算子的值,且不再对第二个运算子求值 。 eg1:

let found = true
let result = (found && someUndeclaredVariable)   // 这里会出错
console.log(result)      // 不会执行这一行

eg2:

let found = false
let result = (found && someUndeclaredVariable)   // 这里不会出错
console.log(result)      // 会执行这一行

3. 逻辑或

逻辑或操作符由两个管道符(||)表示。 逻辑或操作符是一种短路操作符,如果第一个运算子的布尔值为false,则返回第二个运算子的值(注意是值,不是布尔值);如果第一个运算子的布尔值为true,则直接返回第一个运算子的值,且不再对第二个运算子求值 。 逻辑或同样也具有短路的特性。 利用逻辑或的特性,可以避免给变量赋值null或undefind eg1:

let myObject = preferredObject || backupObject

乘性操作符

1. 乘法 *

2. 除法 /

a. 0/0  ->NaN
b. 3/0 ->Infinity/-Infinity

3. 取模 %

指数操作符 **

加性操作符

1. 加法操作符

加法操作符(+)用于求两个数的和。

如果两个操作数都是数值,加法操作符执行加法运算并根据如下规则返回结果。

  • 如果有任一操作数是NaN,则返回NaN
  • 如果是Infinity加Infinity,返回Infinity
  • 如果是-Infinity加-Infinity,返回-Infinity
  • 如果是Infinity加-Infinity,返回NaN
  • 如果是+0 加 +0,返回+0
  • 如果是-0 加 +0,返回+0
  • 如果是-0 加 -0,返回-0

不过,如果有一个操作数是字符串,则要应用如下规则:

  • 如果两个操作数都是字符串,则拼接
  • 如果只有一个是字符串,则将另一操作数转换为字符串,再拼接。

如果有任一操作数是对象、数值或布尔值,则调用它们的toString()方法以获取字符串,对于undefind和null则调用String()函数,分别获取“undefind"和”null“

2. 减法操作符

简单记忆,减法操作符会尽力将两个操作数转成数值(Number())。会优先调用对象的valueOf()方法,如果没有valueOf()则调用toString()方法,再将获得的值变为数值。如果操作数存在NaN,返回NaN.

let result1 = 5 - true    // true被转换成1, 结果是4
let result2 = NaN - 1     // NaN
let result3 = 5 - ''      // ''被转换成0, 结果是5
let result4 = 5 - null    // null被转换成0,结果是5

关系操作符

1. 等于和不等于(== , !=)

等于和不等于在比较时会进行类型转换。 简单记忆,如果两个操作数不都是字符串,则尽力将两边的操作符转为数字。null只和null或undefind相等,undefind只和undefind或null相等。NaN不和任何值相等。

true == 1        // true, 因为会把true转为1
NaN == NaN       // false, NaN不和任何值相等
"5" == 5         // true, 会把"5"转为5

2. 全等和不全等(===, !==)

全等和不全等在比较时会首先判断数据类型是否相同,不相同则返回false。但是NaN仍然不和NaN相等。

5” === 5        // false, 数据类型不同

 条件操作符(=)

复合赋值操作符不会提升性能,仅仅简写语法。

逗号操作符

用于执行多个操作

语句(基本同c)

if语句

if语句是使用最频繁的语句之一,语法如下

if(condition) statement1 else statement2

其中es6会自动转换成为布尔值。(Boolean())

do-while语句

while语句

for循环

格式如下

for(initialization;expression;post-loop-expression){
    statement;
}

初始化,条件表达式,循环表达式都不是必需的

死循环

for(;;)

模拟while

for(;i<count;)

for-in语句

用于枚举对象中的非符号键属性

for-of语句

用于遍历可迭代的对象的元素

标签语句

label

label;statement

start

start: for(;;)

break和continue语句