ECMAScript操作符全解析:从一元到逗号操作符

作者:闭包旅人

时间:2026-10-24

浏览:101

本文系统梳理ECMAScript中的各类操作符,涵盖一元递增递减、逻辑非与与或、乘除模、加减法、关系比较、相等判断及条件与赋值操作符。详细解析各操作符对字符串、布尔值、对象及特殊数值(如NaN、Infinity)的处理规则与类型转换机制,帮助开发者精准掌握运算行为。

文章目录

一元操作符

仅针对单一值进行运算的操作符被称为一元操作符。

递增与递减操作符源自C语言,分为前置型和后置型两种形式。

  • 前置型:操作符置于变量之前。执行前置递增或递减时,变量的值在语句求值前即刻改变。

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

上述四个操作符适用于任何数据类型,包括字符串、布尔值、浮点数和对象,具体遵循以下转换规则:

  • 当操作数为包含有效数字字符的字符串时,先将其转换为数值,再执行加1或减1操作,结果变量类型变为数值。
  • 当操作数为不包含数字字符的字符串时,变量值被设为NaN,结果变量类型变为数值。
  • 当操作数为布尔值false时,先将其转换为0,再执行加1或减1操作,结果变量类型变为数值。
  • 当操作数布尔值true时,先将其转换为数值0再执行加减1的操作。布尔值变量变成数值变量
  • 当操作数为浮点数值时,直接执行加1或减1操作。
  • 当操作数为对象时,先调用对象的valueOf()方法获取可操作值,再应用上述规则;若结果为NaN,则调用toString()方法后再应用规则,结果变量类型变为数值。

上述规则可通过代码验证:


var s1 = "2";
var s2 = "z";
var b = false;
var f = 1.1;
var o = {
    valueOf: function () {
        return -1
    }
}
console.log(s1++); // 2
console.log(s1); // 3
console.log(s2++); // NaN
console.log(s2); // NaN
console.log(b++); // 0
console.log(b); // 1
console.log(f--); // 1.1
console.log(f); // 0.1000000000000009
console.log(o--); // -1
console.log(o); // -2

一元加与减操作符

一元加与减操作符主要用于算术运算,也可用于数据类型转换。对非数值应用一元操作符时,其行为类似于Number()转型函数。布尔值false和true分别转换为0和1;字符串按特定规则解析;对象则先调用valueOf()或toString()方法,再转换所得值。以一元加操作符为例:


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
s2 = +s2
s3 = +s3
b = +b
f = +f
o = +o
console.log(s1) // 1
console.log(s2) // 1.1
console.log(s3) // NaN
console.log(b) // 0
console.log(f) // 1.1
console.log(o) // -1

布尔操作符

布尔操作符包含三种:非(NOT)、与(AND)和或(OR)。

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(!""); // true
console.log(!0); // true
console.log(!undefined); // true
console.log(!null); // true
console.log(!NaN); // true
console.log(!12345); false

2、逻辑与。由两个和号(&&)表示,需两个操作数。逻辑与可应用于任何类型,不仅限于布尔值。当存在非布尔操作数时,结果未必为布尔值,此时遵循以下规则:

  • 若第一个操作数为对象,返回第二个操作数。
  • 若第二个操作数为对象,仅当第一个操作数求值结果为true时,才返回该对象。
  • 若两个操作数均为对象,返回第二个操作数。
  • 若第一个操作数为null,返回null。
  • 若第一个操作数为NaN,返回NaN。
  • 若第一个操作数为undefined,返回undefined。

逻辑与属于短路操作,即若第一个操作数已能决定结果,则不再对第二个操作数求值。

3、逻辑或。由两个竖线符号(||)表示,需两个操作数。与逻辑与类似,若存在非布尔操作数,结果未必为布尔值,此时遵循以下规则:

  • 若第一个操作数为对象,返回第一个操作数。
  • 若第一个操作数求值结果为false,返回第二个操作数。
  • 若两个操作数均为对象,返回第一个操作数。
  • 若两个操作数均为null,返回null。
  • 若两个操作数均为NaN,返回NaN。
  • 若两个操作数均为undefined,返回undefined。

与逻辑与类似,逻辑或也是短路操作。即若第一个操作数求值结果为true,则不再对第二个操作数求值。

乘性操作符

ECMAScript定义了三个乘性操作符:乘法、除法和求模。若参与乘性计算的操作数非数值,后台会先使用Number()转型函数将其转换为数值,例如空字符串视为0,布尔值true视为1。

1、乘法。由星号(*)表示,用于计算两个数值的乘积。处理特殊值时遵循以下规则:

  • 若操作数均为数值,执行常规乘法,即同号相乘结果为正,异号相乘结果为负。若乘积超出ECMAScript数值表示范围,则返回Infinity或-Infinity。
  • 若有一个操作数为NaN,结果为NaN。
  • 若Infinity与0相乘,结果为NaN。
  • 若Infinity与非0数值相乘,结果为Infinity或-Infinity,取决于有符号操作数的符号。
  • 若Infinity与Infinity相乘,结果为Infinity。
  • 若有一个操作数非数值,后台调用Number()将其转换为数值,再应用上述规则。

