Js的操作符的特殊规则

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xyh930929/article/details/85256056

下图是Js中涉及到的操作符整理,由于JS是一门弱类型的脚本语言,所以不同类型的变量再使用不同操作符时,会做一些特殊处理。后面是操作符的处理细节。

操作符的处理规则

一元操作符包括++--+-

1. 一元操作符:只能操作一个值得操作符叫做一元操作符。包括++--的前置和后置的使用、以及+-在操作一个值时(即表示正负数时),或者前者混合使用时如果操作的变量不是整数,是其他类型的变量,会遵循以下规则:

  • 包含有效数字字符串的变量,先转为数字值,再执行加减1的操作,字符串被转为数值变量。
  • 不包含有效数字字符串的字符串的变量,将变量的值设置未NaN,字符串被转为数值变量。
  • false转为0。
  • true转为1.
  • 对象执行valueOf()方法取到一个可操作的值,然后根据前面的情况进行转换。
        var s1 = "2";
        var s2 = "a";
        var b = true;

        console.log(++s1);//3
        console.log(++s2);//NaN
        console.log(++b);//2

2. 位操作符:

3. 乘性操作符:

乘性操作符包括:*/%

3.1 乘法*

  • 如果乘积超过了js的数值表示范围,则返回Infinity(正无穷)或者-Infinity(负无穷)
  • 如果有一个是NaN,结果是NaN
  • Infinity乘0结果是0
  • Infinity与非0相乘,结果是Infinity
  • 如果有一个操作数不是数值,则js默认先调用Number()方法将其转换为数值,然后继续利用上述规则

3.2 除法/

  • 如果乘积超过了js的数值表示范围,则返回Infinity(正无穷)或者-Infinity(负无穷)
  • 如果有一个是NaN,结果是NaN
  • 零除以零,结果是NaN
  • 非零的有限数除以0,结果是NaN
  • Infinity除以任何非零值,结果是Infinity或者-Infinity

3.3 求模%

  • 无限大 % 有限大 = NaN
  • 有限大 % 0=NaN
  • Infinity % Infinity=NaN
  • 有限大 % 无限大=有限大
  • 0 % 任意=0
  • 如果有一个操作数不是数值,则js默认先调用Number()方法将其转换为数值,然后继续利用上述规则

4. 加性操作符:

加性操作符包括:+-

4.1 加法+

  • NaN + 任意 = NaN
  • Infinity + Infinity = Infinity
  • -Infinity + -Infinity = -Infinity
  • Infinity + (-Infinity) = NaN
  • 字符串 + 字符串 = 字符串
  • 字符串 + 非字符串 = 字符串 + js将该非字符串转换为字符串的值(对象、数值、布尔值则调用toString()方法,对于undefined和null调用String()方法取得字符串"undefined"和"null")

4.2 减法+

  • NaN - 任意 = NaN
  • Infinity - Infinity = NaN
  • -Infinity - -Infinity = NaN
  • Infinity - (-Infinity) = Infinity
  • -Infinity - Infinity = -Infinity
  • 如果有一个操作数是字符串、布尔值、null、undefined,则js默认调用Number()函数将其转为数值,然后再根据前面的规则执行,如果转换结果是NaN,则减法的结果就是NaN
  • 如果是对象,则调用valueOf()方法取得数值,如果得到结果是NaN,则结果就是NaN。如果没有valueOf()方法,则调用toString()方法并将得到的字符串转换为数值。

5. 布尔操作符:

布尔操作符主要有:!||&&

5.1 操作符!

在js中无论一个值是什么类型,在用!或者直接放在if()条件中判断,都会返回一个布尔值。!会对该布尔值取反。再未使用!之前返回布尔值时遵循如下定律:

  • 对象返回true
  • 空字符串返回false
  • 非空字符串返回true
  • 0返回false
  • 非0Infinity都返回true
  • null返回false
  • NaN返回false
  • undefined返回false
        console.log(!(new Object()));//false
        console.log(!"");//true
        console.log(!"str");//false
        console.log(!0);//true
        console.log(!NaN);//true
        console.log(!null);//true
        console.log(!undefined);//true

5.2 操作符||

