JavaScript语言基础(四)

五、操作符

一组可以操作数据值的操作符,包括数学操作符、位操作符、关系操作符和相等操作符等。

(一)、一元操作符

只操作一个值的操作符叫一元操作符。

1、递增/递减操作符

前缀版:把两个加号(++)或两个减号(–)放到变量前面。
后缀版:把两个加号(++)或两个减号(–)放到变量后面。
**注意:**后缀版单独使用不会有差异,但是在跟其他操作混合后会出现差异。

	let a = 10;
    let b = 20;
    let num1 = 2;
    let num2 = 20;
    let num3 = num1-- + num2;
    let num4 = num1 + num2;
    let num5 = --a +b;
    let num6 = a+b;
    console.log(num3); // 22
    console.log(num4); // 21
    console.log(num5); // 29
    console.log(num6); // 29

规则:
1、对于字符串,如果是有效的数值形式,则转换为数值再应用改变。变量类型从字符串变成数值。
2、对于字符串,如果不是有效的数值形式,则将变量的值设置为 NaN 。变量类型从字符串变成数值。
3、对于布尔值,如果是 false,则转换为 0 再应用改变。变量类型从布尔值变成数值。
4、对于布尔值,如果是 true,则转换为 1 再应用改变。变量类型从布尔值变成数值。
5、对于浮点值,加 1 或减 1。
6、 如果是对象,则调用其valueOf()方法取得可以操作的值。对得到的值应用上述规则。如果是 NaN,则调用 toString()并再次应用其他规则。变量类型从对象变成数值。

let s1 = "2"; 
let s2 = "z"; 
let b = false; 
let f = 1.1; 
let o = { 
 valueOf() { 
 return -1; 
 } 
}; 
s1++; // 值变成数值 3 
s2++; // 值变成 NaN 
b++; // 值变成数值 1 
f--; // 值变成 0.10000000000000009(因为浮点数不精确)
o--; // 值变成-2

2、一元加和减

一元加:一元加由一个加号(+)表示,放在变量前头。非数值会执行与使用 Number()转型函数一样的类型转换。
一元减:一元减由一个减号(-)表示,放在变量前头,主要用于把数值变成负值。非数值同一元加。

let num = 25; 
num = +num; 
console.log(num); // 25
//转换
let s1 = "01"; 
let s2 = "1.1";
let s3 = "z"; 
let b = false; 
let f = 1.1; 
let o = { 
 valueOf() { 
 return -1; 
 } 
}; 
s1 = +s1; // 值变成数值 1 
s2 = +s2; // 值变成数值 1.1 
s3 = +s3; // 值变成 NaN 
b = +b; // 值变成数值 0 
f = +f; // 不变,还是 1.1 
o = +o; // 值变成数值-1


let num = 25; 
num = -num; 
console.log(num); // -25
//转换
let s1 = "01"; 
let s2 = "1.1"; 
let s3 = "z"; 
let b = false; 
let f = 1.1; 
let o = { 
 valueOf() { 
 return -1; 
 } 
}; 
s1 = -s1; // 值变成数值-1 
s2 = -s2; // 值变成数值-1.1 
s3 = -s3; // 值变成 NaN 
b = -b; // 值变成数值 0 
f = -f; // 变成-1.1 
o = -o; // 值变成数值 1

(二)、位操作符 (简)

位操作符用于数值的底层操作,也就是操作内存中表示数据的比特(位)。(ECMAScript中的所有数值都以 IEEE 754 64 位格式存储,但位操作并不直接应用到 64 位表示,而是先把值转换为32 位整数,再进行位操作,之后再把结果转换为 64 位。对开发者而言,就好像只有 32 位整数一样,因为 64 位整数存储格式是不可见的。既然知道了这些,就只需要考虑 32 位整数即可。)
有符号整数使用 32 位的前 31 位表示整数值。第 32 位表示数值的符号,如 0 表示正,1 表示负。这一位称为符号位(sign bit),它的值决定了数值其余部分的格式。
正值: 以真正的二进制格式存储,即 31位中的每一位都代表 2 的幂。第一位(称为第 0 位)表示 2⁰,第二位表示 2¹,依此类推。如果一个位是空的,则以0填充,相当于忽略不计.
负值: 以一种称为二补数(或补码)的二进制编码存储。一个数值的二补数通过如下 3 个步骤计算得到:
(1) 确定绝对值的二进制表示(如,对于-18,先确定 18 的二进制表示);
(2) 找到数值的一补数(或反码),换句话说,就是每个 0 都变成 1,每个 1 都变成 0;
(3) 给结果加 1。

