JavaScript中的巧妙操作:那些让代码更简洁高效的小技巧

146 阅读4分钟

今天发现了一个非常巧妙的用法:~~。起初不太明白它的作用,查阅后才知道它是用于取整的操作,觉得非常有趣。于是,我整理了一些类似的巧妙用法,下面是它们的详细介绍:


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); // 输出 0falselet isFalse = 0; // false
console.log(isFalse ^ 1); // 输出 1true

特性

  • 适合在布尔值切换时使用。
  • 对于布尔值 01^ 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]

这些巧妙用法可以让代码更简洁高效,但也会导致可读性降低。因此,在实际开发中我们可以根据场景选择适合的用法。