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(;;)