(三) 、布尔操作符

布尔操作符一共有 3 个:逻辑非、逻辑与和逻辑或。

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()

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

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

2、逻辑与

逻辑与操作符由两个和号(&&)表示,应用到两个值。
逻辑与操作符是一种短路操作符。如果第一个操作数决定了结果,那么永远不会对第二个操作数求值。
逻辑与操作符可用于任何类型的操作数,不限于布尔值。如果有操作数不是布尔值,则逻辑与并不一定会返回布尔值,而是遵循如下规则:

  1. 如果第一个操作数是对象,则返回第二个操作数。
  2. 如果第二个操作数是对象,则只有第一个操作数求值为 true 才会返回该对象。
  3. 如果两个操作数都是对象,则返回第二个操作数。
  4. 如果有一个操作数是 null,则返回 null。
  5. 如果有一个操作数是 NaN,则返回 NaN。
  6. 如果有一个操作数是 undefined,则返回 undefined。

逻辑与操作符遵循如下真值表

第一个操作数第二个操作数结果
truetruetrue
truefalsefalse
falsetruefalse
falsefalsefalse
let found = true; 
let result = (found && someUndeclaredVariable); // 这里会出错 someUndeclaredVariable is not defined
console.log(result); // 不会执行这一行

let found = false; 
let result = (found && someUndeclaredVariable); // 不会出错
console.log(result); // 会执行

3、逻辑或

逻辑或操作符由两个管道符(||)表示
与逻辑与类似,如果有一个操作数不是布尔值,那么逻辑或操作符也不一定返回布尔值。它遵循如下规则。

  1. 如果第一个操作数是对象,则返回第一个操作数。
  2. 如果第一个操作数求值为 false,则返回第二个操作数。
  3. 如果两个操作数都是对象,则返回第一个操作数。
  4. 如果两个操作数都是 null,则返回 null。
  5. 如果两个操作数都是 NaN,则返回 NaN。
  6. 如果两个操作数都是 undefined,则返回 undefined。

逻辑或操作符遵循如下真值表:

第一个操作数第二个操作数结果
truetruetrue
truefalsetrue
falsetruetrue
falsefalsefalse
let found = true; 
let result = (found || someUndeclaredVariable); // 不会出错
console.log(result); // 会执行

let found = false; 
let result = (found || someUndeclaredVariable); // 这里会出错
console.log(result); // 不会执行这一行

(四)、乘性操作符

ECMAScript 定义了 3 个乘性操作符:乘法、除法和取模。

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

1、 乘法操作符

乘法操作符由一个星号(*)表示,可以用于计算两个数值的乘积。
乘法操作符在处理特殊值时也有一些特殊的行为。

  1. 如果操作数都是数值,则执行常规的乘法运算,即两个正值相乘是正值,两个负值相乘也是正值,正负符号不同的值相乘得到负值。如果 ECMAScript 不能表示乘积,则返回 Infinity 或-Infinity。
  2. 如果有任一操作数是 NaN,则返回 NaN。
  3. 如果是 Infinity 乘以 0,则返回 NaN。
  4. 如果是 Infinity 乘以非 0的有限数值,则根据第二个操作数的符号返回 Infinity 或-Infinity。
  5. 如果是 Infinity 乘以 Infinity,则返回 Infinity。
  6. 如果有不是数值的操作数,则先在后台用 Number()将其转换为数值,然后再应用上述规则。

2. 除法操作符

