基本概念 - 操作符(运算符)
ECMA-262 描述了⼀组⽤于操作数据值的操作符,包括算术操作符(如加号和减号)、位操作符、关系操作符和相等操作符。ECMAScript 操作符的与众不同之处在于,它们能够适⽤于很多值,例如字符串、数字值、布尔值,甚⾄对象。不过,在应⽤于对象时,相应的操作符通常都会调⽤对象的valueOf()和(或)toString()⽅法,以便取得可以操作的值。
⼀.什么是表达式
表达式是ECMAscript中的⼀个“短语”,解释器会通过计算把它转换成⼀个值。最简单的表达式就是字⾯量或变量名
单⼀的字⾯量和组合字⾯量的操作符都可以称为表达式
⼆.⼀元操作符
只能操作⼀个值的操作符叫做⼀元操作符。⼀元操作符是ECMAScript 中最简单的操作符。
1.递增++和递减--
递增和递减操作符直接借鉴⾃C,⽽且各有两个版本:前置型和后置型。顾名思义,前置型应该位于要操作的变量之前,⽽后置型则应该位于要操作的变量之后。因此,在使⽤前置递增操作符给⼀个数值加1 时,要把两个加号(++)放在这个数值变量前⾯.执⾏前置递减操作的⽅法也类似,结果会从⼀个数值中减去1。使⽤前置递减操作符时,要把两个减号(--)放在相应变量的前⾯
2.前置和后置的区别
在没有赋值操作之前,前置和后置是⼀样的,但是在赋值操作时,如果递增或递减操作符前置,哪么前置的操作符就会累加或累减再赋值,如果是后置则先赋值再计算累加和累减
3.⼀元加和减操作符绝⼤多数开发⼈员对⼀元加和减操作符都不会陌⽣,⽽且这两个ECMAScript 操作符的作⽤与数学书上
讲的完全⼀样。⼀元加操作符以⼀个加号(+)表⽰,放在数值前⾯,对数值不会产⽣任何影响
三.算术操作符
ECMAscript中定义了五个算术运算符,加减乘除求模。如果在算术运算的值不是数值,哪么台后会使⽤Number()转型函数转换数值(隐式转换)
四.关系操作符
⼤于和⼩于⼩于(<)、⼤于(>)、⼩于等于(<=)和⼤于等于(>=)、相等(==)、不等(!=)全等(恒等)(===)、全不等(不恒等)(!==) 八个关系操作符⽤于对两个值进⾏比较,比较的规则与我们在数学课上所学的⼀样。这⼏个操作符都返回⼀个布尔值(true、false)。与ECMAScript 中的其他操作符⼀
样,当关系操作符的操作数使⽤了非数值时,也要进⾏数据转换或完成某些奇怪的操作。以下就是相应的规则。
1.如果两个操作数都是数值,则执⾏数值比较。
2.如果两个操作数都是字符串,则比较两个字符串对应的字符编码值。
3.如果⼀个操作数是数值,则将另⼀个操作数转换为⼀个数值,然后执⾏数值比较。
4.如果⼀个操作数是对象,则调⽤这个对象的valueOf()⽅法,⽤得到的结果按照前⾯的规则执⾏比较。如果对象没有valueOf()⽅法,则调⽤toString()⽅法,并⽤得到的结果根据前⾯的规则执⾏比较。
5.如果⼀个操作数是布尔值,则先将其转换为数值,然后再执⾏比较。
相等和不相等
ECMAScript 中的相等操作符由两个等于号(==)表⽰,如果两个操作数相等,则返回true。⽽不相等操作符由叹号后跟等于号(!=)表⽰,如果两个操作数不相等,则返回true。这两个操作符都会先转换操作数(通常称为强制转型),然后再比较它们的相等性。在转换不同的数据类型时,相等和不相等操作符遵循下列基本规则:
1.如果有⼀个操作数是布尔值,则在比较相等性之前先将其转换为数值——false 转换为0,⽽true 转换为1;
2.如果⼀个操作数是字符串,另⼀个操作数是数值,在比较相等性之前先将字符串转换为数值;
3.如果⼀个操作数是对象,另⼀个操作数不是,则调⽤对象的valueOf()⽅法,⽤得到的基本类型值按照前⾯的规则进⾏比较;这两个操作符在进⾏比较时则要遵循下列规则。
4.null 和undefined 是相等的。
5.要比较相等性之前,不能将null 和undefined 转换成其他任何值。
6.如果有⼀个操作数是NaN,则相等操作符返回false,⽽不相等操作符返回true。重要提⽰:即使两个操作数都是NaN,相等操作符也返回false;因为按照规则,NaN 不等于NaN。7.如果两个操作数都是对象,则比较它们是不是同⼀个对象。如果两个操作数都指向同⼀个对象,则相等操作符返回true;否则,返回false。
由于相等和不相等操作符存在类型转换问题,⽽为了保持代码中数据类型的完整性,我们强烈推荐使⽤全等和不全等操作符。
五.逻辑操作符(布尔操作符)
在⼀⻔编程语⾔中,布尔操作符的重要性堪比相等操作符。如果没有测试两个值关系的能⼒,那么诸如if...else 和循环之类的语句就不会有⽤武之地了。布尔操作符⼀共有3 个:非(NOT)、与(AND)和或(OR)。
1. 逻辑非
逻辑非操作符由⼀个叹号(!)表⽰,可以应⽤于ECMAScript 中的任何值。⽆论这个值是什么数据类型,这个操作符都会返回⼀个布尔值。逻辑非操作符⾸先会将它的操作数转换为⼀个布尔值,然后再对其求反。也就是说,逻辑非操作符遵循下列规则:
1.如果操作数是⼀个对象,返回false;
2.如果操作数是⼀个空字符串,返回true;
3.如果操作数是⼀个非空字符串,返回false;
4.如果操作数是数值0,返回true;
5.如果操作数是任意非0 数值(包括Infinity),返回false;
6.如果操作数是null,返回true;
7.如果操作数是NaN,返回true;
8.如果操作数是undefined,返回true。
逻辑非操作符也可以⽤于将⼀个值转换为与其对应的布尔值。⽽同时使⽤两个逻辑非操作符,实际上就会模拟Boolean()转型函数的⾏为。其中,第⼀个逻辑非操作会基于⽆论什么操作数返回⼀个布尔值,⽽第⼆个逻辑非操作则对该布尔值求反,于是就得到了这个值真正对应的布尔值。当然,最终结果与对这个值使⽤Boolean()函数相同
2. 逻辑与
逻辑与操作符由两个和号(&&)表⽰,有两个操作数,如下⾯的例⼦所⽰:
var result = (5>4) && (4>3); //true 两边都为true 返回true
逻辑与操作可以应⽤于任何类型的操作数,⽽不仅仅是布尔值。在有⼀个操作数不是布尔值的情况
下,逻辑与操作就不⼀定返回布尔值;此时,它遵循下列规则:
1.如果第⼀个操作数是对象,则返回第⼆个操作数;
2.如果第⼆个操作数是对象,则只有在第⼀个操作数的求值结果为true 的情况下才会返回该对象;
3.如果两个操作数都是对象,则返回第⼆个操作数;
4.如果有⼀个操作数是null,则返回null;
5.如果有⼀个操作数是NaN,则返回NaN;
6.如果有⼀个操作数是undefined,则返回undefined。
逻辑与操作属于短路操作,即如果第⼀个操作数能够决定结果,那么就不会再对第⼆个操作数求值。对于逻辑与操作⽽⾔,如果第⼀个操作数是false,则⽆论第⼆个操作数是什么值,结果都不再可能是true 了。来看下⾯的例⼦:
// var result = (5>4) && age; //报错 age 未定义 age is not defined
var result = (5>7) && age; //false
在这个例⼦中,警告框会显⽰出来。⽆论变量age 有没有定义,也永远不会对它求值,因为第⼀个操作数的值是false。⽽这也就意味着逻辑与操作的结果必定是false,根本⽤不着再对&&右侧的操作数求值了。在使⽤逻辑与操作符时要始终铭记它是⼀个短路操作符。
3. 逻辑或
逻辑或操作符由两个竖线符号(||)表⽰
与逻辑与操作相似,如果有⼀个操作数不是布尔值,逻辑或也不⼀定返回布尔值;此时,它遵循下列规则:
1.如果第⼀个操作数是对象,则返回第⼀个操作数;
2.如果第⼀个操作数的求值结果为false,则返回第⼆个操作数;
3.如果两个操作数都是对象,则返回第⼀个操作数;
4.如果两个操作数都是null,则返回null;
5.如果两个操作数都是NaN,则返回NaN;
6.如果两个操作数都是undefined,则返回undefined。
与逻辑与操作符相似,逻辑或操作符也是短路操作符。也就是说,如果第⼀个操作数的求值结果为true,就不会对第⼆个操作数求值了
六.*位操作符
位运算符总共有7种
1.位非(~)
2.位与(&)
3.位或(
|)
4.位异或(^)
5.左移(<<)
更多的内容可以去查看w3c官⽹
七.赋值操作符
简单的赋值操作符由等于号(=)表⽰,其作⽤就是把右侧的值赋给左侧的变量
复合赋值运算符通过 x=形式表⽰。x表⽰算术运算符及位运算符
八.其它操作符
1.字符串运算符
字符串运算符只有⼀个,就是 “ + ”。作⽤就是把两个字符串相加
规则:⾄少有⼀个操作数是字符串就可以了
2.逗号运算符
使⽤逗号操作符可以在⼀条语句中执⾏多个操作
3.三元条件运算符
三元条件操作符其实就是我们后⾯要学到的if语句的简写形式
var result = 5>4?"对":"错";
console.log(result)
// 相当于if语句
var result = ''; //声明并且初始化变量
if(5>4){
result = '对'
}else{
result = '错'
}
console.log(result)
九.操作符优先级
详情查看:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence