在 JavaScript 中将数字转换为字符串的最佳方法是什么?

IT技术 javascript string performance coding-style numbers
2021-01-30 15:23:49

将数字转换为字符串的“最佳”方法是什么(在速度优势、清晰度优势、内存优势等方面)?

一些例子:

  1. String(n)

  2. n.toString()

  3. ""+n

  4. n+""

6个回答

像这样:

var foo = 45;
var bar = '' + foo;

实际上,即使我通常为了简单方便而这样做,但对于原始速度而言,超过 1,000 次的迭代似乎是有优势的.toString()

在这里查看性能测试(不是我做的,而是我自己写的时候发现的):http : //jsben.ch/#/ghQYR

最快基于上面的 JSPerf 测试: str = num.toString();

应该注意的是,当您考虑到它可以在 0.1 秒内以任何方式进行100 万次转换时,速度上的差异并不过分显着

更新:速度似乎因浏览器而异。num + ''基于这个测试,在 Chrome 中似乎是最快的http://jsben.ch/#/ghQYR

更新 2:再次基于我上面的测试,应该注意到 Firefox 20.0.1 的执行.toString()速度比'' + num示例慢大约 100 倍

我喜欢这个答案,因为 anull foo不会引发错误。
2021-03-12 15:23:49
@MaryamSaeidi:使用上面的drublicjsperf.com测试似乎更一致。
2021-03-15 15:23:49
@hongymagic:这个答案实际上是唯一可以想象的:数字并不关心也不知道它是如何输入的,标准的印刷表示在点之前正好有一个数字。
2021-03-29 15:23:49
在某些情况下,转换可能不会返回更好的答案:'' + 123e-50returns "1.23e-48"
2021-04-02 15:23:49
我在jsben.ch/ghQYR 中运行了测试,每次都显示不同的结果!
2021-04-05 15:23:49

在我看来n.toString(),它因其清晰性而获奖,我认为它不会带来任何额外的开销。

@david.pfx 有什么把握?我的观点是nullor没有答案undefined,不抛出错误就是不处理它,隐藏它也会导致“代码失败”。我不欣赏你的居高临下的陈述,比如“也许是时候写更少的代码并阅读更多了”,我建议你不要以人身攻击你的论点,这次会很高兴地忽略它。
2021-03-17 15:23:49
@david.pfx'' + undefined会给你'undefined'在我看来几乎没有任何好处,如果不是更糟,因为它默默地失败了。('' + null) === 'null'
2021-03-22 15:23:49
@david.pfx 问题询问如何将数值转换为字符串。提供不适用于此答案的非数字值(例如null, undefined)的示例几乎不会使其“不安全”。
2021-03-23 15:23:49
这是不安全的。n 可能为空或未定义。
2021-03-30 15:23:49
@MichaelMartin-Smucker:如果你写了很多 JS,你就会意识到事情很少这么干。这个问题是开放的,IMO 一个好的答案至少应该承认字符串实际上为空或未定义的问题。天啊。
2021-04-10 15:23:49

对于语言的新手来说,显式转换非常清楚。正如其他人所建议的那样,如果开发人员不了解强制规则,则使用类型强制会导致歧义。最终,开发人员时间比 CPU 时间更昂贵,所以我会以后者为代价来优化前者。话虽如此,在这种情况下,差异可能可以忽略不计,但如果不是,我确信有一些不错的 JavaScript 压缩器可以优化这类事情。

因此,出于上述原因,我会选择:n.toString()String(n)String(n)可能是更好的选择,因为如果n为 null 或未定义它不会失败

String(n)适合在函数式风格中使用,例如使用下划线的 combine _.compose(funcThatNeedsAStringParam, String)
2021-03-14 15:23:49
@MattWallis 我认为这应该是开发人员的决定,而不是回答者的决定,你不觉得吗?
2021-03-20 15:23:49
问题是关于转换数字,而不是关于转换数字,或null,或undefined如果nnullundefined由于我的程序中的错误,那么我希望我的程序在这种状态下失败,以便我有更好的机会找到并修复错误。程序崩溃是给程序员的礼物,可以帮助她找到错误:-)。另一种方法是交付不能按设计工作的软件,并仔细掩盖了错误。所以,我不喜欢String(n)用来掩盖错误。
2021-03-26 15:23:49
String(null) 不会使程序崩溃,但它会返回文字字符串“null”,这可能不是您想要的。如果数据可以合法地为空,那么您需要明确处理它。
2021-04-05 15:23:49

...JavaScript 的解析器尝试将数字上的点符号解析为浮点文字。

2..toString(); // the second point is correctly recognized
2 .toString(); // note the space left to the dot
(2).toString(); // 2 is evaluated first

来源

其他答案已经涵盖了其他选项,但我更喜欢这个:

s = `${n}`

简短,简洁,已经在许多其他地方使用(如果您使用的是现代框架/ES 版本),因此可以肯定任何程序员都会理解它。

并不是说它(通常)很重要,但其他方法相比,它似乎也是最快的方法之一

如果 n 不是数字也是安全的。
2021-03-16 15:23:49
这不是String(n)在所有情况下都给出相同的结果吗?唯一的区别是它不太清楚。
2021-03-23 15:23:49
如果nundefined,则`${n}`返回字符串'undefined'`${n || ''}`如果nundefined则返回空字符串更好null注意:它也返回一个''if n = 0更复杂(也更慢)但返回'0'而不是空字符串:`${!isNaN(n) ? n : n || '' }`
2021-03-25 15:23:49
而且慢得多。
2021-03-31 15:23:49
@amn 如果n是,undefined它会通过使用抛出语法错误.toString()
2021-04-08 15:23:49