运算符
表按照运算符的优先级排序,前面的运算符优先级要高于后面的运算符优先级:
运算符 | 操作 | A-运算符结合性 | N-操作数的个数 | 类型-操作数类型 |
++ | 前后增量 | |||
-- | 前后减量 | |||
- | 求反 | |||
+ | 转换为数字 | |||
~ | 按位求反 | |||
! | 逻辑非 | |||
delete | 删除属性 | |||
typeof | 检测操作数类型 | |||
void | 返回undefined值 | |||
* / % | 乘,除,求余 | |||
+ - | 加减 | |||
+ | 字符串连接 | |||
<< | 左移位 | |||
>> | 有符号移位 | |||
>>> | 无符号移位 | |||
< <= > >= | 比较数字顺序 | |||
< <= > >= | 比较在字母表中的顺序 | |||
instanceof | 测试对象类 | |||
in | 测试属性是否存在 | |||
== | 判断相等 | |||
!= | 判断不等 | |||
=== | 判断恒等 | |||
!== | 判断非恒等 | |||
& | 按位与 | |||
^ | 按位亦或 | |||
| | 按位或 | |||
&& | 逻辑与 | |||
|| | 逻辑或 | |||
?: | 条件运算符 | |||
= | 变量赋值或对象属性赋值 | |||
*= /= %= += -= &= ^= |= <<= >>= >>>= | 运算且赋值 | |||
, | ||||
算数运算符
“+”运算符
可以对两个数字做加法,也可以做字符串连接操作:
1 + 2 // =>3
“hello” + " " + "there" // => "hello there"
"1" + "2" // => "12"
加号的转换规则优先考虑字符串连接,如果其中一个操作数是字符串或者转换为字符串的对象,另外一个操作数将会转换为字符串。
例如:
1 + 2 // =>3
"1" + "2" // => "12"
"1" + 2 // => "12"
1 + {} // =>"1[object object]"
true + true // => 2
2 + null // => 2
2 + undefined // => NaN
当加号运算符和字符串和数字一起使用时,需要考虑加法的结合性对运算符的影响,例如:
1 + 2 +“ blind mice” // => "3 blind mice"
1 + (2 + " blind mice") // => "12 blind mice"
一元算数运算符
- 一元+
- 一元-
- 递增++ —— 区分“前增量”和“后增量”,例如:
var i = 1, j = ++i; // i 和 j 都是2
var i = 1, j = i++; // i是2, j是1
- 递减-- —— 区分前后
位运算符
位运算符对由数字表示的二进制数据进行更低层级的按位运算。
位运算符会将 NaN, Infinity 和 - Infinity 都转换为0.
- 按位与(&)
- 按位或(||)
- 按为亦或(^)
- 按位非(~)
- 左移(<<)
- 带符号右移(>>)
- 无符号右移(>>>)
关系运算符
关系运算符用于测试两个值之间的关系,根据关系是否存在而返回true或false。
相等和不等运算符
“==”和“===”运算符用于比较两个值是否相等,但是它们对相等的定义不同,“===”也称为严格相等运算符。
“!=”和“!==”运算符的检测规则是“==”和“===”运算符的求反,“!==”称作不严格相等。
- 严格相等运算符“===”首先计算其操作数的值,然后比较这两个值,比较过程中没有任何类型转换:
- 如果两个值类型不同,则它们不想等;
- 如果两个值都是null或者都是undefined,则它们不相等;
- 如果两个值都是布尔值true或false,则它们相等;
- 如果其中一个是NaN,或者两个值都是NaN,则它们不想等,NaN和其他任何值都是不相等的,包括它本身;
- 如果两个值为数字其数值相等,则它们相等,如果一个值为0,一个为-0,则它们同样相等
- 如果两个值为字符串,且所包含的对应位上完全相等,则它们相等,如果它们的长度或内容不同,则它们不相等;
- 如果两个引用值指向同一个对象,数组或函数,则它们是相等的,如果指向不同的对象,则它们是不等的,尽管两个对象具有完全一样的属性;
- 相等运算符“==”的比较并不严格,如果两个操作数不是同一类型,那么相等运算符会尝试进行一些类型转换,然后进行比较:
- 如果两个操作数的类型相同,则和上文所述的严格相等比较规则一致;
- 如果两个操作数类型不同,“==”相等操作符也可能会认为它们相等,检测相等将会遵守如下规则和类型转换:
- 如果一个值是null,另一个是 undefined,则它们相等;
- 如果一个值是数字,另一个是数字,先将字符串转换为数字,然后使用转换后的值进行比较;
- 如果其中一个值是true,则将其转换为 1 再进行比较,如果其中一个值是 false,则将其转换为 0 再进行比较;
- 如果一个值是对象,另一个是数字或字符串,则将对象转换为原始值,再进行比较;
- 其他不同类型之间的比较均不相等;
例如:
“1” == true // => true
比较运算符
比较运算符用来检测两个操作数的大小关系:
- 小于(<)
- 大于(>)
- 小于等于(<=)
- 大于等于(>=)
比较操作符的操作数可能是任意类型,然而,只有数字和字符串才能真正执行比较操作,因此那些不是数字和字符串的操作数都将进行类型转换,类型转换规则如下:
- 如果操作数为对象,则转换为原始值比较
- 在对象转换为原始值之后,如果两个操作数都是字符串,那么将按照字母表的顺序对两个字符串进行比较
- 在对象转换为原始值之后,如果至少有一个操作数不是字符串,那么两个操作数都将转换为数字进行数值比较。
只有两个操作数都是字符串的时候,才会进行字符串的比较。
例如:
1 + 2 // =>3
"1" + "2" // => "12"
"1" + 2 // => "12"
11 < 3 // false
"11" < "3" //=>字符串比较, true
“11” < 3 //数字比较, false
"one" < 3 //=> "one"转换为NaN,结果为false
in运算符
in运算符希望它的左操作数是一个字符串或可以转换为字符串,希望它的右操作数是一个对象。如果右侧的对象拥有一个名为左操作数值的属性名,则表达式返回true。
例如:
var point = {x:1, y:1};
"x" in point // => true
"z" in point // => false
"toString" in point // => true
var date = [7,8,9];
"0" in data // => true
1 in data // =>true
3 in data // => false
instanceof运算符
instanceof运算符希望左操作数是一个对象,右操作数表示对象的类。如果左侧的对象是右侧类的实例,则表达式返回true,否则返回false。
所有的对象都是Object的实例,当通过instanceof判断一个对象是否是一个类的实例的时候,这个判断也会包含对父类的检测。
例如:
var d = new Date();
d instanceof Date; // => true
d instanceof Object; // => true
d instanceof Number; //=> false
var a = [1,2,3];
a instanceof Array; //=>true
a instanceof Object; //=> true
a instanceof RegExp //=>false
逻辑运算符
逻辑与(&&)
逻辑或(||)
逻辑非(!)
赋值运算符
JS使用“=”运算符给变量或者属性赋值。
赋值表达式的副作用是,右操作数的值赋值给左侧的变量或对象属性,这样的话,后续对这个变量和对象属性的引用都将得到这个值。
带操作的赋值运算
运算符 | 示例 | 等价于 |
+= | a+=b | a =a + b |
-= | a-=b | a = a -b |
*= | ||
/= | ||
%= | ||
<<= | a<<=b | a = a<<b |
>>= | ||
>>>= | ||
&= | ||
|= | ||
^= |
表达式计算运算符/函数 —— eval
JS同样可以解释运行由JS源代码组成的字符串,并产生一个值,JS通过全局函数eval()来完成这个工作。
例如:
eval("3 + 2") // => 5
尽量不要使用eval
其他运算符
条件运算符(? :)
三元运算符,例如:
x > 0 ? x : -x // 求x的绝对值
typeof运算符
一元运算符,放在其单个操作数的前面,操作数可以是任意类型。返回值为表示操作数类型的一个字符串。
例如:
X | typeof X |
undefined | "undefined" |
null | "Object" |
true 或 false | “boolean” |
任意数字或NaN | "number" |
任意字符串 | “string” |
任意函数 | “function” |
任意内置对象 | “object” |
任意宿主对象 | 由编译器各自实现的字符串,但不是"undefined","boolean","number","string" |
typeof运算符可以带上圆括号,例如:
typeof(i)
delete运算符
一元运算符,用来删除对象属性或者数组元素。
例如:
var o = {x: 1, y : 2};
delete o.x;
"x" in o //=> false
var a = [1,2,3];
delete a[2];
2 in a; //=> false
a.length // 3,数组长度并没有改变,删除并没有修改数组的长度
删除属性或者删除数组元素不仅仅是设置了一个undefined的值。
void运算符
并不是经常使用。
操作数会照常计算,但忽略计算结果并返回undefined。
这个运算符最常用在客户端的URL —— javascript:URL中,void让浏览器不必显示这个表达式的计算结果。
例如:
<a href="javascript:void window.open();"> </a>
逗号运算符(,)
逗号运算符最常用的场景是在 for 循环中。例如:
for(var i=0,j=10;i<j;i++,j--)
... ....