下图是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. 位操作符:
- NaN和Infinity值会被当做0来处理。
- 对于非数值的,js会默认调用
Number()
方法(该方法在Js的数据类型以及相关函数有介绍),然后再操作。
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非空字符串
返回true0
返回false非0
和Infinity
都返回truenull
返回falseNaN
返回falseundefined
返回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()方法。
null
和undefined
是相等的- 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高级程序设计”这本书整理的笔记。