||是一个短路操作符,如果第一个值对应的!操作是false,就不会再判断第二个值了。在操作两个非布尔类型的值计算结果时,优先返回一个能让!操作后变成false值(即可在if()条件中中判断通过),如果最终的结果用!操作无法返回false,则返回第二个值。

        var b = "" || null;
        var b1 = "aa" || null;
        var b2 = null || "ss";
        var b3 = undefined || null;
        var b4 = "dd" || "";
        var b5 = "" || "ee";
        var b6 = NaN || null;
        var b7 = undefined || NaN;

        console.log(b);//null
        console.log(b1);//"aa"
        console.log(b2);//"ss"
        console.log(b3);//null
        console.log(b4);//"dd"
        console.log(b5);//"ee"
        console.log(b6);//null
        console.log(b7);//NaN

5.3 操作符&&

&&是一个短路操作符,如果第一个值对应的!操作是true,就不会再判断第二个值了。在操作两个非布尔类型的值计算结果时,优先返回一个能让!操作后变成true值(即可在if()条件中中判断不通过),如果最终的结果用!操作无法返回true,则返回第二个值。

        var b = "" && null;
        var b1 = "aa" && null;
        var b2 = null && "ss";
        var b3 = undefined && null;
        var b4 = "dd" && "";
        var b5 = "" && "ee";
        var b6 = NaN && null;
        var b7 = undefined && NaN;
        
        console.log(b);//""
        console.log(b1);//null
        console.log(b2);//null
        console.log(b3);//undefined
        console.log(b4);//""
        console.log(b5);//""
        console.log(b6);//NaN
        console.log(b7);//undefined

6. 关系操作作符:

关系操作作符包括:><<=>=

  • 字符串比较编码值
  • 有一个是数值,则将另一个转为数值,然后再比较
  • 如果一个是对象,则调用valueOf()方法,如果没有valueOf()方法,则调用toString()方法,按照前面的规则。
  • 任何值和NaN比较的结果都是false
        var b = "Brick" < "alphabet";
        var b1 = "Brick".toLocaleLowerCase() < "alphabet".toLocaleLowerCase();
        var b2 = "23" < "3";
        var b3 = "23" < 3;
        var b4 = "a" < 3;
        var b5 = NaN < 3;
        var b6 = NaN >= 3;

        console.log(b);//true
        console.log(b1);//false
        console.log(b2);//true
        console.log(b3);//false
        console.log(b4);//false
        console.log(b5);//false
        console.log(b6);//false

7. 相等操作作符:

相等操作作符包括==!====!==

7.1 相等和不相等==!=

在比较不同数据类型时,js都会进行转换,在转换不同的数据类型时,相等和不相等遵循下列基本规律:

  • 有一个是布尔值,先转为数值:false转为0,true转为1
  • 一个是数值,一个是字符串,则先将字符串转为数值
  • 一个是对象,补个不是,则调用对象的valueOf()方法。
  • nullundefined是相等的
  • NaN和任何值比较都是false,包括NaN自己。
  • 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,相等返回true,否则返回false
        var b = null == undefined;
        var b1 = "NaN" == NaN;
        var b2 = 5 == NaN;
        var b3 = NaN == NaN;
        var b4 = NaN != NaN;
        var b5 = false == 0;
        var b6 = true == 1;
        var b7 = true == 2;
        var b8 = undefined == 0;
        var b9 = null == 0;
        var b10 = "5" == 5;

        console.log(b);//true
        console.log(b1);//false
        console.log(b2);//false
        console.log(b3);//false
        console.log(b4);//true
        console.log(b5);//true
        console.log(b6);//true
        console.log(b7);//false
        console.log(b8);//false
        console.log(b9);//false
        console.log(b10);//true

7.2 全等和不全相等===!==

全等和不全等在比较之前除了不转换操作数之外,全等和不全等与相等和不相等没有什么区别。

        var b = "55" == 55;
        var b1 = "55" === 55;
        var b2 = "55" != 55;
        var b3 = "55" !== 55;
        
        console.log(b);//true
        console.log(b1);//false
        console.log(b2);//false
        console.log(b3);//true

备注:本文内容是学习“JavaScript高级程序设计”这本书整理的笔记。

猜你喜欢

转载自blog.csdn.net/xyh930929/article/details/85256056