ES笔记—基础之操作符篇

描述:用于操作数据值的操作符,包括算术操作符(如加号和减号)、位操作符、关系操作符和相等操作符。

1、一元操作符

描述:只能操作一个值的操作符叫做一元操作符。

递增和递减操作符

// 前置
var age = 29;
var anotherAge = --age + 2;
console.log(age); // 输出 28
console.log(anotherAge); // 输出 30
// 后置
var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2; // 等于 22
var num4 = num1 + num2; // 等于 21

一元加和减操作符主要用于基本的算术运算,也可以用于转换数据类型。

var s1 = "01";
var s2 = "1.1";
var s3 = "z";
var b = false;
var f = 1.1;
var o = {
  valueOf: function() {
    return -1;
  }
};
s1 = -s1; // 值变成了数值-1
s2 = -s2; // 值变成了数值-1.1
s3 = -s3; // 值变成了 NaN
b = -b; // 值变成了数值 0
f = -f; // 变成了-1.1
o = -o; // 值变成了数值 1
2、布尔操作符

描述:共有 3 个:非(NOT)、与(AND)和或(OR)
2.1 、逻辑非操作符由一个叹号(!)表示,可以应用于 ECMAScript 中的任何值。无论这个值是什么数据类型,这个操作符都会返回一个布尔值。逻辑非操作符首先会将它的操作数转换为一个布尔值,然后再对其求反。逻辑非操作符遵循下列规则:

操作数是一个对象,返回 false;
操作数是一个空字符串,返回 true;
操作数是一个非空字符串,返回 false;
操作数是数值 0,返回 true;
操作数是任意非 0 数值(包括 Infinity),返回 false;
操作数是 null,返回 true;
操作数是 NaN,返回 true;
操作数是 undefined,返回 true。

console.log(!false); // true
console.log(!"blue"); // false
console.log(!0); // true
console.log(!NaN); // true
console.log(!""); // true
console.log(!12345); // false

逻辑非操作符也可以用于将一个值转换为与其对应的布尔值。而同时使用两个逻辑非操作符,实际上就会模拟 Boolean()转型函数的行为。

console.log(!!"blue"); //true
console.log(!!0); //false
console.log(!!NaN); //false
console.log(!!""); //false
console.log(!!12345); //true

2.2、逻辑与操作符由两个和号(&&)表示,有两个操作数

逻辑与操作可以应用于任何类型的操作数,而不仅仅是布尔值。在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值;此时,它遵循下列规则:

第一个操作数是对象,则返回第二个操作数;
第二个操作数是对象,则只有在第一个操作数的求值结果为 true 的情况下才会返回该对象;
两个操作数都是对象,则返回第二个操作数;
有一个操作数是 null,则返回 null;
有一个操作数是 NaN,则返回 NaN;
有一个操作数是 undefined,则返回 undefined。

逻辑与操作属于短路操作,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值。对于逻辑与操作而言,如果第一个操作数是 false,则无论第二个操作数是什么值,结果都不再可能是true 。

var found = false;
var result = (found && someUndefinedVariable); // 不会发生错误
alert(result); // 会执行( "false")

2.3、逻辑或操作符由两个竖线符号(||)表示,有两个操作数

与逻辑与操作相似,如果有一个操作数不是布尔值,逻辑或也不一定返回布尔值;此时,它遵循下列规则:

第一个操作数是对象,则返回第一个操作数;
第一个操作数的求值结果为 false,则返回第二个操作数;
两个操作数都是对象,则返回第一个操作数;
两个操作数都是 null,则返回 null;
两个操作数都是 NaN,则返回 NaN;
两个操作数都是 undefined,则返回 undefined。

与逻辑与操作符相似,逻辑或操作符也是短路操作符。也就是说,如果第一个操作数的求值结果为
true,就不会对第二个操作数求值了

var found = true;
var result = (found || someUndefinedVariable); // 不会发生错误
alert(result); // 会执行( "true")
3、乘性操作符

乘性操作符:乘法、除法和求模,在操作数为非数值的情况下会执行自动的类型转换。即参与乘性计算某个操作数不是数值,后台会先使用 Number()转型函数将其转换为数值。

3.1、 乘法操作符由一个星号(*)表示,用于计算两个数值的乘积

var result = 34 * 56;

