常用操作符
2022年10月14日大约 11 分钟
常用操作符
一元操作符
递增操作符
- 前置型 ++i
- 后置型 i++
递减操作符
- 前置型 --i
- 后置型 i--
递增递减操作规则
- 在应用于一个包含有效数字字符的字符串时,现将其转化为十进制数字值,在执行加减 1 的操作,字符串变量变成数值变量
- 在应用于一个不包含有效数字字符的字符串时,将变量设置为 NaN,字符串变量变成数值变量
- 在应用于布尔值 false 时,现将其转化为 0 再执行加减 1 的操作,布尔值转化为数值变量
- 在应用于布尔值 true 时,现将其转化为 1 再执行加减 1 的操作,布尔值转化为数值变量
- 在应用于浮点数值时,执行加减 1 的操作
- 在应用于对象时,先调用对象的 valueOf()以取得一个可供操作的值。然后对该值应用前述规则 。如果结果我是 NaN,则在调用 toString()方法后在应用前述规则。如果结局仍是 NaN,则在调用 toString()方法后再应用前述规则。对象变量变成数值变量
注意
- 前置型操作时,递增递减操作都是在包含他们的语句求值之前执行的
- 后置型操作时,递增递减操作都是在包含他们的语句求值之后执行的
{
let age = 29
let anotherAge = --age + 2
console.log('age', age) // 28
console.log('anotherAge', anotherAge) // 30
}
{
let age = 29
let anotherAge = age-- + 2
console.log('age', age) // 28
console.log('anotherAge', anotherAge) // 31
}
{
let age = 29
let anotherAge = ++age + 2
console.log('age', age) // 30
console.log('anotherAge', anotherAge) // 32
}
{
let age = 29
let anotherAge = age++ + 2
console.log('age', age) // 30
console.log('anotherAge', anotherAge) // 31
}
布尔操作符
- 一共有 3 个
- 非( ! )
- 与( && )
- 或( || )
逻辑非( ! )
- 无论这个值是什么数据类型,这个操作符都会返回一个布尔值
- 首先将它的操作数转换为一个布尔值,而后对其求反
- 两个逻辑非操作符可以得到这个值对应的布尔值
逻辑非操作符返回规则
操作数 | 操作符返回值 |
---|---|
对象 | false |
空字符串 | true |
非空字符串 | false |
数值 0 | true |
任意非 0 数值(包括 Infinity) | false |
null | true |
NaN | true |
undefined | true |
逻辑与( && )
- 有两个或以上操作数
- 逻辑与操作可以应用于任何类型的操作数,而不仅仅是布尔值
- 在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值
- 该操作属于短路操作,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值
- 如果第一个操作数是 false ,则结果一定是 false
- 与运算返回第一个假值,如果没有假值就返回最后一个值
- 与运算 && 的优先级比或运算 || 要高。 #####逻辑与真值表
第一个操作数 第二个操作数 结果 true true true true false false false true false false false false
#####当有一个值不是布尔值的时候返回情况
- 如果第一个数是对象,则返回第二个操作数
- 如果第二个操作数是对象,则只有在第一个操作数的求值结果为 true 的情况下才会返回该对象
- 如果两个操作数都是对象,则返回第二个操作数
- 如果有一个操作数是 null ,则返回 null
- 如果有一个操作数是 NaN ,则返回 NaN
- 如果有一个操作数是 undefined ,则返回 undefined
逻辑或( || )
- 有两个或以上操作数
- 逻辑与操作可以应用于任何类型的操作数,而不仅仅是布尔值
- 在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值
- 该操作属于短路操作,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值
- 如果第一个操作数是 true,则结果一定是 true
#####逻辑或真值表
第一个操作数 | 第二个操作数 | 结果 |
---|---|---|
true | true | true |
true | false | true |
false | true | true |
false | false | false |
#####当有一个值不是布尔值的时候返回情况
- 如果第一个数是对象,则返回第一个操作数
- 如果第一个操作数的求值结果为 false,则返回第二个操作数
- 如果两个操作数都是对象,则返回第一个操作数
- 如果两个操作数都是 null ,则返回 null
- 如果两个操作数都是 NaN ,则返回 NaN
- 如果两个操作数都是 undefined ,则返回 undefined -一个或运算 || 的链,将返回第一个真值,如果不存在真值,就返回该链的最后一个值
乘性操作符
- 三种乘性操作符:乘法、除法、求模
- 操作数为非数值的情况下会执行自动的类型转换
- 先用 Number() 函数将其转换为数值
- 空字符串会被转换成 0
- 布尔值 true 会被转换成 1
- 先用 Number() 函数将其转换为数值
乘法
- 由一个星号( * )表示
- 用于表示两个数值的乘积
乘法规则
- 如果操作数都是数值,执行常规的乘法计算
- 两个正数或者两个负数相乘的结果还是正数
- 如果只有一个操作数有符号,则结果为负数
- 如果乘积超过了 ECMAScript 数值的表示范围,则返回 Infinity 或 -Infinity
- 如果有一个操作数是 NaN,则结果是 NaN
- 如果 Infinity 与 0 相乘,则结果是 NaN
- 如果 Infinity 与 非 0 数值相乘,则结果是 Infinity 或 -Infinity(取决于有符号操作数的符号)
- 如果是 Infinity 与 Infinity 相乘,则结果是 Infinity
- 如果有一个操作数不是数值,则在后台调用 Number() 将其转换为数值,然后再应用上面的规则
除法
- 由一个斜杠( / )表示
- 表示第一个操作数除以第二个操作数
除法规则
- 如果操作数都是数值,执行常规的除法计算
- 两个正数或者两个负数相除的结果还是正数
- 如果只有一个操作数有符号,则结果为负数
- 如果乘积超过了 ECMAScript 数值的表示范围,则返回 Infinity 或 -Infinity
- 如果有一个操作数是 NaN,则结果是 NaN
- 如果是 Infinity 被 Infinity 除,则结果是 NaN
- 如果 0 被 0 除,则结果是 NaN
- 如果是非零有限数被零除没则结果是 Infinity 或 -Infinity(取决于有符号操作数的符号)
- 如果是 Infinity 被任何非 0 数值除,则结果是 Infinity 或 -Infinity 取决于有符号操作数的符号)
- 如果有一个操作数不是数值,则在后台调用 Number() 将其转换为数值,然后再应用上面的规则
求模
- 由一个百分号( % )表示
- 返回两个数相除的余数
求模规则
- 如果两个数都是数值,执行常规的除法计算,返回除得的余数
- 如果被除数是无穷大值而除数是有限大的数值,则结果是 NaN
- 如果被除数是有限大的数值,而除数是 0 ,则结果是 NaN
- 如果是 Infinity 被 inifinity 除,则结果是 NaN
- 如果被除数是有限大的数值,而除数是无穷大的数值,则结果是被除数
- 如果被除数是 0 ,则结果是 0
- 如果有一个操作数不是数值,则在后台调用 Number() 将其转换为数值,然后再应用上面的规则
加性操作符
- 加法( + )
- 减法( - )
加法规则
两个操作数都是数值
- 执行常规加法计算
- 如果有一个操作数是 NaN,则结果是 NaN
- 如果是 Infinity 加 Infinity ,则结果是 Infinity
- 如果是 -Infinity 加 -Infinity ,则结果是 -Infinity
- 如果是 Infinity 加 -Infinity ,则结果是 NaN
- 如果是 +0 加 +0 ,则结果是 +0
- 如果是 -0 加 -0 ,则结果是 -0
- 如果是 +0 加 -0 ,则结果是 +0
有一个操作数不是数值
- 如果两个操作数都是字符串,则将第二个操作数与第一个操作数拼接起来
- 如果只有一个操作数是字符串,则将另一个操作数转换为字符串,然后再将两个操作数拼接起来
- 如果有一个操作数是对象、数值或布尔值,则调用他们的 toString() 方法取得相应的字符串值,再应用前面规则
- 对于 undefined 和 null ,则分别调用 String() 函数并取得字符串 “undefined” 和 ”null“
减法规则
两个操作数都是数值
- 执行常规减法计算
- 如果有一个操作数是 NaN ,则结果是 NaN
- 如果是 Infinity 减 Infinity,则结果是 NaN
- 如果是 -Infinity 减 -Infinity ,则结果是 NaN
- 如果是 Infinity 减 -Infinity ,则结果是 Infinity
- 如果是 -Infinity 减 Infinity,则结果是 -Infinity
- 如果是 +0 减 +0 ,则结果是 +0
- 如果是 +0 减 -0 ,则结果是 +0
- 如果是 -0 减 -0 ,则结果是 +0
有一个操作数不是数值
- 如果有一个操作数是字符串、布尔值、null 或 undefined ,则先在后台调用 Number() 函数将其转换为数值,再根据前面的规则执行减法计算,如果转换的结果是 NaN,则计算的结果就是 NaN
- 如果有一个操作符是对象,则调用对象的 valueOf() 方法以取得表示该对象的数值,如果得到结果是 NaN,则计算的结果就是 NaN,如果对象没有 valueOf() 方法,则日澳用器 toString() 方法并将得到的字符串转换为数值
关系操作符
- 四种
- 小于( < )
- 大于( > )
- 小于等于( <= )
- 大于等于( >= )
- 对两个值进行比较,返回布尔值
比较规则
- 如果两个操作数都是数值,则执行数值比较
- 如果两个操作数都是字符串,则比较两个字符串对应的字符编码值(依次比较每个字符)
- 如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值的比较
- 如果一个操作数是对象,则调用这个对象的 valueOf() 方法,用得到的结果按照前面的规则进行比较
- 如果这个对象没有 valueOf() 方法,则调用 toString() 方法,并用得到的结果根据前面的规则执行比较
- 如果一个操作数是布尔值,则先将其转换为数值,然后再进行比较
- 任何数与 NaN 进行比较时结果都是 false
相等操作符
- 用于确定两个变量是否相等
- 相等和不相等:先转换再比较
- 全等和不全等:仅比较而不转换
相等和不相等
- 相等( == )
- 两个操作数相等,返回 true,反之则返回 false
- 不相等( != )
- 两个操作数不相等,返回 true,反之则返回 false
- 这两种操作符都会先转换操作数(强制转换),然后再比较相等性
数据类型转换规则
- 如果有一个操作数是布尔值,则在比较相等性之前现将其转换为数值
- true 转换为 1
- false 转换为 0
- 如果一个操作数是字符串,另一个操作是数值,在比较相等性之前现将字符串转换为数值
- 如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf() 方法,用得到的基本类型值按照前面的规则进行比较
操作符比较规则
- null 和 undefined 是相等的
- 要比较相等性之前,不能将 null 和 undefined 转换成其他任何值
- 如果有一个操作数是 NaN ,则相等性操作符返回 false ,而不相等操作符返回 true
- 即使两个操作数都是 NaN,相等性操作符也返回 false ,不相等操作符返回 true
- 如果两个操作数都是对象,则比较他们是不是同一个对象
- 如过两个操作数都指向同一对象,则相等性操作符返回 true,否则返回 false
一些特殊情况的比较结果
表达式 | 值 |
---|---|
null == undefined | true |
"NaN" == NaN | false |
5 == NaN | false |
NaN == NaN | false |
NaN != NaN | true |
false == 0 | true |
true == 1 | true |
true == 2 | false |
undefined == 0 | false |
null == 0 | false |
"5" == 5 | true |
全等和不全等
- 全等( === )
- 不全等( !== )
- 除了在比较之前不转换操作数之外,全等和不全等操作符与相等和不相等操作符相同
条件操作符
- let v = boolean_expression ? true_value : false_value;
赋值操作符
- 简单的复制操作符由( = )表示,作用就是把右边的值赋给左侧的变量
- let num = 10
- 在等号前添加乘性操作符、加性操作符或位操作符,可完成复合赋值操作
- 乘/赋值( *= )
- 除/赋值( /= )
- 模/赋值( %= )
- 加/赋值( += )
- 减/赋值( -= )
逗号操作符
- ( , )
- 使用逗号操作符可以在一条语句中执行多个操作
- var num = 1, num2 = 2, num3 = 3;
- 可用于赋值,返回表达式中最后一项
- var num = (5, 1, 4, 8, 0); // num 的值为 0