跳至主要內容

常用操作符

Yang大约 11 分钟JavaScript

常用操作符

一元操作符

递增操作符

  • 前置型 ++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
数值 0true
任意非 0 数值(包括 Infinity)false
nulltrue
NaNtrue
undefinedtrue

逻辑与( && )

  • 有两个或以上操作数
  • 逻辑与操作可以应用于任何类型的操作数,而不仅仅是布尔值
  • 在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值
  • 该操作属于短路操作,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值
    • 如果第一个操作数是 false ,则结果一定是 false
  • 与运算返回第一个假值,如果没有假值就返回最后一个值
  • 与运算 && 的优先级比或运算 || 要高。 #####逻辑与真值表
    第一个操作数第二个操作数结果
    truetruetrue
    truefalsefalse
    falsetruefalse
    falsefalsefalse

#####当有一个值不是布尔值的时候返回情况

  • 如果第一个数是对象,则返回第二个操作数
  • 如果第二个操作数是对象,则只有在第一个操作数的求值结果为 true 的情况下才会返回该对象
  • 如果两个操作数都是对象,则返回第二个操作数
  • 如果有一个操作数是 null ,则返回 null
  • 如果有一个操作数是 NaN ,则返回 NaN
  • 如果有一个操作数是 undefined ,则返回 undefined

逻辑或( || )

  • 有两个或以上操作数
  • 逻辑与操作可以应用于任何类型的操作数,而不仅仅是布尔值
  • 在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值
  • 该操作属于短路操作,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值
  • 如果第一个操作数是 true,则结果一定是 true

#####逻辑或真值表

第一个操作数第二个操作数结果
truetruetrue
truefalsetrue
falsetruetrue
falsefalsefalse

#####当有一个值不是布尔值的时候返回情况

  • 如果第一个数是对象,则返回第一个操作数
  • 如果第一个操作数的求值结果为 false,则返回第二个操作数
  • 如果两个操作数都是对象,则返回第一个操作数
  • 如果两个操作数都是 null ,则返回 null
  • 如果两个操作数都是 NaN ,则返回 NaN
  • 如果两个操作数都是 undefined ,则返回 undefined -一个或运算 || 的链,将返回第一个真值,如果不存在真值,就返回该链的最后一个值

乘性操作符

  • 三种乘性操作符:乘法、除法、求模
  • 操作数为非数值的情况下会执行自动的类型转换
    • 先用 Number() 函数将其转换为数值
      • 空字符串会被转换成 0
      • 布尔值 true 会被转换成 1

乘法

  • 由一个星号( * )表示
  • 用于表示两个数值的乘积
乘法规则
  • 如果操作数都是数值,执行常规的乘法计算
    • 两个正数或者两个负数相乘的结果还是正数
    • 如果只有一个操作数有符号,则结果为负数
    • 如果乘积超过了 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 == undefinedtrue
"NaN" == NaNfalse
5 == NaNfalse
NaN == NaNfalse
NaN != NaNtrue
false == 0true
true == 1true
true == 2false
undefined == 0false
null == 0false
"5" == 5true

全等和不全等

  • 全等( === )
  • 不全等( !== )
  • 除了在比较之前不转换操作数之外,全等和不全等操作符与相等和不相等操作符相同

条件操作符

  • 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
上次编辑于:
贡献者: sunzhenyang