【问题标题】:Is unary operator +(variable) interpretted the same as Number(variable)?一元运算符 +(variable) 是否与 Number(variable) 解释相同?
【发布时间】:2017-09-29 07:10:21
【问题描述】:

我突然想知道这两个例子是否相同。

    // sampler pack one
    const something = '5'
    console.log(typeof something)
    const thing = +(something)
    console.log(typeof thing)
    
    // sampler pack two
    const something2 = '5'
    console.log(typeof something2)
    const thing2 = Number(something2)
    console.log(typeof thing2)

我的问题的本质是我经常使用Number() 来确保某些字符串被解释为数字,那么一元加运算符在 JavaScript 引擎盖下是否相同?还是更快?还是它突出了任何特殊情况? (尤其是大数或特殊类型的数字?)

我刚刚在这里进行了这个测试,结果显示它们非常相似:

const unaryStart = performance.now()
const something2 = '5'
const thing2 = +(something2)
const unaryEnd = performance.now()
console.log((unaryEnd - unaryStart) + ' ms')

const numberStart = performance.now()
const something = '5'
const thing = Number(something)
const numberEnd = performance.now()
console.log((numberEnd - numberStart) + ' ms')
        
0.0049999999999954525 ms
0.0049999999999954525 ms

【问题讨论】:

  • 似乎是特定于实现的。结果在 Chrome、IE 和 Microsoft Edge 上几乎相同,但 Number() 在 Firefox 上始终慢 9-10 倍。
  • 按照标准,两者都调用内部ToNumber,但Number 函数会检查通过new 运算符调用的案例。 Unary +, Number.
  • 边缘情况当然是 Number 没有引用您期望的内置函数,因为有人覆盖了全局或在本地隐藏了它。操作员无法做到这一点。

标签: javascript unary-operator


【解决方案1】:

两者都将字符串转换为Number,来自MDN 关于unary plus +

[...] 一元加法是将某物转换为数字的最快和首选方式,因为它不对数字执行任何其他操作。

来自标准 ECMA 262 V 6,unary plus

一元表达式 : + 一元表达式

  1. expr 为 UnaryExpression 求值的结果。
  2. Return ToNumber(GetValue(expr))。

从标准 ECMA 262 V 6 开始,Number 需要更多步骤,因为 number 可以作为构造函数调用,并且在步骤 4 中进行检查,这需要一些时间。

  1. 如果 NewTarget 未定义,则返回 n。

【讨论】:

  • 与什么相比最快?那篇文章没有提到 Number()。
  • @BoltClock,mdn 声明它,没有提及较慢的语法。
  • 没错。那么读者应该信守诺言吗?
  • @BoltClock,正如标准所描述的,Number 需要进行一些检查,以确定是否需要构造函数的调用状态。
  • @NinaScholz 我认为不需要找到,编译器会将new 调用解析为与没有new 的调用不同的函数。我猜慢的事情实际上是标识符Number的全局变量查找。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-23
  • 2017-03-11
  • 2020-03-10
  • 2014-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多