MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

JavaScript操作符的基本原理

2024-09-257.6k 阅读

算术操作符

JavaScript 中的算术操作符用于执行基本的数学运算,例如加、减、乘、除等。这些操作符是我们进行数值计算的基础,深入理解它们的原理对于编写正确高效的代码至关重要。

加法操作符(+)

加法操作符既可以用于数字相加,也可以用于字符串拼接。当操作数都是数字时,它执行常规的加法运算。例如:

let num1 = 5;
let num2 = 3;
let sum = num1 + num2;
console.log(sum); 

在上述代码中,num1num2 都是数字类型,+ 操作符将它们相加并将结果赋值给 sum,最终输出 8

当其中一个操作数是字符串时,加法操作符会执行字符串拼接。例如:

let str1 = "Hello";
let str2 = " World";
let result = str1 + str2;
console.log(result); 

这里 str1str2 都是字符串,+ 操作符将它们拼接在一起,输出 "Hello World"

如果一个操作数是数字,另一个是字符串,JavaScript 会尝试将数字转换为字符串再进行拼接。例如:

let num = 10;
let str = " years old";
let message = num + str;
console.log(message); 

此时数字 10 被转换为字符串 "10",然后与 " years old" 拼接,输出 "10 years old"

减法操作符(-)

减法操作符用于计算两个数字之间的差值。它只适用于数字类型的操作数,如果操作数不是数字,JavaScript 会尝试将其转换为数字。例如:

let num1 = 8;
let num2 = 3;
let difference = num1 - num2;
console.log(difference); 

上述代码中,num1 减去 num2 得到差值 5 并输出。

如果操作数中有非数字类型,会进行强制类型转换。例如:

let num = 5;
let nonNum = "2";
let result = num - nonNum;
console.log(result); 

这里 "2" 会被转换为数字 2,然后进行减法运算,输出 3。如果无法转换为有效数字(如 "abc"),结果将为 NaN

let num = 10;
let invalidStr = "abc";
let result = num - invalidStr;
console.log(result); 

此代码中,由于 "abc" 无法转换为数字,结果是 NaN

乘法操作符(*)

乘法操作符用于计算两个数字的乘积。同样,如果操作数不是数字,会尝试进行类型转换。例如:

let num1 = 4;
let num2 = 5;
let product = num1 * num2;
console.log(product); 

这里 num1 乘以 num2 得到 20 并输出。

对于可以转换为数字的非数字操作数:

let num = 3;
let str = "2";
let result = num * str;
console.log(result); 

"2" 转换为数字 2,然后与 3 相乘,输出 6

除法操作符(/)

除法操作符用于计算两个数字的商。操作数同样会进行类型转换,如果除数为 0,结果将是 Infinity-Infinity,取决于被除数的正负。例如:

let num1 = 10;
let num2 = 2;
let quotient = num1 / num2;
console.log(quotient); 

这里 10 除以 2 得到 5 并输出。

当除数为 0 时:

let positiveNum = 5;
let negativeNum = -5;
console.log(positiveNum / 0); 
console.log(negativeNum / 0); 

输出分别为 Infinity-Infinity

取模操作符(%)

取模操作符返回两个数相除的余数。例如:

let num1 = 10;
let num2 = 3;
let remainder = num1 % num2;
console.log(remainder); 

这里 10 除以 3 的余数是 1,所以输出 1

同样,操作数会进行类型转换:

let num = 7;
let str = "2";
let result = num % str;
console.log(result); 

"2" 转换为数字 27 除以 2 的余数为 1,输出 1

自增和自减操作符(++,--)

自增操作符(++)将变量的值增加 1,自减操作符(--)将变量的值减少 1。它们有两种使用方式:前置和后置。

前置自增/自减操作符会先修改变量的值,然后返回修改后的值。例如:

let num1 = 5;
let newNum1 = ++num1;
console.log(num1); 
console.log(newNum1); 

这里 num1 先自增为 6,然后 newNum1 被赋值为 6,所以两个 console.log 都输出 6

后置自增/自减操作符会先返回变量原来的值,然后再修改变量的值。例如:

let num2 = 5;
let newNum2 = num2++;
console.log(num2); 
console.log(newNum2); 

newNum2 先被赋值为 5num2 的原始值),然后 num2 自增为 6,所以第一个 console.log 输出 6,第二个输出 5

