3

前言

初学者会觉得操作符的知识很简单,但是随着学习的深入会发现很多语句都可以用操作符来简化,所以深入理解操作符可以帮助你写出高性能的代码。这篇文章主要记录不同操作符所遵循的规则。
javascript的操作符有一元操作符位操作符布尔操作符乘性操作符加性操作符关系操作符相等操作符条件操作符赋值操作符其中值得注意的是,一元操作符和相等操作符都有可能改变操作数的数值类型。js中的操作符的不同之处在于,它们能够适用于很多值,例如字符串、数字值、布尔值、甚至对象。不过在应用于对象时,相应的操作符都会调用对象的valueOf()方法或者toString()方法来转换成可以操作的数据类型。

一元操作符

  • 递增操作符 ++

  • 递减操作符 --

  • 正数 +

  • 负数 -

递增和递减操作符遵循的规则.
1.在应用于包含有效数字的字符串时,先将其转换为数字值,再执行加减1的操作。字符串变量变成数值变量
2.在应用于一个不包含有效数字字符的字符串时,将变量的值设置为NaN。字符串变量变成数值变量
3.在应用于布尔值false/true时,先将其转换为0再执行加减1的操作。布尔值变量变为数值变量
4.在应用于浮点数值时,执行加减1的操作。
5.在应用于对象时,先调用对象的valueOf()方法以取得一个可供操作的值,然后对该值应用前面的四条规则。如果结果是NaN,则在调用toSring()方法后再应用前面的规则。对象变量变成数值变量

var num = 1;
++num;    //2

var num ='12s';
++num;    //NaN
typeof num;    //number

var num = false;
++num;    //1
typeof num;    //number

位操作符

位操作符用于最基本的层次上,我们一般比较少用到。ECMAscript中所有数值都以IEEE-754 64位格式存储,但是位操作符并不直接操作64位的值,而是先将64位转换成32位的整数,然后执行操作,最后将结果转换回64位。这会带来一个严重的副效应,即在对特殊的NaN和Infinity值应用位操作时,两个值都会被当做0来处理。

  • 按位非 ~

  • 按位与 &

  • 按位或 |

  • 按位异或 ^

  • 左移 <<

  • 有符号右移 >>

  • 无符号右移 >>>

布尔操作

布尔操作的重要性不言而喻。布尔操作用来测试两个值的关系,如果没有它们,那么如if...else这类的判断语句也就无用武之地了。

  • 逻辑非 !

  • 逻辑与 &&

  • 逻辑或 ||

逻辑非(!)

只操作1个操作数,无论操作数是什么数据类型,都返回一个布尔值。逻辑非操作不会改变操作数的数据类型。
逻辑非(!)操作符的规则:
1.如果操作数是一个对象,则返回false。
2.日字旁操作数是一个空字符串,则返回true。
3.如果操作数是一个非空字符串,则返回false。
4.如果操作数值是0,则返回true。
5.如果操作数是任意非0数值(包括Infinity),返回false。
6.如果操作数是null,返回true。
7.如果操作数是NaN,返回true。
8.如果操作数是undefined,返回true。

逻辑与(&&)

逻辑与有两个操作数,它可以应用于任何类型的操作数,而不仅仅是布尔值。在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值。
逻辑与(&&)操作符的规则
1.如果第一个操作数是对象,则返回第二个操作数。
2.如果第二个操作数是对象,则只有在第一个操作数的求值结果为true时才返回这个对象。
3.如果两个操作数都是对象,则返回第二个操作数。
4.如果有一个操作数时null,则返回null。
5.如果有一个操作数时undefined,则返回undefined。
可见逻辑与是一种短路操作,如果第一个操作数能够决定结果(如null,undefined),那么就不会对第二个操作数求值。

var a = {};
var b;
a && b;  //undefined

var a = 3;
var b = {};
a && b;  //b

var a = null;
var b = {};
a && b;  //null