在处理特殊值的情况下,乘法操作符遵循下列特殊的规则:

操作数都是数值,执行常规的乘法计算。乘积超过了 ECMAScript 数值的表示范围,则返回 Infinity 或-Infinity;
有一个操作数是 NaN,则结果是 NaN;
Infinity 与 0 相乘,则结果是 NaN;
Infinity 与非 0 数值相乘,则结果是 Infinity 或-Infinity;
Infinity 与 Infinity 相乘,则结果是 Infinity;
操作数不是数值,则在后台调用 Number()将其转换为数值,然后再应用上面的规则。

3.2、除法操作符由一个斜线符号(/)表示,执行第二个操作数除第一个操作数的计算

var result = 66 / 11;

对特殊的值也有特殊的处理规则。这些规则如下:

操作数都是数值,执行常规的除法计算。如果商超过了 ECMAScript 数值的表示范围,则返回 Infinity 或-Infinity;
一个操作数是 NaN,则结果是 NaN;
Infinity 被 Infinity 除,则结果是 NaN;
零被零除,则结果是 NaN;
非零的有限数被零除,则结果是 Infinity 或-Infinity;
Infinity 被任何非零数值除,则结果是 Infinity 或-Infinity;
操作数不是数值,则在后台调用 Number()将其转换为数值,然后再应用上面的规则。

3.3、求模(余数)操作符由一个百分号(%)表示

var result = 26 % 5; // 等于 1

求模操作符会遵循下列特殊规则来处理特殊的值:

操作数都是数值,执行常规的除法计算,返回除得的余数;
被除数是无穷大值而除数是有限大的数值,则结果是 NaN;
被除数是有限大的数值而除数是零,则结果是 NaN;
Infinity 被 Infinity 除,则结果是 NaN;
被除数是有限大的数值而除数是无穷大的数值,则结果是被除数;
被除数是零,则结果是零;
操作数不是数值,则在后台调用 Number()将其转换为数值,然后再应用上面的规则。

4、加性操作符

描述:加法和减法这两个加性操作符应该说是编程语言中最简单的算术操作符了。但是在 ECMAScript 中,这两个操作符却都有一系列的特殊行为。与乘性操作符类似,加性操作符也会在后台转换不同的数据类型。然而,对于加性操作符而言,相应的转换规则还稍微有点复杂。

4.1、加法操作符(+)

var result = 1 + 2;

两个操作符都是数值,执行常规的加法计算,然后根据下列规则返回结果:

有一个操作数是 NaN,则结果是 NaN;
Infinity 加 Infinity,则结果是 Infinity;
-Infinity 加-Infinity,则结果是-Infinity;
Infinity 加-Infinity,则结果是 NaN;
+0 加+0,则结果是+0;
-0 加-0,则结果是-0;
是+0 加-0,则结果是+0。

如果有一个操作数是字符串,那么就要应用如下规则:

两个操作数都是字符串,则将第二个操作数与第一个操作数拼接起来;
只有一个操作数是字符串,则将另一个操作数转换为字符串,然后再将两个字符串拼接起来。
有一个操作数是对象、数值或布尔值,则调用它们的 toString()方法取得相应的字符串值,然后再应用前面关于字符串的规则。
对于 undefined 和 null,则分别调用 String()函数并取得字符串"undefined"和"null"。

var result1 = 5 + 5; // 两个数值相加
console.log(result1); // 10
var result2 = 5 + "5"; // 一个数值和一个字符串相加
console.log(result2); // "55"

4.2、减法操作符(-)

var result = 2 - 1;

减法操作符在处理各种数据类型转换时,同样需要遵循一些特殊规则,如下所示:

两个操作符都是数值,则执行常规的算术减法操作并返回结果;
有一个操作数是 NaN,则结果是 NaN;
Infinity 减 Infinity,则结果是 NaN;
-Infinity 减-Infinity,则结果是 NaN;
Infinity 减-Infinity,则结果是 Infinity;
-Infinity 减 Infinity,则结果是-Infinity;
+0 减+0,则结果是+0;
+0 减-0,则结果是-0;
-0 减-0,则结果是+0;
操作数是字符串、布尔值、 null 或 undefined,则先在后台调用 Number()函数将其转换为数值,然后再根据前面的规则执行减法计算。如果转换的结果是 NaN,则减法的结果就是 NaN;
操作数是对象,则调用对象的 valueOf()方法以取得表示该对象的数值。如果得到的值是 NaN,则减法的结果就是 NaN。如果对象没有 valueOf()方法,则调用其 toString()方法并将得到的字符串转换为数值。

