web-dev-qa-db-ja.com

JavaScriptで文字列にキャストする

JavaScriptで変数をStringにキャストする方法は3つあります。
jQueryのソースコードでこれら3つのオプションを検索しましたが、すべて使用されています
違いがあるかどうかを知りたいです。

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

デモ

それらはすべて同じ出力を生成しますが、それらの1つは他のものよりも優れていますか?
+ ""には文字を節約できるという利点があると思いますが、それほど大きな利点ではありません。

167
gdoron

valuenullの場合は、動作が異なります。

  • null.toString()はエラーをスローします - nullのメソッド 'toString'を呼び出すことはできません
  • String(null)は - "null"を返します
  • null + ""は - "null"も返します。

valueundefinedの場合も、非常によく似た動作が起こります( jbabeyの答え を参照)。

それ以外に、ごくわずかなパフォーマンスの違いがあります、あなたがそれらを巨大なループの中で使っていない限り、心配する価値はありません。

191
Connell

違いはありますが、おそらくあなたの質問には関係ありません。たとえば、toStringプロトタイプは未定義の変数には存在しませんが、他の2つの方法を使用して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/

26
jbabey

これらは同じように動作しますが、toStringは数値の2進数、8進数、または16進数の文字列を変換する方法も提供します。

例:

var a = (50274).toString(16)  // "c462"
var b = (76).toString(8)      // "114"
var c = (7623).toString(36)   // "5vr"
var d = (100).toString(2)     // "1100100"
15
Sarfraz

このJSPerf test によると、速度は異なります。しかし、あなたがそれらを大量に使うつもりでない限り、それらのどれもがうまく機能するはずです。

完全を期すために: asawyer で既に述べたように、.toString()メソッドを使うこともできます。

9
Sammy S.

null、未定義、NaN、0、およびfalseですべてが ''にキャストされても問題ない場合は、(s ? s+'' : '')の方が高速です。

http://jsperf.com/cast-to-string/8 を参照してください。

注 - 現時点ではブラウザ間で大きな違いがあります。

7
jldec

上記すべてに加えて、定義済みの値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でテスト済み

5
Simone C.

実世界の例:私は、任意の数のパラメータで呼び出すことができる対数関数を持っています:log("foo is {} and bar is {}", param1, param2)DEBUGフラグがtrueに設定されている場合、大括弧は指定されたパラメーターに置き換えられ、ストリングはconsole.log(msg)に渡されます。パラメータは、文字列、数値、そしてJSON/AJAX呼び出しによって返される可能性があるものなら何でも、おそらくnullでもかまいません。

  • 可能なnull値のため、arguments[i].toString()はオプションではありません(Connell Watkinsの回答を参照)
  • JSLintはarguments[i] + ""について文句を言います。これは何を使うべきかの決定に影響を与えるかもしれないし、しないかもしれません。 JSLintを厳守する人もいます。
  • 一部のブラウザでは、空の文字列を連結する方が文字列関数や文字列コンストラクタを使用するよりも少し高速です(Sammys S. answerのJSPerfテストを参照)。 Opera 12とFirefox 19では、空の文字列を連結する方が早いです(Firefox 19では95%) - または少なくとも JSPerf はそう言います。
3
Jack

このページでは各メソッドのパフォーマンスを自分でテストできます:)

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

ここでは、すべてのマシンとブラウザで、 ' "" + str'が最も速く、(String)strが最も遅いです。

1
itinance