逻辑或(||)

逻辑或的操作数有两个,如果其中有一个操作数不是布尔值,逻辑或也不一定返回布尔值,它遵循的规则如下:
1.如果第一个操作数是对象,则返回第一个操作数;
2.如果第一个操作数求值结果为false,则返回第二个操作数;
3.如果两个操作数都为对象,则返回第一个操作数;
4.如果两个操作数都是null,则返回null;
5.如果两个操作数都是NaN,则返回NaN;
6.如果连个操作数都是undefined,则返回undefined。
可见逻辑或也是一种短路语句,如果第一个操作数的求值结果为true则不会对第二个操作数进行求值。
注意:由以上规则可知,逻辑操作符均不会改变操作数的数据类型。
利用逻辑与来避免为变量赋null或者undefined的值,如下:

var myObject = preferObject || backupObject;

乘性操作符

乘性操作符和其他语言中的乘性操作符用法类似,只不过在操作数为非数值的情况下会执行自动的类型转换。即参与乘性计算的某个操作数不是数值,会先使用Number()转型函数将其转换为数值但是乘性操作不会改变操作数数值类型。

  • 乘法(*)

  • 除法(/)

  • 求模(%)

var a = 1;
var b = false;
a*b; //0
typeof b;  //boolean

加性操作符

加性操作符在操作数都为数值的时候执行常规的加减法操作,在为非数值时会有特殊的转化规则。但是同乘性操作符一样加性操作符不会改变数值类型。

  • 加法(+)

  • 减法(-)

加性操作符

加性操作符在有操作数为字符串时遵循以下规则:
1.如果两个操作数都为字符,则将第二个操作数与第一个操作数拼接起来;
2.如果只有一个操作数是字符串,则将另一个操作数转换为字符串,然后将两个字符串拼接起来;

减性操作符

1.如果有一个操作数是字符串,布尔值、null或者undefined,则先调用Number()方法,然后再根据数值减法规则执行减法计算。
2.如果有一个操作数是对象,则调用对象的valueOf()方法取得该对象的数值。如果对象没有valueOf()方法方法,则调用tostring()方法并将得到的字符串转换为数值。

关系操作符

  • 小于(<)

  • 大于(>)

  • 小于等于(<=)

  • 大于等于(>=)

相等操作符

  • 相等(==)

  • 不相等(!=)

  • 全等(===)

  • 不全等(!==)

相等和不相等

这组操作符是先转换再比较,即操作符会改变操作数的数值类型
1.如果有一个操作数是布尔值,则在比较之前会转换为数值;
2.一个操作数是字符,另一个是数值,那么在比较相等性之前会将字符串转换为数值再进行比较;
3.如果一个操作符是对象,另一个不是,则调用valueOf()方法,将得到的结果进行比较。
4.如果两个都是对象,则比较是否是同一个对象,如果两个操作数都指向同一个对象,那么认为它们相等。

var a = '3';
var b = 3;
a == b;  //true
typeof a;  //number

var a = {};
var b = {};
a == b;  //false

var a = {};
var b = a;
var c = a;
b == c;  //true

全等和不全等

全等和不全等操作符不会改变操作数的数值类型。

条件操作符

value = boolean_expression ? true_value : false_value

条件操作符会根据boolean_expression的求值结果来决定给变量value赋哪个值,求值为真是赋true_value值,为假时赋false_value值。

赋值操作符

  • 赋值(=)

  • 乘/赋值(*=)

  • 初/赋值(/=)

  • 模/赋值(%=)

  • 加/赋值(+=)

  • 减/赋值(-=)

  • 左移/赋值(<<=)

  • 无符号右移/赋值(>>>=)

  • 有符号右移/赋值(>>=)

逗号操作符

逗号操作符用于在一条语句中执行多个操作。

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

操作符优先级

优先级


sushi
135 声望19 粉丝

小目标总是要有的,万一实现了呢^^