长话简说JavaScript(3)语言基础中的操作符

操作符

可用于操作数据值的操作符,包括数学操作符(如加、减)、位操作符、关系操作符和相等操作符等。

  1. 一元操作符:只操作一个值的操作符
    递增/递减操作符:递增/递减操作符在数值前面先执行,递增/递减操作符在数值后面后执行,示例:
let num = 2;
console.log(num--); // 2
console.log(num); // 1
console.log(num++); // 1
console.log(num); // 2
console.log(--num); // 1
console.log(num); // 1
console.log(++num); // 2
console.log(num); // 2

不限于整数——字符串、布尔值、浮点值,甚至对象都可以。示例:

let s1 = "2"; 
let s2 = "z"; 
let b = false; 
let f = 1.1; 
let o = { 
 valueOf() { 
 return -1; 
 } 
}; 
console.log(++s1); // 值变成数值 3 
console.log(++s2); // 值变成 NaN 
console.log(++b); // 值变成数值 1 
console.log(++f); // 值变成 2.1
console.log(++o); // 值变成 0
console.log(--s1); // 值变成数值 2 
console.log(--s2); // 值变成 NaN 
console.log(--b); // 值变成数值 0 
console.log(--f); // 值变成 1.1
console.log(--o); // 值变成 -1

一元加和减操作符:一元加由一个加号(+)表示,放在变量前头,对数值没有任何影响。如果将一元加应用到非数值,则会执行与使用 Number()转型函数一样的类型转换:布尔值 false和 true 转换为 0 和 1,字符串根据特殊规则进行解析,对象会调用它们的 valueOf()和/或 toString()方法以得到可以转换值。

let s1 = "01"; 
let s2 = "1.1"; 
let s3 = "z"; 
let b = false; 
let f = 1.1; 
let o = { 
 valueOf() { 
 return -1; 
 } 
}; 
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
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

2.位操作符:操作内存中表示数据的比特(位),属于数值的底层操作,ECMAScript数值储存格式为IEEE 754 64 位,位操作不直接应用到 64 位表示,先把值转换为32 位整数,进行位操作,结果转换为 64 位。这个涉及到二进制转化,简单介绍
按位非:对数值取反并减 1

let num1 = 1000000; 
let num2 = ~num1; 
let num3 =  -num1 - 1; 
console.log(num2); // -1000001
console.log(num3); // -1000001

按位与:将两个数转换成二进制后每一个位对齐,按位与操作在两个位都是 1 时返回 1,在任何一位是 0 时返回 0 结果转成10进制

let result = 52 & 50; // 52 二进制:110100 50 二进制:110010 结果 二进制:110000 转换成十进制
console.log(result); // 二进制:110000 十进制:48

这个能看不懂的话学一下进制这块 计算机起源 对大家的硬实力有帮助
按位或:将两个数转换成二进制后每一个位对齐按位与操作在至少一位是 1 时返回 1,两位都是 0 时返回 0,结果转成10进制。

let result = 52 | 50; // 52 二进制:110100 50 二进制:110010 结果 二进制:110110 转换成十进制
console.log(result); // 二进制:110110 十进制:54

按位异或:将两个数转换成二进制后每一个位对齐按位与操作在两位都是 1 或 0,则返回 0,结果转成10进制。

let result = 52 ^ 50; // 52 二进制:110100 50 二进制:110010 结果 二进制:110 转换成十进制
console.log(result); // 二进制:110 十进制:6

左移:按照指定的位数将数值的所有位向左移动

let result = 52 << 5; // 52 二进制:110100 结果 二进制:11010000000 转换成十进制
console.log(result); // 二进制:11010000000 十进制:1664

有符号右移:按照指定的位数将数值的所有位向右移动

let result = 52 >> 5; // 52 二进制:110100 结果 二进制:1 转换成十进制
console.log(result); // 二进制:1 十进制:1

无符号右移:对于正数,无符号右移与有符号右移结果相同,对于负数,其绝对值的二补数,所以右移之后结果变得非常大

let result = -52 >>> 3; // 52 二进制:110100 结果 二进制:11111111111111111111111111001 转换成十进制
console.log(result); // 二进制:11111111111111111111111111001 十进制:536870905

