JavaScript-操作符2

简介: 关系操作符、加性操作符、乘操作符等

1、乘性操作符

ECMAScript定义了三种乘性操作符,分别是:乘法、除法和取模。

如果乘性操作符有不是数值的操作数,则该操作数会在后台被使用 Number()转型函数转换为数值。这意味着空字符串会被当成 0,而布尔值 true 会被当成 1。

① 乘法操作符

乘法操作符由一个星号( *)表示,可以用于计算两个数值的乘积。其语法类似于 C 语言。

let res = 45*11;

如果 ECMAScript 不能表示乘积,则返回 Infinity(正无穷大)-Infinity(负无穷大)

如果有任一操作数是 NaN,则返回 NaN;

如果是 Infinity 乘以 0,则返回 NaN;

如果是 Infinity 乘以非 0 的有限数值,则根据第二个操作数的符号返回 Infinity-Infinity

如果是 Infinity 乘以 Infinity,则返回 Infinity;

如果有不是数值的操作数,则先在后台用 Number()将其转换为数值,然后再应用上述规则 ;

② 除法操作符

除法操作符由一个斜杠( /)表示,用于计算第一个操作数除以第二个操作数的商:

let res = 22/11;

如果 ECMAScript不能表示商, 则返回Infinity 或-Infinity;

如果有任一操作数是 NaN,则返回 NaN ;

如果是 Infinity 除以 Infinity,则返回 NaN;

如果是 0 除以 0,则返回 NaN;

如果是非 0 的有限值除以 0,则根据第一个操作数的符号返回 Infinity 或-Infinity;

如果是 Infinity 除以任何数值,则根据第二个操作数的符号返回 Infinity 或-Infinity;

如果有不是数值的操作数,则先在后台用 Number()函数将其转换为数值,然后再应用上述规则;

③ 取模操作符

取模(余数)操作符由一个百分比符号( %)表示:

let res = 6%5;   //res == 1

如果操作数是数值,则执行常规除法运算,返回余数。

如果被除数是无限值,除数是有限值,则返回 NaN。

如果被除数是有限值,除数是 0,则返回 NaN。

如果是 Infinity 除以 Infinity,则返回 NaN。

如果被除数是有限值,除数是无限值,则返回被除数。

如果被除数是 0,除数不是 0,则返回 0。

如果有不是数值的操作数,则先在后台用 Number()函数将其转换为数值,然后再应用上述规则。

2、指数操作符

ECMAScript 7 新增了指数操作符, Math.pow()现在有了自己的操作符**,结果是一样的:

console.log(Math.pow(3,2));        // 3的平方   9
console.log(3 ** 2);        //3的平方   9

console.log(Math.pow(16,0.5));        //16开根号    4
console.log(16 ** 0.5);        //16开根号    4

指数操作符也有自己的指数赋值操作符=**,该操作符执行指数运算和结果的赋值操作:

let squared = 3;
squared **= 2;
console.log(squared); // 9

let sqrt = 16;
sqrt **= 0.5;
console.log(sqrt); // 4

3、加性操作符

加法和减法操作符。

① 加法操作符

加法操作符( +)用于求两个数的和。

let res = 12+13;

如果有任一操作数是 NaN,则返回 NaN;

如果是 Infinity 加 Infinity,则返回 Infinity;

如果是-Infinity 加-Infinity,则返回-Infinity;

如果是 Infinity 加-Infinity,则返回 NaN;

如果是+0 加+0,则返回+0;

如果是-0 加-0,则返回-0。

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

如果两个操作数都是字符串,则将第二个字符串拼接到第一个字符串后面;

如果只有一个操作数是字符串,则将另一个操作数转换为字符串,再将两个字符串拼接在一起。

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

ECMAScript 中最常犯的一个错误,就是忽略加法操作中涉及的数据类型。

let num1 = 5;
let num2 = 10;
let message = "The sum of 5 and 10 is " + num1 + num2;
console.log(message); // "The sum of 5 and 10 is 510"  

如果想真正执行数学计算,然后把结果追加到字符串末尾,只要使用一对括号即可:

let num1 = 5;
let num2 = 10;
let message = "The sum of 5 and 10 is " + (num1 + num2);
console.log(message); // "The sum of 5 and 10 is 15"

② 减法操作符

let res = 3-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()方法,然后再
将得到的字符串转换为数值。

let result1 = 5 - true; // true 被转换为 1,所以结果是 4
let result2 = NaN - 1; // NaN
let result3 = 5 - 3; // 2
let result4 = 5 - ""; // ""被转换为 0,所以结果是 5
let result5 = 5 - "2"; // "2"被转换为 2,所以结果是 3
let result6 = 5 - null; // null 被转换为 0,所以结果是 5

4、关系操作符

关系操作符执行比较两个值的操作,包括小于( <)、大于( >)、小于等于( <=)和大于等于( >=)。

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

Θ 如果操作数都是数值,则执行数值比较。

Θ 如果操作数都是字符串,则逐个比较字符串中对应字符的编码。

Θ 如果有任一操作数是数值,则将另一个操作数转换为数值,执行数值比较。

Θ 如果有任一操作数是对象,则调用其 valueOf()方法,取得结果后再根据前面的规则执行比较。

Θ 如果没有 valueOf()操作符,则调用 toString()方法,取得结果后再根据前面的规则执行比较。

Θ 如果有任一操作数是布尔值,则将其转换为数值再执行比较。

大写字母的编码都小于小写字母的编码,因此以下这种情况就会发生:

let result = "Brick" < "alphabet"; // true

因为字母 B 的编码是 66,字母 a 的编码是 97。