2、除法。由斜线符号(/)表示,执行第二个操作数除以第一个操作数的计算。遵循以下规则:

  • 若操作数均为数值,执行常规除法,即同号相除结果为正,异号相除结果为负。若超出ECMAScript数值表示范围,则返回Infinity或-Infinity。
  • 若有一个操作数为NaN,结果为NaN。
  • 若Infinity被Infinity除,结果为NaN。
  • 若0被0除,结果为NaN。
  • 若非零有限数被零除,结果为Infinity或-Infinity,取决于有符号操作数的符号。
  • 若Infinity被任何非零数值除,结果为Infinity或-Infinity,取决于有符号操作数的符号。
  • 若有一个操作数非数值,后台调用Number()将其转换为数值,再应用上述规则。

3、求模(余数)。由百分号(%)表示。遵循以下规则:

  • 若操作数均为数值,执行常规除法计算,返回余数。
  • 若被除数为无穷大值而除数为有限数值,结果为NaN。
  • 若被除数为有限数值而除数为零,结果为NaN。
  • 若Infinity被Infinity除,结果为NaN。
  • 若被除数为有限数值而除数为无穷大,结果为被除数。
  • 若被除数为零,结果为零。
  • 若有一个操作数非数值,后台调用Number()将其转换为数值,再应用上述规则。

加性操作符

与乘性操作符类似,加性操作符也会在后台转换不同数据类型。

1、加法。由加号(+)表示。若两个操作数均为数值,执行常规加法,并根据以下规则返回结果:

  • 若有一个操作数为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"。

2、减法。由减号(-)表示,与加法类似,遵循以下规则:

  • 若两个操作数均为数值,执行常规算术减法并返回结果。
  • 若有一个操作数为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
var result2 = NaN - 1
var result3 = 5 - 3
var result4 = 5 - ""
var result5 = 5 - "2"
var result6 = 5 - null
console.log(result1) // 4, true被转换为1
console.log(result2) // NaN
console.log(result3) // 2
console.log(result4) // 5, 空字符串被转换为0
console.log(result5) // 3,字符串2被转换为数字2
console.log(result6) // 5,因为null被转换为了0

关系操作符

关系操作符包括小于(<)、大于(>)、小于等于(<=)和大于等于(>=)四种比较。当操作数非数值时,需进行数据转换或执行特定操作。相应规则如下:

  • 若两个操作数均为数值,执行数值比较。
  • 若两个操作数均为字符串,比较两个字符串对应的字符编码值。
  • 若一个操作数为数值,将另一个操作数转换为数值,然后执行数值比较。
  • 若一个操作数为对象,调用该对象的valueOf()方法,用所得结果按前述规则比较。若对象无valueOf()方法,则调用toString()方法,并用所得结果按前述规则执行比较。
  • 若一个操作数为布尔值,先将其转换为数值,再执行比较。

字符串比较实际比较的是对应位置每个字符的字符编码值。比较完成后返回布尔值。大写字母的字符编码小于小写字母。

相等操作符

包含两组操作符:相等和不相等(先转换再比较);全等和不全等(仅比较不转换)。

1、相等和不相等。相等操作符由两个等于号(==)表示,若两操作数相等则返回true;不相等操作符由叹号后跟等于号(!=)表示,若两操作数不等则返回true。这两个操作符均先转换操作数(强制转型),再比较相等性。转换不同数据类型时遵循以下基本规则:

  • 若一个操作数为布尔值,比较前将其转换为数值——false转为0,true转为1。
  • 若一个操作数为字符串,另一个为数值,比较前先将字符串转换为数值。
  • 若一个操作数为对象,另一个非对象,调用对象的valueOf()方法,用所得基本类型值按前述规则比较。

这两个操作符进行比较时遵循下列规则:

  • null和undefined相等。
  • 比较前,不能将null和undefined转换为其他任何值。
  • 若有一个操作数为NaN,相等操作符返回false,不相等操作符返回true。即使两个操作数均为NaN,相等操作符也返回false,因为NaN不等于NaN。
  • 若两个操作数均为对象,比较它们是否指向同一对象。若指向同一对象,相等操作符返回true;否则返回false。

2、全等和不全等。全等操作符由三个等于号(===)表示,仅当两操作数未经转换即相等时返回true。不全等操作符由叹号后跟两个等于号(!==)表示,仅当两操作数未经转换即不等时返回true。


var result1 = ("55" == 55)
var result2 = ("55" === 55)
var result3 = ("55" != 55)
var result4 = ("55" !== 55)
console.log(result1) // true
console.log(result2) // false
console.log(result3) // false
console.log(result4) // true

条件操作符

语法:var max = (num1 > num2) ? num1 : num2

上述示例中,max将保存较大值。表达式含义为:若num1大于num2(关系表达式返回true),则将num1赋给max;若num1小于或等于num2(关系表达式返回false),则将num2赋给max。

赋值操作符

赋值操作符由等于号(=)表示,作用是将右侧值赋给左侧变量。若在等号前添加乘性、加性或位操作符,可完成复合赋值操作。每个主要算术操作符(及个别其他操作符)均有对应的复合赋值操作符,具体如下:

  • 乘/赋值——*=
  • 除/赋值——/=
  • 模/赋值——%=
  • 加/赋值——+=
  • 减/赋值——-=
  • 左移/赋值——<<=
  • 有符号右移/赋值——>>=
  • 无符号右移/赋值——>>>=

逗号操作符

逗号操作符可在一条语句中执行多个操作,如:var num1=1, num2=2, num3=3;。

逗号操作符还可用于赋值,用于赋值时,总会返回表达式中的最后一项,如:var num= (5, 6, 1, 4, 7, 0); // num值为0

总结

至此,关于ECMAScript中操作符的文章介绍完毕。更多相关ECMAScript操作符内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章