js学习笔记:操作符

操作符

js操作符可以适用于很多值,如字符串、数字、布尔、甚至对象。在应用于对象时,相应的操作符通常都会调用对象的valueOf方法和toString方法,以便取得可操作的值。

一元操作符
  • 递增和递减
    • 前置型与后置型:前者是在语句被求值之前改变的,而后者实在语句被求值之后才执行的。
    • 对所有值都适用
      • 包含有效数字的字符串:将其转换成数字再进行加减1的操作,字符串变量变为数值变量。
      • 不包含有效数字的字符串:将变量的值设为NaN,字符串变量变为数值变量
      • 布尔值false:先将其转换为0再执行加减1的操作,布尔值变成数值变量
      • 布尔值true:先将其转换为1再执行加减1的操作,布尔值变成数值变量
      • 浮点数值:进行加减1操作
      • 对象:先调用对象的valueOf方法,然后对值进行前面的规则。如果结果是NaN,则再调用toString方法后再应用前面的规则。对象变量变为数值变量。
  • 一元加和减操作符
    • 一元加操作符放在数值前面对数值不会产生任何影响
    • 对非数值应用时:该操作符会像Number()转型函数一样对这个值执行转换。
    • 一元减操作符主要用于表示负数。
    • 对非数值应用时,遵循与一元加操作符相同的规则,最后再将得到的数转换为负数。
位操作符

js中所有的数值都以64位格式存储,但位操作符先将64位的值转换成32位,然后再执行操作,最后将结果转换会64位。

  • 对NaN和Infinity进行位操作时,这两个值都会被当做0处理
  • 对非数值进行操作,会先使用Number()将该值转换为一个数值。
  • 由于位操作是在最底层执行,因此速度比一般的计算更快。
  • 非操作~:本质是操作数的负值减1
  • 左移操作<<:右侧补零,不会影响操作数的符号位,
  • 有符号的右移>>:保留符号位,会用符号位的值填充右移的空位。
  • 无符号的右移>>>:会将包括符号位的所有位向右移,以0填充空位
布尔操作符
  • 逻辑非!
    可以应用于任何值,都会返回一个布尔值。逻辑非会首先将他的操作数转换为一个布尔值再求反。
    • 对象:false
    • 空字符串:true
    • 非空字符串:false
    • 0:true
    • 任意非0数值,包括Infinity:false
    • null:true
    • undefined:true
    • NaN:true
      !!会将任何值转换为其对应的布尔值,结果与应用Boolean()相同。
  • 逻辑与&&
    可以应用于任何值,但在有一个操作数不是布尔值的情况下,逻辑与操作不一定返回布尔值。
    逻辑与操作属于短路操作,如果第一个操作数能够决定结果那么就不会对第二个操作数求值,如果第一个操作数是false,那么结果就是false而不必对第二个操作数求值了。

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

    • 不能在逻辑与操作中使用未定义的值。会报错

即,如果第一个运算数为真则返回第二个运算数,否则返回第一个运算数。

  • 逻辑或||
    和逻辑与操作类似,如果有一个操作数不是布尔值,结果也不一定返回布尔值。
    逻辑非操作也是短路操作,如果第一个操作数的求值结果是true,就不会对第二个操作数求值了。

    • 如果第一个操作数是对象,则返回第一个操作数
    • 如果第一个操作数的求值结果为false,则返回第二个操作数
    • 如果两个都是对象,则返回第一个操作数
    • 如果两个操作数都是null,返回null
    • 如果两个操作数都是NaN,返回NaN
    • 如果两个操作数都是undefined,返回undefined

    • 可以利用逻辑或来避免为变量赋值为null或undefined,如 var myObject = preferredObject || backupObject。优先为myObject赋值preferredObject,如果preferredObject为null,则将backupObject的值赋给myObject。

即,如果第一个运算数为真则返回第一个运算数,否则返回第二个运算数。

乘性操作符

