JavaScript的运算符

JavaScript操作符用于赋值,比较值,执行算术运算等。

运算符分类

一、算术运算符

一元算术操作符

只有一个操作数的运算符叫做一元运算符,包括:一元加(+) 一元减(-) 递增(++) 递减(–) typeof。

  1. “+”放在数值前面,表示对数字取正,对数值不会产生影响。
  2. “-”放在数值前面,表示对数字取负,用于表现负数,如-1。
  3. “++”运算符:自增运算符,作用是使用变量增加1。分为前置后置两种情况,在赋值的时候,运算规则不同
    前置自增:如++a,赋值时,先自增再赋值
    后置自增:如a++,赋值时,先赋值再自增
  4. “–”运算符:自减运算符,作用是使用变量减1。
    前置自减:如–a,赋值时,先自减再赋值
    后置自减:如a–,赋值时,先赋值再自减
    5.typeof运算符:用于判断数据类型,其后直接跟需要进行类型判断的数据
二元算术运算符

二元算术运算符包括加法(+)、减法(-)、乘法(*)、除法(/)和求余(%)、instanceof。
注意:JavaScript是一门弱类型语言,可以随时改变变量的值和类型,进行不同数据类型之间算术运算的时候,会自动进行数据转换,称为隐式转换。

1、加法 ( + )

在ECMAScript中,不仅可以进行数值加法运算,也可以进行字符串连接。

  1. “+”连接的操作数中如果包含字符串型,Js就会自动把非字符串型数据隐式转换为字符串型数据来处理;
  2. Js代码的执行顺序是从左到右,所以在+连接的表达式中,遇到字符串型数据之前,所有出现的数值型数据(或者可以自动转换为数值型的数据)仍被作为数值来处理。 如果我们要进行字符串连接,为了避免这种情况,我们可以在表达式前拼一个空字符串。
  3. 如果其中一个操作数是对象,基本包装类型的对象会隐式转换为原始类型;日期对象自动通过toString()方法执行转换,其他对象通过valueOf()方法或toString()方法转换。
  4. 在进行了对象到原始值的转换后,如果其中一个操作数是字符串的话,另一个操作数也会转换成字符串,进行字符串连接。
  5. 如果操作数中没有字符串,及隐式转换后没有字符串,将被隐式转换成数字或NaN(通过Number()转换函数),进行加法操作。
2、减法 ( - )

相对于加法,减法就简单的多,只涉及到数字的减法运算。对于非数值类型的操作数,js会通过Number()转型函数将非数值类型转换为数值或NaN。
  时间Date对象的加法运算时使用toString()转换为字符串,减法、乘法、除法、求余等运算中,都是使用Number()转换函数将时间Date对象使用valueOf()转换为数字。

3、乘法 ( * )

乘法运算符由一个星号(*)表示,用于计算两个数值的乘积,会通过Number()转型函数将非数值类型转换为数值或NaN。

4、除法 ( / )

除法运算符由一个斜线(/)表示,执行第一个操作数除以第二个操作数的运算,也会通过Number()转型函数将非数值类型转换为数值或NaN。

5、求模 ( % )

求模(取余数)操作符是由一个百分号“%”表示,是第一个操作数除以第二个操作数的余数. 
  在多数编程语言中,求模运算符只接受整数为操作数,而在ECMAScript中,还接受浮点操作数,但由于浮点数不是精确的值,无法得到完全准确的结果。

6、instanceof 判断引用类型的数据类型
[1,2] instanceof Array //true
(function(){}) instanceof Function //true

二、逻辑运算符

逻辑运算符用来测试两个值的关系,布尔操作符有三个,逻辑非(!)、逻辑与(&&),逻辑或(||)。逻辑运算自动进行隐式数据转换。

逻辑与,逻辑或返回true或false,但返回值并不一定是一个布尔类值,而是参与逻辑运算的可是隐式转换为true或false的操作数。
逻辑与非会返回一个布尔类值。

  1. &&运算符有“短路”的行为,即如果&&的第一个运算数是false,就不再考虑第二个运算数;如果||的第一个运算数是true,也不再考虑第二个运算数。
  2. &&和||运算符两侧的运算数可以是变量(variable),也可以是关系表达式(expression),也可以是二者都有。
  3. 在js逻辑运算中,变量运算数返回其本身的值,关系表达式运算数返回true或false。
  4. 在js逻辑运算中,变量运算数如果是数字0、空字符串""、null、false、undefined、数字NaN,则会判定为false(注意此处是“判定”为false,并不是返回false)。
  5. 逻辑运算的最后结果,是能够最终判定这次逻辑运算真假的那个运算数的返回值。