比较操作符

比较操作符用于比较两个值,并返回一个布尔值(truefalse),表示比较的结果。这些操作符在条件判断和排序等场景中广泛应用。

相等操作符(==)

相等操作符比较两个值是否相等,但在比较前会进行类型转换。例如:

let num = 5;
let str = "5";
console.log(num == str); 

这里 num 是数字类型,str 是字符串类型,== 操作符会将 str 转换为数字 5,然后比较,结果为 true

需要注意的是,nullundefined 彼此相等,并且与自身相等,但与其他任何值都不相等。例如:

console.log(null == undefined); 
console.log(null == null); 
console.log(undefined == undefined); 
console.log(null == 0); 

前三个 console.log 输出 true,最后一个输出 false

全等操作符(===)

全等操作符不仅比较值,还比较类型。只有当两个值的类型和值都相同时,才返回 true。例如:

let num = 5;
let str = "5";
console.log(num === str); 

这里类型不同,尽管值看起来一样,结果为 false

let num1 = 5;
let num2 = 5;
console.log(num1 === num2); 

类型和值都相同,结果为 true

不相等操作符(!=)

不相等操作符是 == 的反操作,它返回 == 操作符结果的相反值。例如:

let num = 5;
let str = "5";
console.log(num != str); 

因为 num == strtrue,所以 num != strfalse

不全等操作符(!==)

不全等操作符是 === 的反操作,返回 === 操作符结果的相反值。例如:

let num = 5;
let str = "5";
console.log(num!== str); 

因为 num === strfalse,所以 num!== strtrue

大于操作符(>)和小于操作符(<)

大于和小于操作符用于比较两个值的大小关系。如果操作数是数字,直接比较数值大小。例如:

let num1 = 5;
let num2 = 3;
console.log(num1 > num2); 
console.log(num1 < num2); 

第一个 console.log 输出 true,第二个输出 false

如果操作数是字符串,会按照字符的 Unicode 编码顺序进行比较。例如:

let str1 = "apple";
let str2 = "banana";
console.log(str1 < str2); 

因为 'a' 的 Unicode 编码小于 'b',所以输出 true

如果一个操作数是数字,另一个是字符串,会尝试将字符串转换为数字再进行比较。例如:

let num = 5;
let str = "3";
console.log(num > str); 

"3" 转换为数字 3,然后比较,输出 true

大于等于操作符(>=)和小于等于操作符(<=)

大于等于和小于等于操作符是 >< 的扩展,它们在比较结果为相等时也返回 true。例如:

let num1 = 5;
let num2 = 5;
console.log(num1 >= num2); 
console.log(num1 <= num2); 

两个 console.log 都输出 true

逻辑操作符

逻辑操作符用于处理布尔值,它们可以组合多个条件,在条件判断和逻辑控制中起着关键作用。

逻辑与操作符(&&)

逻辑与操作符(&&)用于连接两个布尔表达式。只有当两个表达式的值都为 true 时,整个表达式才返回 true,否则返回 false。例如:

let condition1 = true;
let condition2 = false;
console.log(condition1 && condition2); 

这里 condition2false,所以整个表达式返回 false

逻辑与操作符具有短路特性,即如果第一个表达式为 false,第二个表达式不会被计算。例如:

function check1() {
    console.log("Function check1 called");
    return false;
}
function check2() {
    console.log("Function check2 called");
    return true;
}
console.log(check1() && check2()); 

在上述代码中,check1() 返回 false,由于短路特性,check2() 不会被调用,输出 "Function check1 called"false

逻辑或操作符(||)

逻辑或操作符(||)连接两个布尔表达式。只要两个表达式中有一个为 true,整个表达式就返回 true,只有当两个表达式都为 false 时,才返回 false。例如:

let condition1 = true;
let condition2 = false;
console.log(condition1 || condition2); 

这里 condition1true,所以整个表达式返回 true

逻辑或操作符也有短路特性,如果第一个表达式为 true,第二个表达式不会被计算。例如:

function check1() {
    console.log("Function check1 called");
    return true;
}
function check2() {
    console.log("Function check2 called");
    return false;
}
console.log(check1() || check2()); 

check1() 返回 true,由于短路特性,check2() 不会被调用,输出 "Function check1 called"true

逻辑非操作符(!)

