【问题标题】:The difference between ~~ and + in javascript?javascript中~~和+的区别?
【发布时间】:2013-01-19 13:35:48
【问题描述】:

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

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

任何澄清都会很棒:)

【问题讨论】:

  • 波浪号是按位的不是,重复两次就像按位的!!,只是它逐位旋转。
  • 作为旁注,我会考虑这两种不好的做法;您应该使用parseIntparseFloat 将字符串转换为数字。
  • @jbabey 感谢您澄清这一点。如果有人好奇,我想知道因为这个问题stackoverflow.com/questions/6911235/…

标签: javascript variables nan


【解决方案1】:

是的,有区别。试试~~"3.4"

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

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

来自the MDN

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • +1 表示“它们都使用了实际操作的副作用。通常您会使用 parseInt 或 parseFloat 之类的函数将字符串转换为数字。”
    • 我也要在这里 +1。
    【解决方案3】:

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

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

    【讨论】:

    • +1,还要注意舍入有点特殊:对于负值,它是ceil,但对于正数,它是floor
    • 啊,是这样吗?编辑更正。 -Edit- @pimvdb:似乎不是这样,因为 ~~"-3.4" 返回 -3。
    • 我的意思是~~"3.4" 返回3~~"-3.4" 返回-3。前者类似于Math.floor,而后者类似于Math.ceil
    • 哦,对,现在说得通了。我不知道我是怎么错过的——一定是想得太用力了,或者可能还不够用力。
    猜你喜欢
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 2013-05-28
    • 2011-07-24
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多