只能操做一个值的操做符叫一元操做符express
++
and --
好比:编程
var age = 18; var now = ++age - 10; // now = 9, age = 19 var now = age++ - 10; // now = 9, age = 20
前置递增、递减和后置递增、递减可用于操做整数、浮点数、布尔值、字符串、对象,ECMAScript会根据前面提到过的各类数据类型转化成数值类型的规则,先将值转化为数值,而后加减1安全
+
and -
+
放在数值前面,不会有任何影响,-
使负数变为正数,正数变为负数,当一元+
用在非数值前面,会试图将它们转化为数值,规则同以前讲过的,而一元-
用在非数值前面,会首先将它们转化为数值,再变成相应的负数。编码
ECMAScript中的数值以IEEE-754 64 位格式存储,使用位操做符操做数值时,现将该数值转化为32位,而后进行计算,最后再转化成64位。
对于有符号的整数,第一位是符号位(0正数,1负数),后31位表示数值。spa
二进制表示,没有用到的位补0,如18用二进制表示为00000000000000000000000000010010,第一位是符号位,后27位均用0补位,10010是有效位。code
二进制补码表示,计算一个数值如-18的补码须要三步:对象
注意(-18).toString(2)
的结果是-10010而不是11111111111111111111111111101110,默认状况下ECMAScript中的整数都是有符号的,存在无符号整数,无符号整数能表示的数值更大。
对非数值应用一下讲述的位操做,会首先进行Number()
转化,位操做视NaN
Infinity
为0
全部的按位操做符的操做数都会被转成补码形式的有符号32位整数。ip
~
求反码,本质是求操做数的负值减一。
为了方便验证,咱们用五位表示rem
abcde——1-a 1-b 1-c 1-d 1-e字符串
abcde——1-a 1-b 1-c 1-d 1-e——1-a 1-b 1-c 1-d 2-e
1-a 1-b 1-c 1-d 2-e - 1 = 1-a 1-b 1-c 1-d 1-e
可见是相等的。
&
将两个数值按位对齐,若是同一位上均为1,则返回结果的这一位为1,不然为0。
好比:45 & 67; //1
00000000000000000000000000101101
00000000000000000000000001000011
结果为:
00000000000000000000000000000001
|
将两个数值按位对齐,若是同一位均为0,则返回结果的这一位为0,不然为1。
45 | 67; //111
0000000000000000000000000101101
0000000000000000000000001000011
结果为:
00000000000000000000000001101111
^
将两个数值按位对齐,若是同一位数值不一样,则返回结果的这一位为1,若相同,则为0。45 ^ 67; //110
0000000000000000000000000101101
0000000000000000000000001000011
结果为:
00000000000000000000000001101110
<<
向左移动必定位数,不改变符号位,空出来的位置补0(补0的个数与移动位数相同)45 ^ 5; //1440
0000000000000000000000000101101
结果为:
00000000000000000000010110100000
>>
45 >> 5; //1
0000000000000000000000000101101
结果为:
00000000000000000000000000000001
向右移动必定位数,不改变符号位,空出来的位置补0(补0的个数与移动位数相同)
>>>
向右移动必定位数,改变符号位,空出来的位置补0(补0的个数与移动位数相同)
同>>
(用于填充空位的0与符号位相同,等于填充了符号位)
无符号右移操做符会把负数的二进制码当成正数的二进制码-64>>>25; // 127
11111111111111111111111111000000
结果为:
00000000000000000000000001111111
!
能够操做任何数据类型,首先对其取布尔值,而后取反
值 | 布尔值 |
---|---|
空字符串、0、undefined 、null 、NaN |
true |
对象、非0、非空字符串 | false |
!!
至关于Boolean
能够返回这个值真正对应的布尔值。
&&
逻辑与有两个操做数,只有true && true
才会返回true
,能够操做任何数据类型。
若是有一个或两个操做数不是布尔值,逻辑与不必定返回布尔值,规则以下:
true
时返回第二个null
,返回null
undefined
,返回undefined
NaN
,返回NaN
逻辑与是短路操做,若是第一个操做数能够决定求值结果,就不会对第二个操做数求值,当第一个操做数求值为false
,则表达式结果为false
。
||
逻辑或有两个操做数,只有false || false
才会返回false
,能够操做任何数据类型。
若是有一个或两个操做数不是布尔值,逻辑或不必定返回布尔值,规则以下:
false
,则返回第二个操做数null
,则返回null
NaN
,则返回NaN
undefined
,则返回undefined
逻辑或也是短路操做符,若是第一个求值结果为true
,则返回true
。
咱们能够利用逻辑或的这一行为来避免为变量赋null 或undefined 值。
var myObject = preferredObject || backupObject;
若是preferredObject
为null
or undefined
, 会将backupObject
的值赋给myObject
若是参加乘性操做的操做符不是数值,会调用Number()
将其转为数值,这一过程在这一节中再也不赘述。
*
乘法遵循如下规则:
NaN
,则结果是NaN
Infinity * 0; // NaN
Infinity
与非0(包括无穷)相乘,结果为无穷/
除法遵循如下规则:
NaN
,则结果是NaN
Infinity/Infinity; // NaN
0/0; // NaN
%
求模遵循如下规则:
NaN
Infinity
除以Infinity
,余数运算结果为NaN
NaN
或0,结果为05 / 0 % 5; // NaN 5 % 0; // NaN 5 / 0 % (5 / 0); // NaN 5 % (5 / 0); // 5 0 % 0; // NaN 0 % (5 / 0); //0 0 % 5; //0 0 % (5 % 0); //NaN
+
Infinity + Infinity; // Infinity
-Infinity + (-Infinity); // -Infinity
-Infinity + Infinity; // NaN
+0 + (+0); // +0
-0 + (-0); //-0
-0 + (+0); // +0
忽视加法操做中的数据类型是ECMAScript 编程中最多见的一个错误。再来看一个例子:
var num1 = 5;
var num2 = 10;
var message = "The sum of 5 and 10 is " + num1 + num2;
alert(message); // "The sum of 5 and 10 is 510"
-
减法运算遵循如下规则:
NaN
,则结果是NaN
Infinity - Infinity; // NaN
-Infinity - (-Infinity); // NaN
Infinity - (-Infinity); //Infinity
-Infinity - Infinity; //-Infinity
+0 - (+0); // +0
+0-(-0); // -0
-0 - (-0); // +0
包括<
>
<=
>=
,遵循以下规则:
valueof()
,若是没有,调用其toString()
,而后按上述规则比较举一些例子:
"23" < "3"; //true "23" < 3; //false "B" < "a"; //true,大写字母的字符编码所有小于小写字母的字符编码 "a" < 3; // false,"a"转化为NaN,NaN参与任何操做都返回NaN "a" >= 3; //false
==
和不相等 !=
先转换操做数,再比较相等性,转换的规则以下:
valueof()
获得基本类型,再按以上规则比较比较规则以下:
null == undefined; //true
undefined
与null
NaN
与任何操做数相等性比较,返回false
,不相等性比较,返回true
,包括NaN
举一些例子:
undefined == 0; //false null == 0; //false NaN == NaN; //false NaN != NaN; //false true == 1; //true false == 0; //true "NaN" == NaN; // false
===
和不全等 !==
不转换操做数,直接比较,比较规则除了第一条均相同
undefined === null ; // false
能够看出全等比相等要安全,不会强制转换。
variable = boolean_expression ? true_value : false_value;
boolean_expression 若为true,返回true_value,若为false,返回false_value
=
将右边的值赋给左边
*=
+=
-=
/=
%=
<<=
>>=
>>>=
num = num + 10;
至关于num += 10;
var a, b, c;
`a = (0, 1, 2, 3); //3, 只最后一项有效