操作符
一元操作符(++、- -)
递增和递减操作符
var s1 = "2"; var s2 = "z"; var s3 = false; var s4 = 1.1; var o = { valueOf: function(){ return -1; } }; s1++; //3 s2++; //NaN s3++; //1 s4--; //0.10000000000000009(由于浮点舍入错误所致) s5--; //-2
一元加和减操作符(+、-)
a. 一元加操作符放在数值前面不会对数值产生任何影响;一元减操作符会使数值变成负数
b. 应用在非数值,该操作符会像Number()函数一样对这个值进行转换var s1 = "0.1"; var s2 = "1.1"; var s3 = "z"; var b = false; var f = 1.1; var o = { valueOf: function(){ return -1; } }; s1 = +s1; //0.1 s2 = +s2; //1.1 s3 = +s3; //NaN b = -b; //0 f = -f; //-1.1 0 = -0; //1
数值
数值存储
1.所有数值都以64位格式存储,转换成32位执行操作,结果再转换回64位
2.对于有符号的整数,32位中的前31位用于表示整数的值,第32位(符号位)用于表示数值的符号:0表示整数,1表示负数
3.正数以纯二进制格式存储,31位中的每一位都表示2的幂
4.负数以二进制补码格式存储计算一个数值的二进制补码:
- 求绝对值(二进制)
- 反码(即将1替换为0,0替换为1)
- +1
求-18的二进制码,首先要求得18的二进制码,即:
0000 0000 0000 0000 0000 0000 0001 0010
然后,求其二进制反码,即0和1互换:
1111 1111 1111 1111 1111 1111 1110 1101
最后,二进制反码加1:
1111 1111 1111 1111 1111 1111 1110 1101
得到
1111 1111 1111 1111 1111 1111 1110 1110
位操作符
按位非(~)
- 返回数值的反码
- 本质是:操作数的负值减1
var num1 = 25; //二进制0000 0000 0000 0000 0000 0000 0001 1001
var num2 = ~num1; //二进制1111 1111 1111 1111 1111 1111 110 0110
alert(num1); //-26
上面是num2在计算机中存储的二进制格式,那么num2到底是多少呢(怎么看出来)?↓
从二进制第32位是1来看,num2是负数,则先求绝对值:
0111 1111 1111 1111 1111 1111 1110 0110
再求其反码:
1000 0000 0000 0000 0000 0000 0001 1001
反码加1:
1000 0000 0000 0000 0000 0000 0001 1001
得到
1000 0000 0000 0000 0000 0000 0001 1010 (即-26)
位操作符
按位与(&)
- 1&1—>1
- 1&0—>0
- 0&1—>0
- 0&0—>0
按位或(|)
- 1|1—>1
- 1|0—>1
- 0|1—>1
- 0|0—>0
按位异或(^)
- 1^1—>0
- 1^0—>1
- 0^1—>1
- 0^0—>0
左移(<<)
- 将数值的所有位向左移动指定的位数,以0填充右侧空位(不会影响符号位,例:-2左移5位结果是-64,符号位不参与移动?)
var oldValue = 2; //等于二进制的10 var newValue = oldValue << 5; //等于二进制的1000000,十进制的64
- 将数值的所有位向左移动指定的位数,以0填充右侧空位(不会影响符号位,例:-2左移5位结果是-64,符号位不参与移动?)
有符号的右移(>>)
- 将数值向右移动,保留符号位,且以符号位的值填充符号位右侧、原数值左侧的空位
无符号的右移(>>>)
- 数值的所有32位都向右移动,以0填充空位
- 无符号右移操作符会把负数的二进制码当做正数的二进制码(会导致无符号右移后的结果非常之大)
var oldValue = -64; //二进制1111 1111 1111 1111 1111 1111 1100 0000 var newValue = oldValue >>>5; //二进制0000 0111 1111 1111 1111 1111 1111 1110,等于十进制的134217726
布尔操作符
- 逻辑非(!)
- 逻辑与(&&)
- 逻辑或(||)
乘性操作符
- 乘法(*)
- 如果乘积超过数值表示范围,则返回Infinity或-Infinity
- 如果有一个操作数是NaN,则结果是NaN
- Infinity * 0 = NaN
- Infinity * 非0 = Infinity 或 -Infinity(取决于非0数值的符号)
- Infinity * Infinity = Infinity
- 除法(/)
- 同乘法
- 同乘法
- Infinity/Infinity = NaN
- 0/0 = NaN
- 0/非0有限数 = Infnity 或 -Infinity(取决于数的符号)
- 非0/Infinity = Infinity 或 -Infinity(取决于数的符号)
- 求模(%)
- 无穷大%有限大 = NaN
- 有限大%0 = NaN
- Infinity%Infinity = NaN
- X(有限大)%Y(无穷大) = X
- 0% 数 = 0
- 乘法(*)
加性操作符
加法
- 如果有一个操作数是NaN,则结果是NaN
- Infinity + Infinity = Infinity
- -Infinity + -Infinity = -Infinity
- Infnity + -Infinity = NaN
- 如果两个操作数都是字符串(或只有一个是字符串),则拼接
var result = 5 + "5"; //"55"
减法
- 同加法
- Infinity - Infinity = NaN
- -Infinity - -Infinity = NaN
- Infinity - -Infinity = Infinity
- -Infinity - Infinity = -Infinity
var result1 = 5 - true; //4,true转换成1 var result2 = NaN - 1; //NaN var result3 = 5 - 3; //2 var result4 = 5 - ""; //5,""转换成0 var result5 = 5 - "2"; //3 var result6 = 5 - null; //5,null转换成0
关系操作符
1.对于字符串,比较的是字符编码
var result = "Black" < "alphabet"; //true,B-66,a-97 var result = "23" < "3"; //true,2-50,3-51
2.对于数值和字符串,如果字符串能转换成数值
var result = "23" < 3; //false,"23"被转换成了数值23 var result = "a" < 3; //false,因为"a"被转换成了NaN
3.与NaN作比较,结果都是false
var result = NaN < 3; //false var result = NaN >= 3; //false
相等操作符
相等和不相等
null == undefined; //true null == 0; //false undefined == 0; //false "NaN" == NaN; //false NaN == NaN; //false NaN != NaN; //false 5 == NaN; //false 5 == "5"; //true false == 0; //true true == 1; //true true == 2; //false
全等和不全等
var result1 = ("55" == 55); //true,因为转换后相等 var result2 = ("55" === 55); //false,因为不同的数据类型不相等 var result1 = ("55" != 55); //false,因为转换后相等 var result2 = ("55" !== 55); //true,因为不同的数据类型不相等 var result1 = (null == undefined); //true var result2 = (null === undefined); //false
条件操作符
variable = boolean_expression ? true_value : false_value; var max = (num1 > num2)? num1 : num2;
赋值操作符
- =、+=、-=、*=、/=、%=、<<=、>>=、>>>=
逗号操作符
- 除基本功能外,它还可用于赋值
var num = (3,2,5,6,9,0); //0,返回表达式中的最后一项
- 除基本功能外,它还可用于赋值
js基本概念(中)之操作符
最新推荐文章于 2024-07-19 12:58:53 发布