除法操作符由一个斜杠(/)表示,用于计算第一个操作数除以第二个操作数的商,
跟乘法操作符一样,除法操作符针对特殊值也有一些特殊的行为。

  1. 如果操作数都是数值,则执行常规的除法运算,即两个正值相除是正值,两个负值相除也是正值,符号不同的值相除得到负值。如果ECMAScript不能表示商,则返回Infinity或-Infinity。
  2. 如果有任一操作数是 NaN,则返回 NaN。
  3. 如果是 Infinity 除以 Infinity,则返回 NaN。
  4. 如果是 0 除以 0,则返回 NaN。
  5. 如果是非 0 的有限值除以 0,则根据第一个操作数的符号返回 Infinity 或-Infinity。
  6. 如果是 Infinity 除以任何数值,则根据第二个操作数的符号返回 Infinity 或-Infinity。
  7. 如果有不是数值的操作数,则先在后台用 Number()函数将其转换为数值,然后再应用上述规则。

3. 取模操作符

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

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

与其他乘性操作符一样,取模操作符对特殊值也有一些特殊的行为。

  1. 如果操作数是数值,则执行常规除法运算,返回余数。
  2. 如果被除数是无限值,除数是有限值,则返回 NaN。
  3. 如果被除数是有限值,除数是 0,则返回 NaN。
  4. 如果是 Infinity 除以 Infinity,则返回 NaN。
  5. 如果被除数是有限值,除数是无限值,则返回被除数。
  6. 如果被除数是 0,除数不是 0,则返回 0。
  7. 如果有不是数值的操作数,则先在后台用 Number()函数将其转换为数值,然后再应用上述规则。

(五)、指数操作符

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

