javaScript中的操作符有很多这里先讨论一下加性操作符和乘性操作符等双目运算操作符:
一、加性操作符和乘性操作符包括 + 、-、*、 /、% 等操作符:
1、对象在这5种运算符中都是先通过Number(Person)转换成数值型,先通过valueOf如果没有用toString方法
直到返回基本5种基本类型的一种,然后将该对象作为一个基本类型按照基本类型规则参与运算
2、这5种双目运算操作符基本上在运算前都需要将操作数通过Number()转换成数值然后再参与运算(因为+
操作符只有两个操作数都为数值型的时候才按照数值型运算,其他情况都需要转换为String进行组拼)
3、在进行 *、/ 、% 操作运算的时候可以将0理解为 1/infinity
* / | 如果返回的不是一个确定的有限数值并且不是Infinity,则返回NaN |
% | 在进行%操作运算时,可以先进行/操作,如果/操作返回的不是一个确定的有限数值,则返回NaN,如果/操作返回的是一个确定的有限数值则按照正常运算即可。 |
二、关系操作符和相等操作符
关系操作符和相等操作符包括 >、< 、>=、 <=、 ==、 === 等操作符:
1、对象在这>,<,>=,<=这4种运算符中都是先通过Number(Person)转换成数值型,先通过valueOf如果没有用
toString方法直到返回基本5种基本类型的一种,然后将该对象作为一个基本类型按照基本类型规则参与
运算,(当对象跟对象进行相等操作的时候不管==还是=== 都是比较两个对象的引用值是否相同,即是否
为同一个对象)
2、这些操作符在进行运算前基本也是需要通过Number()将操作数转换为数值型的,不过有如下特殊情况:
(1)当String和String进行比较大小和相等的时候,比较的是字符编码
(2)如果将字符编码也看成数值类型的话,>, <, >=, <= 等操作符在运算前的操作数都必须通过Number()
最终转换成数值类型后参与比较,当然String是转换成字符编码,但是 == 和 === 操作符并不强制
要求除了String外的其它类型操作数都强制转换成数值类型,例如:null和undefined在进行相等比较
操的时候就不进行转换成数值类型,并且 null == undefined
从上面的总结来看,如果将String与String在进行比较大小和相等的时候,比较字符编码的特殊性排除的话,如果将比较操作符看成运算操作符,那么上面的规律就不难理解了,因为运算操作符都要求参与运算的两个操作数最终转换成数值类型。相等操作符按道理来说是不需要转换成数值类型的,例如,=== 操作符进行操作时就不做任何转换,即使 null === undefined 也为false,只是==操作符作为一种不是很严格的相等操作还是会将除了null和undefined外的其他类型都转换成数值型后再进行比较的,当然对象跟对象比较也是直接比较引用地址的值,不进行转换的。
三、按照是否为运算符分类,javaScript中的运算符包括
加性操作符 | +, - |
乘性操作符 | * , / , % |
比较操作符 | >,<,>=,<= |
一元操作符 | ++ , -- , +, - |
这些运算操作符在进行运算前基本都需要将操作数转换成数值类型,特殊情况包括:
1、对象都是先通过Number()转换成简单数据类型后,再按照规则参与运算(这可以算是一种常识了)
2、+ 操作只有当两个操作数都为数值类型的时候,才将两个操作数做算数运算,否则都转换成String后进行组拼
3、String与String进行比较时,比较的是字符编码,可以看成是一种特殊的转换成数值类型
4、提示:++,-- 操作需要作用在一个变量前面,以为本事它就是 a = a + 1; 的简写,如果不作用在一个变量前面语法会提示错误的,因为递增和递减后的值没有地方赋值。
四、布尔操作符
布尔操作符包括逻辑非,逻辑与,逻辑或 !,&&,||
1、逻辑非 !
逻辑非就是对一个操作数先转换为布尔值然后进行取反,!Person 可以理解成!Boolean(Person)
2、逻辑与 &&
逻辑与操作属于短路操作,即如果第一个操作数能够决定结果,那么就不会对第二操作数进行求值。
逻辑与操作运算过程可以理解成如下步骤:
将第一个操作数转换成Boolean值,
如果为true(第一个操作数不能确定结果),则返回第二个操作数
如果为false(第一个操作数能确定结果),则返回第一个操作数
3、逻辑或 ||
逻辑或操作也是属于短路操作,即如果第一个操作数求值为true,那么就不会对第二操作数进行求值
逻辑或操作运算过程可以理解成如下步骤:
将第一个操作数转换成Boolean值,
如果为true(第一个操作数能确定结果),则返回第一个操作数
如果为false(第一个操作数不能确定结果),则返回第二个操作数