在JavaScript中转换为字符串

gdo*_*ica 176 javascript string jquery

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

value.toString()
String(value)
value + ""
Run Code Online (Sandbox Code Playgroud)

DEMO

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

Con*_*ell 202

他们的行为不同,当valuenull.

  • null.toString()抛出错误 - 无法调用null的方法'toString'
  • String(null)返回 - "null"
  • null + ""也返回 - "null"

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

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

  • 还有另一种情况,他们的行为不同.如果v同时具有toString()和valueOf()方法,则`v +''`返回不正确的结果.连接将忽略toString()并将使用valueOf().连接失败的类示例:https://github.com/processing-js/processing-js/blob/67a092cca45ec16ee66217dfd5a5e67b035c05f4/src/Objects/Char.js (4认同)
  • @萨米。不知道在屏幕上打印 `null` 或 `undefined` 是否是比 javascript 错误更理想的行为...... (2认同)

jba*_*bey 26

存在差异,但它们可能与您的问题无关.例如,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
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/f8YwA/

  • 如果根本没有定义一个变量,则仍然会得到String()的错误。例如:`String(test);`抛出`Uncaught ReferenceError:test is not defined`,而`var test; String(test);`会导致`“ undefined”`。 (3认同)

Sar*_*raz 16

它们的行为相同,但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"
Run Code Online (Sandbox Code Playgroud)


Sam*_* S. 9

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

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

  • jsperf有两次相同的测试,[我编辑了](http://jsperf.com/cast-to-string/3)并且`new String()`返回一个对象而不是`String` (2认同)
  • 这不完全正确.从结果中可以看出,连接空字符串和对象不会产生与连接对象和空字符串相同的结果.此外,`new String(blarg)`给你一个`String`对象,你可以调用`toString()`.在我的Chrome调试器中,除了上述差异外,它们实际上会产生相同类型的对象. (2认同)

小智 8

除上述所有内容外,还应注意,对于定义的值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"
Run Code Online (Sandbox Code Playgroud)

在FF 34.0和节点0.10中测试


小智 7

如果你没有使用null,undefined,NaN,0和false,则所有转换为''然后(s ? s+'' : '')更快.

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

注意 - 目前各浏览器之间存在显着差异.


Jac*_*ack 6

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

  • arguments[i].toString()不是一个选项,因为可能的null值(参见 Connell Watkins 的回答)
  • JSLint 会抱怨arguments[i] + "". 这可能会也可能不会影响使用什么的决定。有些人严格遵守 JSLint。
  • 在某些浏览器中,连接空字符串比使用字符串函数或字符串构造函数要快一些(请参阅 Sammys S. 答案中的 JSPerf 测试)。在 Opera 12 和 Firefox 19 中,连接空字符串的速度快得惊人(Firefox 19 中为 95%) ——或者至少JSPerf是这么说的。