var result1 = 5 - true; // 4,因为 true 被转换成了 1
var result2 = NaN - 1; // NaN
var result3 = 5 - 3; // 2
var result4 = 5 - ""; // 5,因为"" 被转换成了 0
var result5 = 5 - "2"; // 3,因为"2"被转换成了 2
var result6 = 5 - null; // 5,因为 null 被转换成了 0
5、关系操作符

描述:小于(<) 、大于(>) 、小于等于(<=)和大于等于(>=)用于对两个值进行比较。都返回一个布尔值

var result1 = 5 > 3; //true
var result2 = 5 < 3; //false

关系操作符的操作数使用了非数值时,也要进行数据转换或完成某些奇怪的操作。以下就是相应的规则。

两个操作数都是数值,则执行数值比较;
两个操作数都是字符串,则比较两个字符串对应的字符编码值;
操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较;
操作数是对象,则调用这个对象的 valueOf()方法,用得到的结果按照前面的规则执行比较。如果对象没有 valueOf()方法,则调用 toString()方法,并用得到的结果根据前面的规则执行比较;
操作数是布尔值,则先将其转换为数值,然后再执行比较;
任何操作数与 NaN 进行关系比较,结果都是 false。

6、相等操作符

描述:确定两个变量是否相等是编程中的一个非常重要的操作。涉及到对象的比较时,问题就变得复杂了。最早的 ECMAScript 中的相等和不等操作符会在执行比较之前,先将对象转换成相似的类型。后来,有人提出了这种转换到底是否合理的质疑。最后, ECMAScript 的解决方案就是提供两组操作符: 相等和不相等——先转换再比较, 全等和不全等——仅比较而不转换。

6.1、相等操作符由两个等于号(==)表示,如果两个操作数相等,则返回 true。而不相等操作符由叹号后跟等于号(!=)表示,如果两个操作数不相等,则返回 true。这两个操作符都会先转换操作数(通常称为强制转型),然后再比较它们的相等性。

在转换不同的数据类型时,相等和不相等操作符遵循下列基本规则:

有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false 转换为 0,而true 转换为 1;
一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;
一个操作数是对象,另一个操作数不是,则调用对象的 valueOf()方法,用得到的基本类型值按照前面的规则进行比较;
null 和 undefined 是相等的;
要比较相等性之前,不能将 null 和 undefined 转换成其他任何值;
有一个操作数是 NaN,则相等操作符返回 false,而不相等操作符返回 true。重要提示:即使两个操作数都是 NaN,相等操作符也返回 false;因为按照规则, NaN 不等于 NaN。
两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回 true;否则,返回 false。

null == undefined // true
true == 1 // true
"NaN" == NaN // false
true == 2 // false
5 == NaN // false
undefined == 0 // false
NaN == NaN // false
null == 0 // false
NaN != NaN // true
"5"==5 // true
false == 0 // true

6.2、全等操作符由 3 个等于号(===)表示,它只在两个操作数未经转换就相等的情况下返回 true。不全等操作符由一个叹号后跟两个等于号(!==)表示,它在两个操作数未经转换就不相等的情况下返回 true。

var result1 = ("55" == 55); //true,因为转换后相等
var result2 = ("55" === 55); //false,因为不同的数据类型不相等
var result1 = ("55" != 55); //false,因为转换后相等
var result2 = ("55" !== 55); //true,因为不同的数据类型不相等
7、条件操作符

条件操作符应该算是 ECMAScript 中最灵活的一种操作符了,而且它遵循与 Java 中的条件操作符相同的语法形式,如下面的例子所示:variable = boolean_expression ? true_value : false_value

var max = (num1 > num2) ? num1 : num2;
8、赋值操作符

简单的赋值操作符由等于号(=)表示,其作用就是把右侧的值赋给左侧的变量,在等于号(=)前面再添加乘性操作符、加性操作符或位操作符,就可以完成复合赋值操作。

var num = 10;
num += 10;
9、逗号操作符

描述:使用逗号操作符可以在一条语句中执行多个操作。

var num1=1, num2=2, num3=3;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容