console.log(Math.pow(3, 2); // 9 
console.log(3 ** 2); // 9 
console.log(Math.pow(16, 0.5); // 4 
console.log(16** 0.5); // 4

指数操作符也有自己的指数赋值操作符**=。

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

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

(六)、加性操作符

加法和减法操作符。

1. 加法操作符

加法操作符(+)用于求两个数的和。
如果两个操作数都是数值,加法操作符执行加法运算并根据如下规则返回结果:

  1. 如果有任一操作数是 NaN,则返回 NaN;
  2. 如果是 Infinity 加 Infinity,则返回 Infinity;
  3. 如果是-Infinity 加-Infinity,则返回-Infinity;
  4. 如果是 Infinity 加-Infinity,则返回 NaN
  5. 如果是+0 加+0,则返回+0;
  6. 如果是-0 加+0,则返回+0;
  7. 如果是-0 加-0,则返回-0。

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

  1. 如果两个操作数都是字符串,则将第二个字符串拼接到第一个字符串后面;
  2. 如果只有一个操作数是字符串,则将另一个操作数转换为字符串,再将两个字符串拼接在一起。如果有任一操作数是对象、数值或布尔值,则调用它们的 toString()方法以获取字符串,然后再应用前面的关于字符串的规则。对于 undefined 和 null,则调用String()函数,分别获取"undefined"和"null"。
let result1 = 5 + 5; // 两个数值
console.log(result1); // 10 
let result2 = 5 + "5"; // 一个数值和一个字符串
console.log(result2); // "55"

2. 减法操作符

减法操作符(-)也是使用很频繁的一种操作符。
与加法操作符一样,减法操作符也有一组规则用于处理 ECMAScript 中不同类型之间的转换。

  1. 如果两个操作数都是数值,则执行数学减法运算并返回结果。
  2. 如果有任一操作数是 NaN,则返回 NaN。
  3. 如果是 Infinity 减 Infinity,则返回 NaN。
  4. 如果是-Infinity 减-Infinity,则返回 NaN。
  5. 如果是 Infinity 减-Infinity,则返回 Infinity。
  6. 如果是-Infinity 减 Infinity,则返回-Infinity。
  7. 如果是+0 减+0,则返回+0。
  8. 如果是+0 减-0,则返回-0。
  9. 如果是-0 减-0,则返回+0。
  10. 如果有任一操作数是字符串、布尔值、null 或 undefined,则先在后台使用 Number()将其转换为数值,然后再根据前面的规则执行数学运算。如果转换结果是 NaN,则减法计算的结果是NaN。
  11. 如果有任一操作数是对象,则调用其 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

(七)、关系操作符

关系操作符执行比较两个值的操作,包括小于(<)、大于(>)、小于等于(<=)和大于等于(>=),这几个操作符都返回布尔值。
与 ECMAScript 中的其他操作符一样,在将它们应用到不同数据类型时也会发生类型转换和其他行为。

  1. 如果操作数都是数值,则执行数值比较。
  2. 如果操作数都是字符串,则逐个比较字符串中对应字符的编码。
  3. 如果有任一操作数是数值,则将另一个操作数转换为数值,执行数值比较。
  4. 如果有任一操作数是对象,则调用其 valueOf()方法,取得结果后再根据前面的规则执行比较。如果没有 valueOf()操作符,则调用 toString()方法,取得结果后再根据前面的规则执行比较。
  5. 如果有任一操作数是布尔值,则将其转换为数值再执行比较。
let result = "Brick" < "alphabet"; // true   大写字母的编码都小于小写字母的编码
let result = "Brick".toLowerCase() < "alphabet".toLowerCase(); // false
let result = "23" < "3"; // true
let result = "23" < 3; // false (字符"2"的编码是 50,而字符"3"的编码是 51)
let result = "a" < 3; // 因为"a"会转换为 NaN,所以结果是 false
let result1 = NaN < 3; // false 
let result2 = NaN >= 3; // false

(八)、相等操作符

ECMAScript提供了两组操作符。第一组是等于和不等于,它们在比较之前执行转换。第二组是全等和不全等,它们在比较之前不执行转换。

1. 等于和不等于

ECMAScript 中的等于操作符用两个等于号(==)表示,如果操作数相等,则会返回 true。不等于操作符用叹号和等于号(!=)表示,如果两个操作数不相等,则会返回 true。这两个操作符都会先进行类型转换(通常称为强制类型转换)再确定操作数是否相等。
在转换操作数的类型时,相等和不相等操作符遵循如下规则。

  1. 如果任一操作数是布尔值,则将其转换为数值再比较是否相等。false 转换为 0,true 转换为 1。
  2. 如果一个操作数是字符串,另一个操作数是数值,则尝试将字符串转换为数值,再比较是否相等。
  3. 如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf()方法取得其原始值,再根据前面的规则进行比较。

在进行比较时,这两个操作符会遵循如下规则。

  1. null 和 undefined 相等。
  2. null 和 undefined 不能转换为其他类型的值再进行比较。
  3. 如果有任一操作数是 NaN,则相等操作符返回 false,不相等操作符返回 true。记住: 即使两个操作数都是 NaN,相等操作符也返回 false,因为按照规则,NaN 不等于 NaN。
  4. 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回 true。否则,两者不相等。

下表总结了一些特殊情况及比较的结果。

表达式结果
null == undefinedtrue
“NaN” == NaNfalse
5 == NaNfalse
NaN == NaNfalse
NaN != NaNtrue
true == 1true
true == 2true
false == 0false
undefined == 0false
null == 0false
“5” == 5true

2. 全等和不全等

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

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

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

(九)、条件操作符

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


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

(十)、赋值操作符

简单赋值用等于号(=)表示,将右手边的值赋给左手边的变量。
每个数学操作符以及其他一些操作符都有对应的复合赋值操作符:

  1. 乘后赋值(*=)
  2. 除后赋值(/=)
  3. 取模后赋值(%=)
  4. 加后赋值(+=)
  5. 减后赋值(-=)
  6. 左移后赋值(<<=)
  7. 右移后赋值(>>=)
  8. 无符号右移后赋值(>>>=)

注意: 这些操作符仅仅是简写语法,使用它们不会提升性能。

(十一)、逗号操作符

逗号操作符可以用来在一条语句中执行多个操作

let num1 = 1, num2 = 2, num3 = 3; //声明多个变量是逗号操作符最常用的场景

let num = (5, 1, 4, 8, 0); // num 的值为 0  num 将被赋值为 0,因为 0 是表达式中最后一项
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值