JavaScript操作符的基本原理
算术操作符
JavaScript 中的算术操作符用于执行基本的数学运算,例如加、减、乘、除等。这些操作符是我们进行数值计算的基础,深入理解它们的原理对于编写正确高效的代码至关重要。
加法操作符(+)
加法操作符既可以用于数字相加,也可以用于字符串拼接。当操作数都是数字时,它执行常规的加法运算。例如:
let num1 = 5;
let num2 = 3;
let sum = num1 + num2;
console.log(sum);
在上述代码中,num1
和 num2
都是数字类型,+
操作符将它们相加并将结果赋值给 sum
,最终输出 8
。
当其中一个操作数是字符串时,加法操作符会执行字符串拼接。例如:
let str1 = "Hello";
let str2 = " World";
let result = str1 + str2;
console.log(result);
这里 str1
和 str2
都是字符串,+
操作符将它们拼接在一起,输出 "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"
转换为数字 2
,7
除以 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
先被赋值为 5
(num2
的原始值),然后 num2
自增为 6
,所以第一个 console.log
输出 6
,第二个输出 5
。
比较操作符
比较操作符用于比较两个值,并返回一个布尔值(true
或 false
),表示比较的结果。这些操作符在条件判断和排序等场景中广泛应用。
相等操作符(==)
相等操作符比较两个值是否相等,但在比较前会进行类型转换。例如:
let num = 5;
let str = "5";
console.log(num == str);
这里 num
是数字类型,str
是字符串类型,==
操作符会将 str
转换为数字 5
,然后比较,结果为 true
。
需要注意的是,null
和 undefined
彼此相等,并且与自身相等,但与其他任何值都不相等。例如:
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 == str
为 true
,所以 num != str
为 false
。
不全等操作符(!==)
不全等操作符是 ===
的反操作,返回 ===
操作符结果的相反值。例如:
let num = 5;
let str = "5";
console.log(num!== str);
因为 num === str
为 false
,所以 num!== str
为 true
。
大于操作符(>)和小于操作符(<)
大于和小于操作符用于比较两个值的大小关系。如果操作数是数字,直接比较数值大小。例如:
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);
这里 condition2
为 false
,所以整个表达式返回 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);
这里 condition1
为 true
,所以整个表达式返回 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);
这里 condition
为 true
,取反后输出 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
的二进制表示是 101
,3
的二进制表示是 011
,按位与操作后得到 001
,即十进制的 1
,所以输出 1
。
按位或操作符(|)
按位或操作符对两个数字的二进制表示的每一位进行或操作。只要两个对应位中有一个为 1
,结果位就为 1
,只有当两个对应位都为 0
时,结果位才为 0
。例如:
let num1 = 5;
let num2 = 3;
let result = num1 | num2;
console.log(result);
5
的二进制 101
与 3
的二进制 011
按位或操作后得到 111
,即十进制的 7
,所以输出 7
。
按位异或操作符(^)
按位异或操作符对两个数字的二进制表示的每一位进行异或操作。当两个对应位不同时,结果位为 1
,当两个对应位相同时,结果位为 0
。例如:
let num1 = 5;
let num2 = 3;
let result = num1 ^ num2;
console.log(result);
5
的二进制 101
与 3
的二进制 011
按位异或操作后得到 110
,即十进制的 6
,所以输出 6
。
按位非操作符(~)
按位非操作符对一个数字的二进制表示的每一位进行取反操作,0
变为 1
,1
变为 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
。
复合赋值操作符
- 加法赋值操作符(+=):将变量的值与右侧的值相加,然后将结果赋给变量。例如:
let num = 5;
num += 3;
console.log(num);
相当于 num = num + 3
,最终 num
的值为 8
。
- 减法赋值操作符(-=):将变量的值减去右侧的值,然后将结果赋给变量。例如:
let num = 8;
num -= 3;
console.log(num);
相当于 num = num - 3
,最终 num
的值为 5
。
- 乘法赋值操作符(*=):将变量的值与右侧的值相乘,然后将结果赋给变量。例如:
let num = 4;
num *= 2;
console.log(num);
相当于 num = num * 2
,最终 num
的值为 8
。
- 除法赋值操作符(/=):将变量的值除以右侧的值,然后将结果赋给变量。例如:
let num = 10;
num /= 2;
console.log(num);
相当于 num = num / 2
,最终 num
的值为 5
。
- 取模赋值操作符(%=):将变量的值对右侧的值取模,然后将结果赋给变量。例如:
let num = 7;
num %= 3;
console.log(num);
相当于 num = num % 3
,最终 num
的值为 1
。
- 左移赋值操作符(<<=):将变量的二进制表示向左移动右侧指定的位数,然后将结果赋给变量。例如:
let num = 5;
num <<= 2;
console.log(num);
相当于 num = num << 2
,最终 num
的值为 20
。
- 右移赋值操作符(>>=):将变量的二进制表示向右移动右侧指定的位数,然后将结果赋给变量。例如:
let num = 8;
num >>= 1;
console.log(num);
相当于 num = num >> 1
,最终 num
的值为 4
。
- 无符号右移赋值操作符(>>>=):将变量的二进制表示无符号向右移动右侧指定的位数,然后将结果赋给变量。例如:
let num = 8;
num >>>= 1;
console.log(num);
相当于 num = num >>> 1
,最终 num
的值为 4
。
- 按位与赋值操作符(&=):将变量的二进制表示与右侧值的二进制表示按位与,然后将结果赋给变量。例如:
let num = 5;
num &= 3;
console.log(num);
相当于 num = num & 3
,最终 num
的值为 1
。
- 按位或赋值操作符(|=):将变量的二进制表示与右侧值的二进制表示按位或,然后将结果赋给变量。例如:
let num = 5;
num |= 3;
console.log(num);
相当于 num = num | 3
,最终 num
的值为 7
。
- 按位异或赋值操作符(^=):将变量的二进制表示与右侧值的二进制表示按位异或,然后将结果赋给变量。例如:
let num = 5;
num ^= 3;
console.log(num);
相当于 num = num ^ 3
,最终 num
的值为 6
。
其他操作符
除了上述常见的操作符外,JavaScript 还有一些其他类型的操作符,它们各自有独特的用途。
条件操作符(三元操作符)(? :)
条件操作符是 JavaScript 中唯一的三元操作符,它根据一个条件来决定返回两个值中的哪一个。语法为 condition? value1 : value2
,如果 condition
为 true
,返回 value1
,否则返回 value2
。例如:
let num = 5;
let result = num > 3? "Greater than 3" : "Less than or equal to 3";
console.log(result);
这里 num > 3
为 true
,所以 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);
这里 person1
是 Person
构造函数的实例,所以输出 true
。
delete 操作符
delete
操作符用于删除对象的属性。例如:
let person = {name: "John", age: 30};
delete person.age;
console.log(person);
person
对象的 age
属性被删除,最终输出 {name: "John"}
。
通过对 JavaScript 各种操作符基本原理的深入理解,开发者可以更加灵活和准确地编写代码,实现各种复杂的逻辑和功能。无论是简单的数值计算,还是复杂的对象操作,操作符都是 JavaScript 编程的重要基石。