1、&& :逻辑与(只要有一个条件不成立,返回false)
console.log(true && 3);   //3
console.log(false && 1);   //false
console.log(null && '123');  //null
console.log(undefined && '123');  //undefined
  1. 如果第一个操作数隐式类型转换后为True,则返回第二个操作数
  2. 如果第一个操作数隐式类型转换后为false,则返回第一个操作数
  3. 如果一个操作数是null,则会返回null
  4. 如果一个操作数是NaN,则会返回NaN
  5. 如果一个操作数是undefined,则会返回undefined
2、|| :逻辑或(只要有一个条件成立,返回True)
console.log(1 || '2');   //1
console.log(0 || 1);   //1
console.log(null || null);  //null
console.log(NaN ||  NaN);  //NaN
console.log(undefined ||  undefined);  //undefined
  1. 如果第一个操作数隐式类型转换后为True,则返回第一个操作数
  2. 如果第一个操作数隐式类型转换后为false,则返回第二个操作数
  3. 如果两个操作数是null,则会返回null
  4. .如果两个操作数是NaN,则会返回NaN
  5. 如果两个操作数是undefined,则会返回undefined
3、!逻辑非(无论操作数是什么类型数据类型,逻辑非都会返回一个布尔类值)

返回值是false的情况:

  1. 操作数是对象
  2. 操作数是非空字符串
  3. 操作数是任意的非零字符

返回值是true的情况:

  1. 操作数是数值0
  2. 操作数是空字符串
  3. 如果一个操作数是null
  4. 如果一个操作数是NaN
  5. 如果一个操作数是undefined

三、比较运算符

比较操作符用于对两个值进行比较,这几个操作符都返回一个布尔值。进行不同数据类型之间算术比较的时候,会自动进行隐式数据转换。

console.log(1=='1');   //true
console.log(1==='1');   //false
console.log(1!='1');  //false
console.log(1!=='1');  //true
console.log(1>'1');   //false
console.log(1>='1');   //true
console.log(1<'1');   //false
console.log(1<='1');   //true
console.log(null == undefined) //true
console.log(null === undefined) //false
undefined === undefined; // true
null === null; // true
{} === {}; // false
[] === []; // false

两个引用类型(对象、数组、函数)的数据比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个对象。

1、( == )相等运算符, 只比较值是否相等
2、( === )严格相等运算符,比较值的同时比较数据类型是否相等
3、( != )不相等,比较值是否不相等
4、( !== )严格不相等,比较值得同时比较数据类型是否不相等
5、( > )大于
6、( >= )大于等于
7、( < 小于)
8、( <= 小于等于)

在比较不同类型的数据时,相等运算符(==)会先将数据进行类型转换,然后再用严格相等运算符比较。类型转换规则如下:

  1. 基本类型的值直接比较
    基本类型的数据会使用Number()方法隐式转换成数值类型再进行比较。字符串和布尔值都会转换成数值。
  2. 引用类型与基本类型值比较 引用类型转化成原始类型的值,再进行比较。
  3. undefined和null undefined和null与其他类型的值比较时,结果都为false,它们互相比较时结果为true。
console.log(false == null); // false
console.log(false == undefined); // false
console.log(0 == null); // false
console.log(0 == undefined); // false
console.log(undefined == null); // true

建议尽量使用严格相等运算符。

四、赋值运算符

1、赋值运算符(=),将右侧的值赋给左侧的变量。
2、复合赋值运算符:在(=)前面在添加算术操运算,就可以完成复合赋值操作。

乘(*)赋值:*=
除(/)赋值:/=
模(%)赋值:%=
加(+)赋值:+=
减(-)赋值:-=

五、逗号运算符

使用逗号操作符(,)可以在一条语句中执行多个操作,逗号操作符多用于声明多个变量。

六、条件运算符(三元运算符)

语法是: 条件 ? 结果1 : 结果2;
把条件写在问号(?)前面,后面跟着用冒号(:)分隔的结果1和结果2。满足条件时结果1否则结果2。

运算符的优先级

下表按从最高到最低的优先级列出JavaScript运算符。具有相同优先级的运算符按从左至右的顺序求值。

运算符描述
. [] ()字段访问、数组下标、函数调用以及表达式分组
++ – - ~ ! delete new typeof void一元运算符、返回数据类型、对象创建、未定义值
* / %乘法、除法、取模
+ - +加法、减法、字符串连接
<< >> >>>移位
< <= > >= instanceof小于、小于等于、大于、大于等于、instanceof
== != === !==等于、不等于、严格相等、非严格相等
&按位与
^按位异或
||按位或
&&逻辑与
?:条件
= oP=赋值、运算赋值
,多重求值

typeof与instanceof 的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值