205

我发现了三种String在 JavaScript 中将变量转换为的方法。
我在jQuery源码中搜索了这三个选项,都在使用中
我想知道它们之间是否有任何区别:

value.toString()
String(value)
value + ""

演示

它们都产生相同的输出,但其中一个比其他更好吗?
我会说它+ ""有一个优势,它可以节省一些字符,但这并不是什么大优势,还有什么?

4

8 回答 8

241

value当is时,它们的行为确实不同null

  • null.toString()引发错误 -无法调用 null 的方法“toString”
  • String(null)返回 - “空”
  • null + ""也返回 - “null”

value如果是,会发生非常相似的行为undefined(参见jbabey 的回答)。

除此之外,性能差异可以忽略不计,除非您在巨大的循环中使用它们,否则不值得担心。

于 2012-06-18T12:58:31.530 回答
31

存在差异,但它们可能与您的问题无关。例如,未定义变量上不存在 toString 原型,但您可以使用其他两种方法将 undefined 强制转换为字符串:

​var foo;

​var myString1 = String(foo); // "undefined" as a string

var myString2 = foo + ''; // "undefined" as a string

var myString3 = foo.toString(); // throws an exception

http://jsfiddle.net/f8YwA/

于 2012-06-18T13:01:05.623 回答
19

它们的行为相同,但toString也提供了一种转换数字二进制、八进制或十六进制字符串的方法:

例子:

var a = (50274).toString(16)  // "c462"
var b = (76).toString(8)      // "114"
var c = (7623).toString(36)   // "5vr"
var d = (100).toString(2)     // "1100100"
于 2012-06-18T13:06:52.220 回答
11

除了上述所有内容外,还应注意,对于定义的值v

  • String(v)来电v.toString()
  • '' + vv.valueOf()在任何其他类型转换之前调用

所以我们可以这样做:

var mixin = {
  valueOf:  function () { return false },
  toString: function () { return 'true' }
};
mixin === false;  // false
mixin == false;    // true
'' + mixin;       // "false"
String(mixin)     // "true"

在 FF 34.0 和节点 0.10 中测试

于 2015-01-13T11:33:02.157 回答
9

根据这个 JSPerf 测试,它们的速度不同。但是,除非您要大量使用它们,否则它们中的任何一个都应该表现良好。

为了完整性:正如asawyer已经提到的,您也可以使用该.toString()方法。

于 2012-06-18T12:55:27.900 回答
8

如果您可以接受 null、undefined、NaN、0 和 false 全部转换为 '',那么(s ? s+'' : '')速度会更快。

http://jsperf.com/cast-to-string/8

注意 - 此时浏览器之间存在显着差异。

于 2013-12-20T15:45:16.743 回答
5

现实世界的例子:我有一个可以使用任意数量的参数调用的日志函数:log("foo is {} and bar is {}", param1, param2). 如果DEBUG标志设置为true,括号将被给定的参数替换,字符串被传递给console.log(msg)。参数可以并且将是字符串、数字以及 JSON / AJAX 调用可能返回的任何内容,甚至可能是null.

  • arguments[i].toString()不是一个选项,因为可能的null值(见康奈尔沃特金斯回答)
  • JSLint 会抱怨arguments[i] + "". 这可能会或可能不会影响对使用什么的决定。有些人严格遵守 JSLint。
  • 在某些浏览器中,连接空字符串比使用字符串函数或字符串构造函数要快一点(请参阅 Sammys S. 中的 JSPerf 测试答案)。在 Opera 12 和 Firefox 19 中,连接空字符串的速度惊人地快(在 Firefox 19 中为 95%) ——或者至少JSPerf这么说。
于 2013-03-11T01:54:19.080 回答
1

在此页面上,您可以自己测试每种方法的性能:)

http://jsperf.com/cast-to-string/2

这里,在所有机器和浏览器上,' "" + str '是最快的,(String)str 是最慢的

于 2012-06-18T13:03:43.390 回答