3.布尔操作符:判断两个值的关系
逻辑非:将操作数转换为布尔值,然后再对其取反。
如果操作数是对象,则返回 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
// 这个与上面相反
console.log(!!"blue"); // true 
console.log(!!0); // false 
console.log(!!NaN); // false 
console.log(!!""); // false 
console.log(!!12345); // true

逻辑与:判断两个值都是true,才执行 ,他会先判断一个值是不是true,不是true直接返回false

let found = false; 
let result = (found && some); // some没有定义
console.log(result); // false

逻辑与:判断两个值有一个是true,才执行 ,两个值都会进行判断,只要一个是true返回true

let found = false; 
let result = (found || some); // some没有定义
console.log(result); // Error: some is not defined

4.乘性操作符:乘法、除法和取模。如果乘性操作符有不是数值的操作数,则该操作数会在后台被使用 Number()转型函数转换为数值。这意味着空字符串会被当成 0,而布尔值 true 会被当成 1。
乘法操作符:两个正值相乘是正值,两个负值相乘也是正值,正负符号不同的值相乘得到负值。如果 ECMAScript 不能表示乘积,则返回 Infinity 或 -Infinity。如果有任一操作数是 NaN,则返回 NaN。如果是 Infinity 乘以 0,则返回 NaN。如果是 Infinity 乘以非 0的有限数值,则根据第二个操作数的符号返Infinity 或-Infinity。如果是 Infinity 乘以 Infinity,则返回 Infinity。如果有不是数值的操作数,则先在后台用Number()将其转换为数值。
除法操作符:计算第一个操作数除以第二个操作数的商。即两个正值相除是正值,两个负值相除也是正值,符号不同的值相除得到负值,其他的和乘法操作符差不多
取模操作符:取余数,其他的和乘法操作符差不多
5. 指数操作符: 数值的N次方,跟Math.pow()一样

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

6.加性操作符: 加法和减法操作符,与乘性操作符类似,加性操作符在后台会发生不同数据类型的转换。
加法操作符: 求两个数的和,如果有任一操作数是 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"。
减法操作符:求两个数的减值,如果两个操作数都是数值,则执行数学减法运算并返回结果。如果有任一操作数是 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()方法,然后再将得到的字符串转换为数值。
7.关系操作符: 执行比较两个值,包括小于(<)、大于(>)、小于等于(<=)和大于等于(>=), 如果操作数都是数值,则执行数值比较。 如果操作数都是字符串,则逐个比较字符串中对应字符的编码。如果有任一操作数是数值,则将另一个操作数转换为数值,执行数值比较。如果有任一操作数是对象,则调用其 valueOf()方法,取得结果后再根据前面的规则执行比较。如果没有 valueOf()操作符,则调用 toString()方法,取得结果后再根据前面的规则执行比较。如果有任一操作数是布尔值,则将其转换为数值再执行比较。
8.相等操作符: 判断两个变量是否相等,在比较字符串、数值和布尔值是否相等时,过程都很直观。但是在比较两个对象是否相等时,情形就比较复杂了。
等于和不等于:如果操作数相等,则会返回 true。不等于操作符用叹号和等于号(!=)表示,如果两个操作数不相等,则会返回 true。这两个操作符都会先进行类型转换(通常称为强制类型转换)再确定操作数是否相等, 如果任一操作数是布尔值,则将其转换为数值再比较是否相等。false 转换为 0,true 转换为 1。如果一个操作数是字符串,另一个操作数是数值,则尝试将字符串转换为数值,再比较是否相等。如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf()方法取得其原始值,再根据前面的规则进行比较。在进行比较时,这两个操作符会遵循如下规则。
null 和 undefined 相等。null 和 undefined 不能转换为其他类型的值再进行比较。如果有任一操作数是 NaN,则相等操作符返回 false,不相等操作符返回 true。记住:即使两个操作数都是 NaN,相等操作符也返回 false,因为按照规则,NaN 不等于 NaN。  如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回 true。否则,两者不相等。
全等和不全等:在比较相等时不转换操作数

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

9.条件操作符: variable = boolean_expression ? true_value : false_value;正则表达式
10.赋值操作符 :右手边的值赋给左手边的变量, 乘后赋值(*=), 除后赋值(/=), 取模后赋值(%=), 加后赋值(+=),减后赋值(-=), 左移后赋值(<<=), 右移后赋值(>>=) ,无符号右移后赋值(>>>=)
11.逗号操作符:在一条语句中执行多个操作

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

听不见你的名字

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值