JavaScript位非「~」运算符是什么?

1. 引言

JavaScript作为一门充满活力和灵活性的编程语言,它的运算符功能是非常强大和灵活的,其中一个不太常用的运算符是位非(tilde)运算符(~),所以本文将深入探讨JavaScript位非(~)运算符的含义、语法以及使用场景。

2. 位非(~)运算符的语法

位非运算符的作用是把操作数转换为32位有符号整型,并翻转每一位,如果位为1则转换为0,如果位为0则转换为1。

~num

其中,num可以是任何数字或表达式,如果num不是数字,它会首先尝试转换为数字,例如:

~"3.14" // -4

在这里,字符串"3.14"首先被转换为数字3.14,然后用位非运算符取反,由于JavaScript使用32位表示数字,所以位非运算符与数字3.14最终生成的是-4。

3. 位非(~)运算符的使用场景

位非运算符在日常编程中用得不是很多,但是它还是有一些高级用途。

3.1 字符串翻转

有一种广为人知的字符串翻转方法是使用位非运算符(~)和slice()方法。

const str = "Hello World!";

const reversedStr = str.split("").reverse().join("");

console.log(reversedStr); // "!dlroW olleH"

const reversedStr2 = ~str.split("").map((char) => char.charCodeAt(0)).join("") + 1

console.log(reversedStr2); // "4981398163982673"

在这里,我们首先将字符串转换为一个数组,然后使用数组的reverse()方法翻转数组,最后使用join()方法将其转换回字符串。这种方法非常简单,但是对于短字符串更有效。

如果字符串比较长,则可以使用String.charCodeAt()方法将字符串转换为数字数组,然后使用Array.join()方法将数字数组转换回字符串,并使用位非运算符对其进行取反。最后,我们还要加1以防止在翻转后的数字开头加上"-"。

3.2 判断一个数是否存在于数组中

位非(~)运算符可以用来检查一个数是否存在于数组中,并且知道这个数在数组中的位置,我们可以在以下代码中看到这一点:

var numArray = [1, 2, 3, 4, 5];

var target = 3;

if (~numArray.indexOf(target)) {

console.log("The number " + target + " exists in the array.");

} else {

console.log("The number " + target + " does not exist in the array.");

}

在这里,我们使用Array.indexOf()方法检查一个数是否存在于数组中,如果存在,indexOf方法返回该数字在数组中的索引值,这个值在JavaScript中可以作为布尔值运算,即0为假,其余为真。

使用位非运算符对其运算结果进行取反,取反后可以得到一个更有用的值,如果数字不存在,则位非运算符将返回-1,-1在JavaScript中也是true,如果数字存在,则位非运算符将返回该数字在数组中的索引,索引从0开始,大于等于0也是true。

在此基础上我们可以再次运用位非运算符,来判断数字是否存在数组中。在这种情况下,位非运算符将返回一个非负数(即数字出现在数组中),或-1(即数字不在数组中),如果数字为0,则需要进一步区分它是数字存在于数组中的值,还是数字0,在此情况下,可以使用另一个运算符("===")对结果进行更具体的比较,如下所示:

if (~numArray.indexOf(target)) {

console.log("The number " + target + " exists in the array.");

} else if (numArray.indexOf(target) === 0) {

console.log("The number " + target + " was found at position 0.");

} else {

console.log("The number " + target + " does not exist in the array.");

}

3.3 求两个数的平均值

我们可以使用位非运算符来计算两个数的平均值,例如:

const x = 10;

const y = 20;

const avg = ~~((x + y) / 2);

console.log(avg); // 15

在这里,位非运算符将转换两个数的平均值为32位整数,由于JavaScript使用浮点数表示数字,因此需要将平均值的小数部分去掉,并将其转换为整数。

4. 结论

本文详细介绍了JavaScript位非(~)运算符的语法和使用场景,包括字符串翻转、判断数字是否在数组中以及计算两个数的平均值等情况。虽然该操作符不太常用,但是在一些特殊情况下,它可以非常有用。