3个乘性操作符:乘法、除法、求模。在操作数为非数值的情况下会利用Number()执行自动的数值转换。

  • 乘法
    处理特殊值时遵循以下规则:
    • 操作数都是数值,两个正数或两个负数相乘的结果还是正数,如果只有一个操作数有符号,则结果为负数。如果乘积超过了数值的表示范围,则返回Infinity或-Infinity。
    • 有一个操作数为NaN,结果为NaN
    • Infinity与0相乘,结果为NaN
    • Infinity与非0数值相乘,结果是Infinity或-Infinity,取决于非0数值的符号。
    • Infinity与Infinity相乘,结果为Infinity
    • 有一个操作数不是数值,则在后台调用Number()将其转换,再应用上面的规则。
  • 除法
    与乘法操作类似,除法操作也对特殊值有特殊的处理规则:
    • 操作数都是数值,两个正数或两个负数相除的结果还是正数,如果只有一个操作数有符号,则结果为负数。如果商超过了数值的表示范围,则返回Infinity或-Infinity。
    • 有一个操作数为NaN,结果为NaN
    • 如果Infinity被Infinity除,结果为NaN
    • 0被0除,结果为NaN
    • 非零的有限数被0除,结果是Infinity或-Infinity,取决于有限数的符号
    • Infinity被任何非零数值除,结果是Infinity或-Infinity,取决于非零数值的符号
    • 有一个操作数不是数值,则在后台调用Number()将其转换,再应用上面的规则。
  • 求模
    与另外两个乘性操作符类似,求模操作数对特殊值的处理规则如下:
    • 如果操作数都是数值,执行常规的除法计算,返回除得的余数
    • 如果被除数是无穷大值而除数是有限大的数值,结果为NaN
    • 被除数是有限数值而除数是0,结果为NaN
    • Infinity被Infinity除,则结果是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”。
var result = 5+"5"; // "55"
  • 减法
    与加法操作符类似,减法也有一些特殊规则:
    • 有一个操作数为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方法并用得到的结果根据前面的规则进行比较。
  • 如果一个操作数是布尔值,则先将其转换为数值再进行比较
var result = "23" < "3" //true,因为2的字符编码小于3的字符编码
var result = "23" < 3  //false,会将23转换为数值后再进行比较
var result = "a" < 3  //false,“a”被转换成NaN,NaN与任何数比较都是NaN
var result = NaN < 3 //false
var result = NaN >=3 //false
相等操作符

两组操作符:

  • 相等和不相等:先转换再比较
  • 全等和不全等:仅比较而不转换

1.相等和不相等:
这两个操作都会先转换操作数(强制转型),然后再比较他们的相等性。
在转换不同的数据类型时,相等和不相等遵循下列基本规则:

  • 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值:false为0,true为1
  • 如果有一个操作数为字符串,另一个操作数为数值,则比较之前先将字符串转换成数值
  • 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf方法,用得到的基本类型值按前面的规则进行比较。

发现一个规律就是基本都是其他类型向数值类型转换~

在比较时则遵循下列规则:

  • null和undefined是相等的
  • 比较相等性之前,不能将null和undefined转换成其他任何值
    因此,基本其他值与null和undefined比较,都会返回false:
false == null;  //false
false == undefined;  //false
  • 如果有一个操作数是NaN,则相等操作符返回false,不相等操作数返回true。如果两个操作数都是NaN,相等操作符也会返回false,因为NaN不等于NaN。
  • 如果两个操作数都是对象,则比较他们是不是同一对象,如果两个操作数指向同一个对象则返回true,否则返回false
NaN != NaN //true
true == 2 //false
undefined == 0 //false
null == 0 //false
"5" == 5 //true

2.全等与不全等
在比较前不转换操作数,因此只有类型相同的操作数才会继续比较,类型不同的必然不全等。
null === undefined 为false。

赋值操作数

简单的赋值操作=就是把右侧的值赋给左侧的变量。
另外还有一些复合赋值操作:

  • *=
  • /=
  • %=
  • +=
  • -=
  • <<=
  • >>= 有符号右移赋值
  • >>>= 无符号右移赋值
逗号操作符

使用逗号操作符可以在一条语句中执行多个操作。如声明多个变量:

var num1 = 1,num2 = 2,num3 = 3

逗号操作还可以用作赋值,此时逗号操作符总会返回表达式中的最后一项:

var num = (5,1,4,0); //num的值为0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值