逻辑非操作符(!)用于对一个布尔值取反。如果操作数为 true,则返回 false;如果操作数为 false,则返回 true。例如:

let condition = true;
console.log(!condition); 

这里 conditiontrue,取反后输出 false

逻辑非操作符也可以用于将非布尔值转换为布尔值。例如:

let num = 0;
let str = "hello";
console.log(!num); 
console.log(!str); 

0 被视为 false,取反后为 true;非空字符串被视为 true,取反后为 false

位操作符

位操作符在 JavaScript 中用于对二进制表示的数字进行操作。虽然在日常开发中使用频率相对较低,但在处理一些底层算法或优化性能时可能会用到。

按位与操作符(&)

按位与操作符对两个数字的二进制表示的每一位进行与操作。只有当两个对应位都为 1 时,结果位才为 1,否则为 0。例如:

let num1 = 5; 
let num2 = 3; 
let result = num1 & num2;
console.log(result); 

5 的二进制表示是 1013 的二进制表示是 011,按位与操作后得到 001,即十进制的 1,所以输出 1

按位或操作符(|)

按位或操作符对两个数字的二进制表示的每一位进行或操作。只要两个对应位中有一个为 1,结果位就为 1,只有当两个对应位都为 0 时,结果位才为 0。例如:

let num1 = 5; 
let num2 = 3; 
let result = num1 | num2;
console.log(result); 

5 的二进制 1013 的二进制 011 按位或操作后得到 111,即十进制的 7,所以输出 7

按位异或操作符(^)

按位异或操作符对两个数字的二进制表示的每一位进行异或操作。当两个对应位不同时,结果位为 1,当两个对应位相同时,结果位为 0。例如:

let num1 = 5; 
let num2 = 3; 
let result = num1 ^ num2;
console.log(result); 

5 的二进制 1013 的二进制 011 按位异或操作后得到 110,即十进制的 6,所以输出 6

按位非操作符(~)

按位非操作符对一个数字的二进制表示的每一位进行取反操作,0 变为 11 变为 0。例如:

let num = 5; 
let result = ~num;
console.log(result); 

5 的二进制 101 取反后得到 010,但由于 JavaScript 中数字采用补码表示,最终结果为 -6

左移操作符(<<)

左移操作符将一个数字的二进制表示向左移动指定的位数,右边用 0 填充。例如:

let num = 5; 
let result = num << 2;
console.log(result); 

5 的二进制 101 左移 2 位后得到 10100,即十进制的 20,所以输出 20

右移操作符(>>)

右移操作符将一个数字的二进制表示向右移动指定的位数,对于正数,左边用 0 填充;对于负数,左边用符号位(即最高位)填充。例如:

let num1 = 5; 
let result1 = num1 >> 1;
console.log(result1); 

let num2 = -5; 
let result2 = num2 >> 1;
console.log(result2); 

5 的二进制 101 右移 1 位后得到 010,即十进制的 2-5 的二进制补码为 11111111111111111111111111111011,右移 1 位后得到 11111111111111111111111111111101,其十进制值为 -3

无符号右移操作符(>>>)

无符号右移操作符将一个数字的二进制表示向右移动指定的位数,无论正负,左边始终用 0 填充。例如:

let num1 = 5; 
let result1 = num1 >>> 1;
console.log(result1); 

let num2 = -5; 
let result2 = num2 >>> 1;
console.log(result2); 

5 的二进制 101 无符号右移 1 位后得到 010,即十进制的 2-5 的二进制补码 11111111111111111111111111111011 无符号右移 1 位后得到 01111111111111111111111111111101,其十进制值为 2147483645

赋值操作符

赋值操作符用于将值赋给变量。除了基本的赋值操作符(=)外,还有一些复合赋值操作符,它们可以在赋值的同时进行其他运算。

基本赋值操作符(=)

基本赋值操作符将右侧的值赋给左侧的变量。例如:

let num = 5;
console.log(num); 

这里将 5 赋给变量 num,然后输出 5

复合赋值操作符

  1. 加法赋值操作符(+=):将变量的值与右侧的值相加,然后将结果赋给变量。例如:
let num = 5;
num += 3;
console.log(num); 

相当于 num = num + 3,最终 num 的值为 8

  1. 减法赋值操作符(-=):将变量的值减去右侧的值,然后将结果赋给变量。例如:
let num = 8;
num -= 3;
console.log(num); 

相当于 num = num - 3,最终 num 的值为 5

  1. 乘法赋值操作符(*=):将变量的值与右侧的值相乘,然后将结果赋给变量。例如:
let num = 4;
num *= 2;
console.log(num); 

相当于 num = num * 2,最终 num 的值为 8

  1. 除法赋值操作符(/=):将变量的值除以右侧的值,然后将结果赋给变量。例如:
let num = 10;
num /= 2;
console.log(num); 

相当于 num = num / 2,最终 num 的值为 5

  1. 取模赋值操作符(%=):将变量的值对右侧的值取模,然后将结果赋给变量。例如:
let num = 7;
num %= 3;
console.log(num); 

相当于 num = num % 3,最终 num 的值为 1

  1. 左移赋值操作符(<<=):将变量的二进制表示向左移动右侧指定的位数,然后将结果赋给变量。例如:
let num = 5;
num <<= 2;
console.log(num); 

相当于 num = num << 2,最终 num 的值为 20

  1. 右移赋值操作符(>>=):将变量的二进制表示向右移动右侧指定的位数,然后将结果赋给变量。例如:
let num = 8;
num >>= 1;
console.log(num); 

相当于 num = num >> 1,最终 num 的值为 4

  1. 无符号右移赋值操作符(>>>=):将变量的二进制表示无符号向右移动右侧指定的位数,然后将结果赋给变量。例如:
let num = 8;
num >>>= 1;
console.log(num); 

相当于 num = num >>> 1,最终 num 的值为 4

  1. 按位与赋值操作符(&=):将变量的二进制表示与右侧值的二进制表示按位与,然后将结果赋给变量。例如:
let num = 5;
num &= 3;
console.log(num); 

相当于 num = num & 3,最终 num 的值为 1

  1. 按位或赋值操作符(|=):将变量的二进制表示与右侧值的二进制表示按位或,然后将结果赋给变量。例如:
let num = 5;
num |= 3;
console.log(num); 

相当于 num = num | 3,最终 num 的值为 7

  1. 按位异或赋值操作符(^=):将变量的二进制表示与右侧值的二进制表示按位异或,然后将结果赋给变量。例如:
let num = 5;
num ^= 3;
console.log(num); 

相当于 num = num ^ 3,最终 num 的值为 6

其他操作符

除了上述常见的操作符外,JavaScript 还有一些其他类型的操作符,它们各自有独特的用途。

条件操作符(三元操作符)(? :)

条件操作符是 JavaScript 中唯一的三元操作符,它根据一个条件来决定返回两个值中的哪一个。语法为 condition? value1 : value2,如果 conditiontrue,返回 value1,否则返回 value2。例如:

let num = 5;
let result = num > 3? "Greater than 3" : "Less than or equal to 3";
console.log(result); 

这里 num > 3true,所以 result 被赋值为 "Greater than 3" 并输出。

逗号操作符(,)

逗号操作符用于在一条语句中执行多个表达式,它会从左到右依次计算每个表达式,并返回最后一个表达式的值。例如:

let result = (1 + 2, 3 + 4);
console.log(result); 

先计算 1 + 2 得到 3,再计算 3 + 4 得到 7,最终 result 被赋值为 7 并输出。

typeof 操作符

typeof 操作符用于返回一个变量的数据类型。例如:

let num = 5;
let str = "hello";
let bool = true;
console.log(typeof num); 
console.log(typeof str); 
console.log(typeof bool); 

分别输出 "number""string""boolean"

instanceof 操作符

instanceof 操作符用于检测一个对象是否是某个构造函数的实例。例如:

function Person(name) {
    this.name = name;
}
let person1 = new Person("John");
console.log(person1 instanceof Person); 

这里 person1Person 构造函数的实例,所以输出 true

delete 操作符

delete 操作符用于删除对象的属性。例如:

let person = {name: "John", age: 30};
delete person.age;
console.log(person); 

person 对象的 age 属性被删除,最终输出 {name: "John"}

通过对 JavaScript 各种操作符基本原理的深入理解,开发者可以更加灵活和准确地编写代码,实现各种复杂的逻辑和功能。无论是简单的数值计算,还是复杂的对象操作,操作符都是 JavaScript 编程的重要基石。