JavaScript操作符用于赋值,比较值,执行算术运算等。
运算符分类
一、算术运算符
一元算术操作符
只有一个操作数的运算符叫做一元运算符,包括:一元加(+) 一元减(-) 递增(++) 递减(–) typeof。
- “+”放在数值前面,表示对数字取正,对数值不会产生影响。
- “-”放在数值前面,表示对数字取负,用于表现负数,如-1。
- “++”运算符:自增运算符,作用是使用变量增加1。分为前置后置两种情况,在赋值的时候,运算规则不同
前置自增:如++a,赋值时,先自增再赋值
后置自增:如a++,赋值时,先赋值再自增 - “–”运算符:自减运算符,作用是使用变量减1。
前置自减:如–a,赋值时,先自减再赋值
后置自减:如a–,赋值时,先赋值再自减
5.typeof运算符:用于判断数据类型,其后直接跟需要进行类型判断的数据
二元算术运算符
二元算术运算符包括加法(+)、减法(-)、乘法(*)、除法(/)和求余(%)、instanceof。
注意:JavaScript是一门弱类型语言,可以随时改变变量的值和类型,进行不同数据类型之间算术运算的时候,会自动进行数据转换,称为隐式转换。
1、加法 ( + )
在ECMAScript中,不仅可以进行数值加法运算,也可以进行字符串连接。
- “+”连接的操作数中如果包含字符串型,Js就会自动把非字符串型数据隐式转换为字符串型数据来处理;
- Js代码的执行顺序是从左到右,所以在+连接的表达式中,遇到字符串型数据之前,所有出现的数值型数据(或者可以自动转换为数值型的数据)仍被作为数值来处理。 如果我们要进行字符串连接,为了避免这种情况,我们可以在表达式前拼一个空字符串。
- 如果其中一个操作数是对象,基本包装类型的对象会隐式转换为原始类型;日期对象自动通过toString()方法执行转换,其他对象通过valueOf()方法或toString()方法转换。
- 在进行了对象到原始值的转换后,如果其中一个操作数是字符串的话,另一个操作数也会转换成字符串,进行字符串连接。
- 如果操作数中没有字符串,及隐式转换后没有字符串,将被隐式转换成数字或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的操作数。
逻辑与非会返回一个布尔类值。
- &&运算符有“短路”的行为,即如果&&的第一个运算数是false,就不再考虑第二个运算数;如果||的第一个运算数是true,也不再考虑第二个运算数。
- &&和||运算符两侧的运算数可以是变量(variable),也可以是关系表达式(expression),也可以是二者都有。
- 在js逻辑运算中,变量运算数返回其本身的值,关系表达式运算数返回true或false。
- 在js逻辑运算中,变量运算数如果是数字0、空字符串""、null、false、undefined、数字NaN,则会判定为false(注意此处是“判定”为false,并不是返回false)。
- 逻辑运算的最后结果,是能够最终判定这次逻辑运算真假的那个运算数的返回值。
1、&& :逻辑与(只要有一个条件不成立,返回false)
console.log(true && 3); //3
console.log(false && 1); //false
console.log(null && '123'); //null
console.log(undefined && '123'); //undefined
- 如果第一个操作数隐式类型转换后为True,则返回第二个操作数
- 如果第一个操作数隐式类型转换后为false,则返回第一个操作数
- 如果一个操作数是null,则会返回null
- 如果一个操作数是NaN,则会返回NaN
- 如果一个操作数是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
- 如果第一个操作数隐式类型转换后为True,则返回第一个操作数
- 如果第一个操作数隐式类型转换后为false,则返回第二个操作数
- 如果两个操作数是null,则会返回null
- .如果两个操作数是NaN,则会返回NaN
- 如果两个操作数是undefined,则会返回undefined
3、!逻辑非(无论操作数是什么类型数据类型,逻辑非都会返回一个布尔类值)
返回值是false的情况:
- 操作数是对象
- 操作数是非空字符串
- 操作数是任意的非零字符
返回值是true的情况:
- 操作数是数值0
- 操作数是空字符串
- 如果一个操作数是null
- 如果一个操作数是NaN
- 如果一个操作数是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、( <= 小于等于)
在比较不同类型的数据时,相等运算符(==)会先将数据进行类型转换,然后再用严格相等运算符比较。类型转换规则如下:
- 基本类型的值直接比较
基本类型的数据会使用Number()方法隐式转换成数值类型再进行比较。字符串和布尔值都会转换成数值。 - 引用类型与基本类型值比较 引用类型转化成原始类型的值,再进行比较。
- 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= | 赋值、运算赋值 |
, | 多重求值 |