今天发现了一个非常巧妙的用法:~~。起初不太明白它的作用,查阅后才知道它是用于取整的操作,觉得非常有趣。于是,我整理了一些类似的巧妙用法,下面是它们的详细介绍:
1. 使用 ~~:快速取整(向零取整)
用法
~~ 是双按位取反操作,可以快速去掉小数部分,实现向零取整。
示例
let num = 5.7;
console.log(~~num); // 输出 5
num = -5.7;
console.log(~~num); // 输出 -5
特性
- 与
Math.trunc()类似,直接砍掉小数部分。 - 适用于正数和负数,但负数不会向下取整。
2. 使用 !:布尔值反转
用法
! 是逻辑非运算符,用于反转布尔值。
示例
let isTrue = true;
console.log(!isTrue); // 输出 false
let isFalse = false;
console.log(!isFalse); // 输出 true
双重使用(!!):转换为布尔值
用法:
用于将任意值转换为布尔值,适合在条件判断时确保数据类型一致。
示例
const a = null;
console.log(!!a); // 输出 false
const b = "hello";
console.log(!!b); // 输出 true
const c = "";
console.log(!!c); // 输出 false
!!可以将任意值快速转为布尔值。- 第一个
!将值转为布尔值并取反,第二个!再次取反恢复原逻辑。
3. 使用 +:快速将字符串转换为数字
用法
+ 运算符可以将字符串转换为数字。
示例
let str = "42";
console.log(+str); // 输出 42 (number 类型)
let floatStr = "3.14";
console.log(+floatStr); // 输出 3.14 (number 类型)
let invalidStr = "hello";
console.log(+invalidStr); // 输出 NaN
特性
+比parseInt()或Number()更简单快捷。- 对于非数字字符串,结果为
NaN。
4. 使用 |:快速取整(向零取整)
用法
x | 0 是按位或运算,可以去掉小数部分,直接取整。
示例
let num = 5.7;
console.log(num | 0); // 输出 5
num = -5.7;
console.log(num | 0); // 输出 -5
特性
- 与
~~类似,行为接近Math.trunc()。 - 适用于快速取整,只能用于 32 位数值。
5. 使用 ^:数值交换
用法
使用异或运算符 ^ 在两个变量之间交换值,而不需要使用额外的临时变量。
示例
let a = 5, b = 3;
a = a ^ b;
b = a ^ b;
a = a ^ b;
console.log(a); // 输出 3
console.log(b); // 输出 5
特性
- 适合在低级操作中使用。
- 注意:可能会因为类型隐式转换而导致问题(需要确保操作数是整数)。
6. 使用 && 和 ||:简化条件判断
逻辑与(&&)
- 如果第一个操作数为
false,直接返回第一个操作数。 - 如果第一个操作数为
true,返回第二个操作数。
示例
let a = 0 && "hello";
console.log(a); // 输出 0
let b = 1 && "hello";
console.log(b); // 输出 "hello"
逻辑或(||)
- 如果第一个操作数为
true,直接返回第一个操作数。 - 如果第一个操作数为
false,返回第二个操作数。
示例
let a = 0 || "hello";
console.log(a); // 输出 "hello"
let b = 1 || "hello";
console.log(b); // 输出 1
组合使用
let defaultValue = "default";
let value = null || defaultValue; // 如果 `value` 为 null,则取默认值
console.log(value); // 输出 "default"
7. 使用 &:快速判断是否为偶数
用法
x & 1 可以用来判断一个数是否为奇数或偶数。
示例
let num = 4;
console.log((num & 1) === 0); // 输出 true(偶数)
num = 5;
console.log((num & 1) === 0); // 输出 false(奇数)
特性
- 位运算符
&的效率很高。 x & 1检查二进制的最低位是否为 1,奇数最低位为 1,偶数最低位为 0。
8. 使用 ^:布尔值切换
用法
x ^ 1 可以快速切换布尔值。
示例
let isTrue = 1; // true
console.log(isTrue ^ 1); // 输出 0(false)
let isFalse = 0; // false
console.log(isFalse ^ 1); // 输出 1(true)
特性
- 适合在布尔值切换时使用。
- 对于布尔值
0和1,^ 1可以反转。
9. 使用三元运算符 ?::简化条件判断
用法
三元运算符是 if-else 的简化形式。
示例
let age = 18;
let category = age >= 18 ? "adult" : "minor";
console.log(category); // 输出 "adult"
特性
- 适合简短的条件判断。
- 代码更加简洁,可读性高。
10. 使用 Array 的解构与扩展运算符 ...
用法
用解构和扩展运算符快速操作数组和对象。
示例:交换变量
let a = 1, b = 2;
[a, b] = [b, a];
console.log(a, b); // 输出 2, 1
示例:复制数组
let arr = [1, 2, 3];
let copy = [...arr];
console.log(copy); // 输出 [1, 2, 3]
这些巧妙用法可以让代码更简洁高效,但也会导致可读性降低。因此,在实际开发中我们可以根据场景选择适合的用法。