我发现了三种String
在 JavaScript 中将变量转换为的方法。
我在jQuery源码中搜索了这三个选项,都在使用中。
我想知道它们之间是否有任何区别:
value.toString()
String(value)
value + ""
它们都产生相同的输出,但其中一个比其他更好吗?
我会说它+ ""
有一个优势,它可以节省一些字符,但这并不是什么大优势,还有什么?
我发现了三种String
在 JavaScript 中将变量转换为的方法。
我在jQuery源码中搜索了这三个选项,都在使用中。
我想知道它们之间是否有任何区别:
value.toString()
String(value)
value + ""
它们都产生相同的输出,但其中一个比其他更好吗?
我会说它+ ""
有一个优势,它可以节省一些字符,但这并不是什么大优势,还有什么?
value
当is时,它们的行为确实不同null
。
null.toString()
引发错误 -无法调用 null 的方法“toString”String(null)
返回 - “空”null + ""
也返回 - “null”value
如果是,会发生非常相似的行为undefined
(参见jbabey 的回答)。
除此之外,性能差异可以忽略不计,除非您在巨大的循环中使用它们,否则不值得担心。
存在差异,但它们可能与您的问题无关。例如,未定义变量上不存在 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
它们的行为相同,但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"
除了上述所有内容外,还应注意,对于定义的值v
:
String(v)
来电v.toString()
'' + v
v.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 中测试
根据这个 JSPerf 测试,它们的速度不同。但是,除非您要大量使用它们,否则它们中的任何一个都应该表现良好。
为了完整性:正如asawyer已经提到的,您也可以使用该.toString()
方法。
如果您可以接受 null、undefined、NaN、0 和 false 全部转换为 '',那么(s ? s+'' : '')
速度会更快。
见http://jsperf.com/cast-to-string/8
注意 - 此时浏览器之间存在显着差异。
现实世界的例子:我有一个可以使用任意数量的参数调用的日志函数:log("foo is {} and bar is {}", param1, param2)
. 如果DEBUG
标志设置为true
,括号将被给定的参数替换,字符串被传递给console.log(msg)
。参数可以并且将是字符串、数字以及 JSON / AJAX 调用可能返回的任何内容,甚至可能是null
.
arguments[i].toString()
不是一个选项,因为可能的null
值(见康奈尔沃特金斯回答)arguments[i] + ""
. 这可能会或可能不会影响对使用什么的决定。有些人严格遵守 JSLint。在此页面上,您可以自己测试每种方法的性能:)
http://jsperf.com/cast-to-string/2
这里,在所有机器和浏览器上,' "" + str '是最快的,(String)str 是最慢的