JS个人学习(2)—操作符相关

一元操作符

递增操作符(++)和 递减操作符(–)

  • 递增操作符跟递减操作符都分为前缀版跟后缀版,会给对应的数值加1或减1;

前缀版执行时返回的是递增(或递减)后的值;
后缀版执行时返回其原始值,如下:

let num = 2;
console.log(++num); // 3
console.log(num++); // 3
console.log(num); // 4
<!--递减操作符同理-->
复制代码

共同共注意点

  1. 浮点值,正常加1减1,但是要注意浮点数不精确的问题;
  2. 布尔值true转1,false转0再进行操作;
  3. 字符串如果不是有效的数值类型,如”32hello”, 那就变为NaN;
  4. 对象先用valueOf()获取原始值,如果获取到的值不是数字,则调用toString()后再根据上述规则进行转换;

还有可以注意一下:null和undefined分别转换成0和NaN;对象如果不设置valueOf方法,那返回的都是其本身,然后再调用toString()方法;

一元加(+)和 一元减(-)

在非数值中使用时,会使用Number()函样进行类型转换,转换情况跟递增与递减操作符一样

位操作符

按位非NOT(~)

  • 按位非的作用是对位取反,就是1变成0,0变成1,跟取二进制反码的差别是反码符号位不变,而按位非的符号位也要取反。

按位与AND(&)

  • 按位与需要两个操作数,在两个数对应位都是1的时候才返回1

按位或OR(|)

  • 按位或同样需要两个操作数,在两个数对应位其中一个为1时就返回1

按位异或XOR(^)

  • 按位异或跟按位或的唯一不同之处在于:按位异或在两个数值对应位上只有一个1时才返回1,如果对应为两个都是1,那么就返回0

左移(<<)

  • 左移会将数值的所有位向左移动指定的位数

  • 在移动后,原数值右侧的空位以0来代替

有符号右移(>>)

  • 有符号右移保留符号位并将数值向右移动,这个操作与左移操作刚好相反

无符号右移(>>>)

  • 无符号右移会将符号一起向右移动

  • 对正数来说,无符号右移跟有符号右移的结果相同,但是对负数来说,往往会得到一个很大的值

共同共注意点:

  1. 若对非数值使用位操作符时,会先使用Number()函数将该值转换成一个数值,然后在应用位操作。
  2. 在对NaN和Infinity应用位操作时,这两个值都会被当成0来处理

布尔操作符

逻辑非(!)

  • 因为返回true的情况比较特殊,容易记忆,因此只总结返回true的情况,其余不满足的都返回false。
  1. 空字符串返回true
  2. 0返回true
  3. null, undefined, NaN返回true

逻辑与(&&)

  1. 若第一个操作数转布尔类型为false,那么就返回第一个操作数
  2. 若第一个操作数转布尔类型为true,则返回第二个操作数
  3. 转布尔类型的规则可以参考逻辑非

逻辑或(||)

  1. 若第一个操作数转布尔类型为false,那么就返回第二个操作数
  2. 若第一个操作数转布尔类型为true,那么就返回第一个操作数
  3. 转布尔类型的规则可以参考逻辑非
  • 注意点
  1. 注意一点就是这三个操作符的优先级顺序为! > && > ||;

乘性操作符

乘法(*)

  • 这里总结一些特殊情况的结果
  1. Infinity乘0返回的是NaN,乘其他数值看符号返回Infinity或-Infinity

除法(/)

  • 特殊情况
  1. 0除0返回NaN,Infinity除Infinity返回NaN
  2. Infinity除本身外的任何数值,根据除数正负返回-Infinity或Infinity
  3. 0以外的数值除以0,根据被除数的正负返回-Infinity或Infinity

求模(%)

  • 特殊情况
  1. 当被除数是Infinity时,返回NaN,被除数是Infinity时,返回除数
  2. 当除数是0时,返回NaN,被除数是0时,返回0

共同注意点

  1. 只要有一个操作数是NaN那么就返回NaN
  2. 不是数值的操作数,先用Number函数将其转换为数值

加性操作符

加法(+)

  1. 涉及到两个Infinity的,两个值正负相同返回Infinity(正负随本身正负),两个值正负不同返回NaN
  2. 两个值都涉及到+0和-0的,结果都为0,正负规则:两个-0返回-0,剩下都是+0
  3. 当两个操作数其中有一个是字符串或对象时,就都转换成字符串类型进行拼接
  4. null + 1 = 1; undefined + 1 = NaN; null转number为0, undefined为NaN

减法(-)

  1. 涉及到两个Infinity的,可以转换成加法参考加法的规则
  2. 涉及到两个0的,也可以转换成加法参考加法的规则
  3. 其他类型的操作数均转换成number

共同共注意点

  1. 在两个操作属都是数值时,只要有一个操作数是NaN那么就返回NaN

关系操作符

小于(<)、大于(>)、大于等于(>=)、小于等于(<=)

  1. 只要有一个操作数是数值,那就转换成数值进行比较
  2. 有布尔值也要转换成数值进行比较
  3. 两个操作数都是字符串的话,要逐个比较字符串中对应字符的编码

相等操作符

相等和不相等(== & !=)

  • 两个值类型相同:
  1. Null,String,Boolean: 返回true
  2. Undefined: 返回true
  3. Number: 正常数值正常比较,有NaN均返回false,-0与+0返回true,-Infinity与Infinity返回false
  4. Object: 引用同一对象返回true,如let a = {}; let b = a; console.log(a == b); // true
  • 两个值类型不同:
  1. null与undefined返回true
  2. Number与String,String转Number进行比较
  3. 有Boolean类型的,先把Boolean转换成Number类型
  4. Object类型的,先获取其原始值,再进行比较

全等和不全等(=== & !==)

  1. undefined === null // false

逗号操作符(,)

  • 逗号操作符可以用来在一条语句中执行多个操作,并且在赋值时使用逗号操作符分隔值,最终会返回表达式中最后一个值;

条件操作符(X ? XX : XX)

赋值操作符(=)

指数操作符(**)

console.log(Math.pow(3, 2); // 9
console.log(3 ** 2);        // 9
复制代码

个人总结

  • 一元操作符,主要是对数值进行操作,因此不是Number类型的操作数会自动转换成数值;
  • 布尔操作符主要将操作数转换成false和true进行判断,再返回对应的值
  • 乘性操作符也是对数值进行操作,也会将不是Number类型的操作数自动转换成数值,但是对于0和Infinity以及NaN的操作要记忆一下。
  • 加性操作符主要是在对含有String类型的操作数操作时会优先把另一个操作数转换成String类型
  • 关系操作符的话主要是对于两个操作数都是String类型的话要进行字符串对应编码的比较
  • 对象获取原始值就是先调用其valueOf()方法,取得结果后再根据前面的规则执行比较。如果没有 valueOf()操作符,则调用 toString()方法
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享