2

它们似乎都输出相同的结果并将字符串转换为数字。有我不知道的区别吗?我似乎找不到任何有关 ~~ 运算符的文档。

var hey = true
hey = +hey //hey = 1

var hey = true 
hey = ~~hey //hey = 1

var num = "1231"
num = ~~num //num = 1231

var num = "1231"
num = +num //num = 1231

我发现了一个不同之处,那就是 ~~ 总是会尝试输出一个数字,而在某些情况下 + 会简单地返回 NaN

num = "omfg"
num = ~~num //num = 0

num = "omfg"
num = +num //num = NaN

num = {}
num = ~~num //num = 0

num = {}
num = +num //num = NaN

任何澄清都会很棒:)

4

3 回答 3

5

两者都会将操作数隐式转换为数字,因为运算符只能用于数字。

不同的是,~操作符是位操作符,所以它也会把数字变成32位整数。(结果仍然是类型Number,即双精度浮点数。)

两者都不是将值转换为数字的描述性方式,因为它们都使用了实际操作的副作用。通常你会使用类似parseIntor的函数parseFloat将字符串转换为数字。

于 2013-02-04T19:14:00.583 回答
2

是,有一点不同。试试~~"3.4"

就像+, 一样,~~尽可能将后面的内容转换为数字,但与+它不同的是,它使其成为整数。

在 javascript 中,位运算符总是将数字减少为 32 位整数。而这个“反转其操作数的位”(这意味着整数部分不会因双重执行而改变)。

来自MDN

所有按位运算符的操作数都以大端顺序和二进制补码格式转换为有符号的 32 位整数。

于 2013-02-04T19:11:59.260 回答
2

+num会将字符串转换为数字,但不会将十进制数字转换为整数。对于包含字符和数字的字符串,NaN返回。

~~num会将字符串转换为数字并去掉任何小数(不四舍五入)。对于包含字符和数字的字符串,0返回。

于 2013-02-04T19:13:38.267 回答