js中常用操作符的处理规则

Reading time ~13 minutes

此文章为原创文章,引用请标记文章出处: js中常用操作符的处理规则

js的操作符能适应很多类型的值,包括:字符串、数字值、布尔值,甚至是对象类型。本文总结了常用的操作符对不同类型值的操作数的处理规则

一元操作符

递增和递减操作符

符号:++、–

示例:

var age=29;++age;

规则:

  • 在应用在一个包含有效数字字符的字符串时,先将其转换为数字值,在执行加减1的操作。

  • 在应用于一个不包含有效数字字符的字符串时,将变量的值设置为NaN

  • 在应用于布尔值false/true时,先将其转换为0/1再执行加减1的操作。

  • 在应用于整数/浮点数值时,执行加减1的操作

  • 在应用于对象时,先调用对象的valueOf()以取得一个可供操作的值。然后对该值应用前面的规则。如果结果是NaN,则再调用toString()方法后再应用前面的规则。

一元加和减操作符

符号:+、-

示例:

var num=25;num=+num;

规则:

  • ’+’放在数值前面,对数值不会产生任何影响;’-‘放在数值前面,该值会变成负数

  • 应用在非数值时,该操作符会像Number()转换函数一样会这个值执行转换。换句话说,布尔值false/true将被转换为0/1,字符串值会被按照一组特殊的规则进行解析,而对象是先调用它们的valueOf()和(或)toString()方法,再转换得到的值,再应用前面的规则

乘性操作符

如果参与乘法计算的某个操作数不是数值,后台会先使用Number()转型函数将其转换为数值。也就是说,空字符串将被当做0,布尔值true将被当做1,null将被当做0。

乘法

符号:*

示例: var result=34*56;

规则:

  • 如果操作数都是数值,执行常规的乘法计算,即两个正数或两个负数相乘的结果还是正数,而如果只有一个操作数有符号,那么结果就是负数。如果乘积超过了ECMAScript数值的表示范围1,则返回Infinity或-Infinity

  • 如果有一个操作数是NaN,则结果是NaN

  • 如果是Infinity与0相乘,则结果是NaN

  • 如果是Infinity与非0数值相乘,则结果是Infinity或-Infinity,取决于有符号操作数的符号

  • 如果是Infinity与Infinity相乘,则结果是Infinity

  • 如果有一个操作数不是数值,则在后台调用Number()将其转换为数值,然后再应用上面的规则

除法

符号:/

示例: var result=66/11;

规则:

  • 如果操作数都是数值,执行常规的除法计算,即两个正数或两个负数相除的结果还是正数,而如果只有一个操作数有符号,那么结果就是负数。如果乘积超过了ECMAScript数值的表示范围,则返回Infinity或-Infinity

  • 如果有一个操作数是NaN,则结果是NaN

  • 如果是0被0除,则结果是NaN

  • 如果是Infinity被任何非零数值相除,则结果是Infinity或-Infinity,取决于有符号操作数的符号

  • 如果是非零的有限数被0除,则结果是Infinity或-Infinity,取决于有符号操作数的符号

  • 如果是Infinity被Infinity除,则结果是NaN

  • 如果有一个操作数不是数值,则在后台调用Number()将其转换为数值,然后再应用上面的规则

求模

符号:%

示例: var result=26%5;

规则:

  • 如果操作数都是数值,执行常规的除法计算,返回除得的余数

  • 如果被除数是无穷大值而除数是有限大的数值,则结果是NaN

  • 如果被除数是无穷大值而除数是0,则结果是NaN

  • 如果被除数是有限大的数值而除数是无穷大值,则结果是被除数

  • 如果是Infinity被Infinity除,则结果是NaN

  • 如果被除数是0,则结果是0

  • 如果有一个操作数不是数值,则在后台调用Number()将其转换为数值,然后再应用上面的规则

布尔操作符

逻辑非

符号:!

示例: !false

规则:

  • 无论操作数的类型是什么,都会返回一个布尔值

  • 如果操作数是一个对象,返回false;

  • 如果操作数是一个空字符串/非空字符串,返回true/false;

  • 如果操作数是0/非0的数值(包含Infinity),返回true/false

  • 如果操作数是null、NaN、undefined,返回true

逻辑与

符号:&&

示例: var result=true&&false;

规则:

  • 应用于布尔值时,只有两个操作数的结果都为true时才返回true,否则返回false,且如果第一个操作数的结果为false则直接返回false

  • 如果第一个操作数是对象,则返回第二个操作数

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

  • 如果两个操作数都是对象,则返回第二个操作数

  • 如果有一个操作数是null,则返回null;

  • 如果有一个操作数是NaN,则返回NaN;

  • 如果有一个操作数是undefined,则返回undefined

逻辑或

符号:||

示例: var result=true||false;

规则:

  • 应用于布尔值时,只有两个操作数的结果都为false时才返回false,否则返回true,且如果第一个操作数的结果为true则直接返回true

  • 如果第一个操作数是对象,则返回第一个操作数

  • 如果第一个操作数的求值结果为false,则返回第二个操作数

  • 如果两个操作数都是对象,则返回第一个操作数

  • 如果两个操作数是null,则返回null;

  • 如果两个操作数是NaN,则返回NaN;

  • 如果两个操作数是undefined,则返回undefined

加性操作符

加法

符号:+

示例: var result=1+2;

规则:

加法规则

注:Date类型的对象会在二元+运算时优先调用toString()

减法

符号:-

示例: var result=2-1;

规则:

减法规则

关系操作符

符号:>、<、<=、>=

示例: var result=6>5;

规则:

  • 如果是两个操作数都是数值,则执行数值比较

  • 如果两个操作数都是字符串,则比较两个字符串对应的字符的编码值,以短的字符串长度为总比较次数,如果true比false多则结果为true

  • 如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较

  • 不能转换为数值的操作数会转化为NaN,而任何与NaN进行比较时,结果返回false

  • 如果一个操作数是对象,则调用这个对象的valueOf()方法,用得到的结果按照前面的规则执行比较。如果对象没有valueOf()方法,则调用toString()方法,并用得到的结果根据前面的规则执行比较

  • 如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较

相等操作符

相等和不相等

不同类型会先转换类型(强制转型),然后才比较它们的相等性

符号:==、!=

规则:

  • 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值,false转换为0,而true转换为1

  • 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值

  • 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型值按照前面的规则进行比较

相等和不相等规则特殊

全等和不全等

符号:===、!==

规则:

  • 两个操作数未经转换就相等的情况下返回true,否则为false

  • null和undefined的全等比较返回false

参考资料

jdk-timer、spring-task、quartz的比较

这篇文章将简单介绍目前常用的定时任务框架! Continue reading

小岛经济学-读书笔记

Published on May 10, 2018

java常见的http请求库

Published on May 05, 2018