初学者会以为操做符的知识很简单,可是随着学习的深刻会发现不少语句均可以用操做符来简化,因此深刻理解操做符能够帮助你写出高性能的代码。这篇文章主要记录不一样操做符所遵循的规则。
javascript的操做符有一元操做符、位操做符、布尔操做符、乘性操做符、加性操做符、关系操做符、相等操做符、条件操做符、赋值操做符。其中值得注意的是,一元操做符和相等操做符都有可能改变操做数的数值类型。js中的操做符的不一样之处在于,它们可以适用于不少值,例如字符串、数字值、布尔值、甚至对象。不过在应用于对象时,相应的操做符都会调用对象的valueOf()方法或者toString()方法来转换成能够操做的数据类型。javascript
递增操做符 ++java
递减操做符 --express
正数 +函数
负数 -性能
递增和递减操做符遵循的规则.
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来处理。测试
按位非 ~spa
按位与 &code
按位或 |对象
按位异或 ^
左移 <<
有符号右移 >>
无符号右移 >>>
布尔操做的重要性不言而喻。布尔操做用来测试两个值的关系,若是没有它们,那么如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;