gdo*_*ica 176 javascript string jquery
我发现了三种String在JavaScript中转换变量的方法.
我在jQuery源代码中搜索了这三个选项,它们都在使用中.
我想知道它们之间是否有任何差异:
value.toString()
String(value)
value + ""
Run Code Online (Sandbox Code Playgroud)
它们都产生相同的输出,但其中一个比其他产品好吗?
我会说它+ ""有一个优势,它可以节省一些角色,但这不是那么大的优势,还有其他什么?
Con*_*ell 202
他们的行为不同,当value为null.
null.toString()抛出错误 - 无法调用null的方法'toString'String(null)返回 - "null"null + ""也返回 - "null"如果value是,则会发生非常相似的行为undefined(参见jbabey的回答).
除此之外,性能差异可以忽略不计,除非你在巨大的循环中使用它们,否则不值得担心.
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)
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)
根据这个JSPerf测试,它们的速度不同.但除非你要大量使用它们,否则它们中的任何一个都应该表现良好.
为了完整性:作为已经提到的asawyer,您也可以使用该.toString()方法.
小智 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
注意 - 目前各浏览器之间存在显着差异.
现实世界的例子:我有一个日志函数,可以使用任意数量的参数调用:log("foo is {} and bar is {}", param1, param2)。如果DEBUG标志设置为true,则括号将被给定参数替换,并且字符串将传递到console.log(msg)。参数可以并且将会是字符串、数字以及 JSON / AJAX 调用可能返回的任何内容,甚至可能是null.
arguments[i].toString()不是一个选项,因为可能的null值(参见 Connell Watkins 的回答)arguments[i] + "". 这可能会也可能不会影响使用什么的决定。有些人严格遵守 JSLint。