【JS】【Core】运算符

运算符

表按照运算符的优先级排序,前面的运算符优先级要高于后面的运算符优先级:

运算符操作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+=ba =a + b
-=a-=ba = a -b
*=

/=

%=

<<=a<<=ba = a<<b
>>=

>>>=

&=

|=

^=


表达式计算运算符/函数 —— eval

JS同样可以解释运行由JS源代码组成的字符串,并产生一个值,JS通过全局函数eval()来完成这个工作。

例如:

eval("3 + 2")  // => 5

尽量不要使用eval


其他运算符

条件运算符(? :)

三元运算符,例如:

x > 0 ? x : -x  // 求x的绝对值

typeof运算符

一元运算符,放在其单个操作数的前面,操作数可以是任意类型。返回值为表示操作数类型的一个字符串。

例如:

Xtypeof 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--)
    ... ....







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值