操作符:用于操作数据值,包括算数操作符、位操作符、关系操作符等等。
一元操作符符:只能操作一个数据值。
- 递增递减操作符:++,- -
分为前置操作和后置操作。
前置操作:先进行自增自减操作在进行数值运算。
var age = 18;
var age1 = ++age; //age1 = 19,age = 19
var age2 = --age; //age2 = 18,age = 18;
后置操作:先进行数值运算再自增或是自减。
var age = 18;
var age1 = age++; //age1 = 18,age = 19;
var age2 = age--; //age2 = 19;age = 18
自增和自减操作不仅是用于整数,还适用于字符串、布尔值、浮点数值和对象。在应用自增自减操作时遵循如下转换规则:
- 包含有效数字字符的字符串:先将其转换为数字值,在自增自减。字符串变量—>数值变量。
- 不包含有效数字字符的字符串:转换为NaN。字符串变量—>数值变量。
- 应用布尔值false,转为0,true转为1。布尔值—>数值变量。
- 应用浮点数值:直接自增自减
- 应用对象:先调用对象的valueof方法,取得一个可以操作的值,再应用前面的规则。
2. 一元加和一元减操作符
对于数值数据与数学完全一样。
对于非数值数据遵循一定的转换规则。规则如下:
- 包含有效数字的字符串转为数值
- 不包含有效数字的字符串转为NaN
- 布尔值false转为0,true转为1
- 对象应用valueof()方法获得可操作的值在应用前面的转换规则。
3. 位操作符
按内存中表示数值的位来操作数值,用二进制表示,遵循二进制的转换规则。
对于有符号的整数,32位中的前31位用于表示整数的值。第32位表示数值的符号:0表示正整数,1表示负整数。未用到的位计算机中以0填充。
负数以二进制补码方式存储。计算如下:
- 求负数绝对值的二进制码
- 求二进制的补码
- 将二进制补码+1.
(1)按位非(NOT):符号 ~ ,将1改为0,0改为1
var num1 = 9;
var num2 = ~num1; //二进制为 0110
(2)按位与(AND):符号 & ,有两个操作数,将两个数值的二进制码对齐,如果两者都是1,结果为1,否则都为0.
var num1 = 25 & 3;
alert(num1)
(3)按位或(OR):符号 | ,有两个操作数,将两个数值的二进制码对齐,如果两者中至少有1个是1,结果为1,否则为0.
var num1 = 9 | 3;
alert(num1);
(4)按位异或(XOR):符号 ^ ,有两个操作数,将两个数值的二进制码对齐,如果两者中只有一个为1,结果为1,否则为0.
var num1 = 25^3
alert(num1);
(5)左移,符号 << ,将数值的所有位向左移动指定的位数,左移后右侧空出的位置补0.
var num1 = 2;
var newNum = num<<5; // newNum = 64;2的5次方
左移不会影响操作数的符号位,2左移5位,结果64,-2左移5位,结果-64.
(6)有符号的右移,符号 >> ,将数值的所以位向右移动指定的位数,右移后左侧空出的位置补1,但是符号位保留,即保留正负号。
var num1 = 64;
var newNum = num>>5; // newNum = 2;64的-5次方
(7)无符号的右移,符号 >>> ,将数值的所以32位向右移动指定的位数。
对于正数,无符号的右移与有符号的右移结果相同
对于负数,无符号的右移是以0来填充空位,而不是像有符号右移那样以符号位的值来填充空位。无符号右移操作会把负数的二进制码当成正数的二进制码,以其绝对值的二进制补码形式表示,会导致无符号右移后的结果非常大。
var num1 = -64; //二进制码为 11111111111111111111111111000000
var newNum = num>>>5;
// newNum = 134217726 ,二进制码为00000111111111111111111111000000
4布尔操作符
(1)逻辑非:符号 !,可以用于js中的任何值,结果返回一个布尔值,先将操作符转为布尔值在对其求反,转换遵循以下规则:
- 操作数为对象,返回false
- 操作数是空字符串,返回true
- 操作数非空字符串,返回false
- 操作数是数值0,返回true
- 操作数是任意非0数值(包括Infinity,-Infinity),返回false
- 操作数是null,返回true
- 操作数是NaN,返回true
- 操作数是undefined,返回true
对其两次应用即可获得相对应的布尔值。var s = !!false
,结果就是false。
(2)逻辑与:符号&&,有两个操作数,只有当两者均为true,结果为true,否则为false。操作数可为任何值,返回值遵循如下规则:
- 第一个操作数为对象,返回第二个操作数
- 第二个操作数为对象,则只有在第一个操作数的求值结果为true的情况下才会返回该对象
- 两个操作数均为对象,则返回第二个操作数
- 第一个操作数为null,返回null
- 第一个操作数为NaN,返回NaN
- 第一个操作数是undefined,返回undefined
逻辑与属于短路操作,如果第一个操作数能够决定结果,就不会再对第二个操作数求值例如:
var s1 = true;
var s2 = (s1 && someUndefined); //会发生错误,第二个操作数未定义
alert(s2); //不会执行
var b1 = false;
var b2 = (s1 && SomeUndefined); //不会发生错误
alert(b2); //false
(3)逻辑或:符号 || ,只有两个操作数均为false,结果为false,否则为true。遵循如下转换规则:
- 第一个操作数是对象,返回第一个操作数
- 第一个操作的求值结果为false,返回第一个操作数
- 两个操作数都是对象,返回第一个操作数
- 两个操作数都是null,返回null
- 两个操作数都是NaN,返回NaN
- 两个操作数都是undefined,返回undefined
逻辑或也是一个短路操作符,如果第一个操作数求值结果为true,就不会对第二个操作数求值,例如:
var s1 = true;
var s2 = (s1 || someUndefined); //不会发生错
alert(s2); //执行,true
var b1 = false;
var b2 = (s1 && SomeUndefined); //会发生错误
alert(b2); //不会执行
逻辑或的这一个特性可以用来避免为变量赋null或undefined,例如:
var o = preferredObject || defaultObject;
如果preferredObject包含有效值,则赋值给o,否则将defaultObject赋值给o。
欢迎大家一起讨论,进步!!!