将两个操作数都转换为小写,就能保证按照字母表顺序判定"alphabet"在"Brick"前头。

let str1 = "Brick";
let str2 = "alphabet"
let result = str1.toLowerCase() < str2.toLowerCase();     // false

在比较数值字符串(两个比较值都是数值)的时候,又会出现另外一种情况:

let result = "23" < "3"; // true

如果两个比较的对象只有一个是数值字符串,就会出现另外一种情况:

let result = "23" < 3;   // false

因为这次比较会先把“23”先转化为数值23,而后再进行比较。

但是,如果字符串不能转化为数值,新的情况就出现了:

let result = "a" < 2;    //因为"a"会转换为 NaN,所以结果是 false

任何关系操作符在涉及比较 NaN 时都返回 false

let res1 = NaN < 3;        //false
let res2 = NaN >= 66;       //false

5、相等操作符

第一组是等于不等于,它们在比较之前执行转换;

第二组是全等不全等,它们在比较之前不执行转换。

① 等于和不等于

等于操作符用两个等于号( ==)表示,如果操作数相等,则会返回 true。不等于操作符用叹号和等于号( !=)表示,如果两个操作数不相等,则会返回 true。这一组操作符在比较之前会先执行强制类型转换

转换规则如下:

✪ 如果任一操作数是布尔值,则将其转换为数值再比较是否相等。 false 转换为 0, true 转换为 1。

✪ 如果一个操作数是字符串,另一个操作数是数值,则尝试将字符串转换为数值,再比较是否相等。

✪ 如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf()方法取得其原始值,再根据前面的规则进 行比较。

进行比较时,规则如下:

✪ null 和 undefined 相等。

✪ null 和 undefined 不能转换为其他类型的值再进行比较。

✪ 如果有任一操作数是 NaN,则相等操作符返回 false,不相等操作符返回 true。即使两个操作数是 NaN,相等 操作符也返回 false,因为按照规则, NaN 不等于 NaN。

✪ 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符 返回 true。否则,两者不相等。

② 全等和不全等

全等和不全等操作符与相等和不相等操作符类似,只不过它们在比较相等时不转换操作数。全等操作符由 3 个等于号( ===)表示,只有两个操作数在不转换的前提下相等才返回 true。

let result1 = ("55" == 55); // true,转换后相等
let result2 = ("55" === 55); // false,不相等,因为数据类型不同

不全等操作符用一个叹号和两个等于号( !==)表示,只有两个操作数在不转换的前提下不相等才返回 true。

let result1 = ("55" != 55); // false,转换后相等
let result2 = ("55" !== 55); // true,不相等,因为数据类型不同

6、条件操作符

条件操作符是 ECMAScript 中用途最为广泛的操作符之一;

variable = boolean_expression ? true_value : false_value;

上面的代码执行了条件赋值操作,即根据条件表达式boolean_expression的值决定将哪个值赋给变量 variable。 如果boolean_expression是true,则赋值true_value;如 果boolean_expression是 false,则赋值 false_value

let max = (3>2) ? 15:19;   // max = 15

7、赋值操作符

简单赋值用等于号( =)表示,将右手边的值赋给左手边的变量 。

let num = 10;

复合赋值使用乘性、加性或位操作符后跟等于号( =)表示。

let num = 10;
num = num + 10;

//上述代码简写为
let num = 10;
num += 10;

☞ 乘后赋值( *=)

☞ 除后赋值( /=)

☞ 取模后赋值( %=)

☞ 加后赋值( +=)

☞ 减后赋值( -=)

☞ 左移后赋值( <<=)

☞ 右移后赋值( >>=)

☞ 无符号右移后赋值( >>>=)

相关文章
|
7月前
|
JavaScript 前端开发 算法
JavaScript 中算术操作符:全面解读、实战应用与最佳实践
【4月更文挑战第5天】本文探讨JavaScript中的算术操作符,包括加、减、乘、除、求余、自增、自减及复合赋值等,强调理解与熟练运用它们对提升编程效率和代码准确性的重要性。文中通过示例介绍了各种操作符的用法,同时提醒注意数据类型转换、浮点数精度、除以零错误以及利用短路求值优化逻辑等问题。通过学习,读者能更好地掌握算术操作符在不同场景的应用,提升编程技能。
79 1
|
7月前
|
JavaScript 前端开发 安全
javascript中的可选链操作符
javascript中的可选链操作符
|
4月前
|
JavaScript 前端开发 开发者
深入解析JavaScript中的比较操作符
【8月更文挑战第20天】
28 0
|
7月前
|
JavaScript 前端开发
探索JavaScript中的New操作符:原理与使用
探索JavaScript中的New操作符:原理与使用
|
7月前
egg.js 24.12sequelize模型-where操作符
egg.js 24.12sequelize模型-where操作符
63 1
egg.js 24.12sequelize模型-where操作符
|
JavaScript
JS new操作符的具体干了什么?
JS new操作符的具体干了什么?
56 1
|
JavaScript 前端开发 索引
JavaScript Day02 操作符及类型转换与流程控制语句 3
JavaScript Day02 操作符及类型转换与流程控制语句 3
75 0
|
Web App开发 JavaScript 前端开发
JavaScript Day02 操作符及类型转换与流程控制语句 1
JavaScript Day02 操作符及类型转换与流程控制语句 1
79 0
|
存储 JavaScript 前端开发
javascript基本语法学习(变量、数据类型、操作符、条件语句、循环)
javascript基本语法学习(变量、数据类型、操作符、条件语句、循环)
|
JavaScript
【new操作符做了什么 —— js】
【new操作符做了什么 —— js】