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


184

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

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

デモ

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


1
すべてが同じであれば、標準toString()が進むべき道だと私には思える。
asawyer

1
@asawyer。なんで?それらがすべて同じ出力を生成し、同じことを行う場合は、1つを選択してそれを実行します。これが本当にここに当てはまる場合、これは私の意見です
gdoronは、

1
最初の2つのメソッドは同等である必要があります(標準を確認する必要がありますが、コンストラクターはtoStringを呼び出します)。3番目のものは、通常、同じ出力を生成しますが、非常に異なるメカニズムが含まれます(速度に加えて、さまざまな呼び出しが含まれるため、あらゆる種類のオブジェクトに期待するものとは限りません)。
Adriano Repetti

6
私の意見でtoStringは、オブジェクトと同等の文字列を取得しようとしているという事実を自己文書化する最も明確な方法です。String(...)少し鈍感で、ちょっとしたvalue + ""ハックです。またtoString、マイナーな副次的な利点として、必要に応じてカスタム実装でデフォルトをオーバーライドすることもできます。
asawyer

2
@Adriano。しかし+ ""、jsperfによると最速なので、他の方法でそれを実行すると思います。
gdoronは2012

回答:


213

とき、彼らは異なる動作をしますvalueですnull

  • null.toString()エラーをスロー-nullのメソッド「toString」を呼び出すことができません
  • String(null)戻り値- 「null」
  • null + ""また、「null」を返します

非常によく似た挙動がどうなるvalueであるundefined(参照jbabeyの答えを)。

それ以外には、ごくわずかなパフォーマンスの違いがあります。大きなループで使用しない限り、心配する必要はありません。


これは実際には興味深い違いです。したがってtoString()nullまだ確認していない場合は使用を控えてください。
Sammy S.

@SammyS。印刷nullまたはundefined画面への出力のほうが望ましい動作であるかどうかは不明ですが、javascriptエラー...
Justus Romijn '28

@JustusRomijn:確かにそうです。その間、私はOptionタイプを使用してそのようなエラーを処理し始めました。
Sammy S. 14

typeofを使用してこれらのキャスト変数をチェックして、文字列をチェックできます。typeof(null + '')== 'string'
Bruce Lim

4
それらが異なる動作をする別のケースがあります。v + ''vにtoString()メソッドとvalueOf()メソッドの両方がある場合、誤った結果を返します。連結はtoString()を無視し、valueOf()を使用します。連結が失敗したため、クラスの例:github.com/processing-js/processing-js/blob/...
Mikita Belahlazau

26

違いはありますが、おそらくあなたの質問には関係ありません。たとえば、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/


3
変数がまったく定義されていない場合でも、のエラーが発生しString()ます。例:String(test);throws Uncaught ReferenceError: test is not defined、while var test; String(test);はになり"undefined"ます。
Anthony

17

それらは同じように動作しますが、toString2進数、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"

9

このJSPerfテストによると、速度は異なります。しかし、それらを大量に使用するのでない限り、どれも正常に機能するはずです。

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


2
そのjsperfは同じテストを2回行い、編集しました。そして、new String()オブジェクトではなくオブジェクトを返しますString
gdoronはモニカ

new String()はいオブジェクトを返します。String()ただし、問題の文字列を返します。
Connell 2012年

2
これは完全に真実ではありません。結果からわかるように、空の文字列とオブジェクトを連結しても、オブジェクトと空の文字列を連結した場合と同じ結果にはなりませ。さらに、呼び出すことができるオブジェクトをnew String(blarg)提供します。私のChromeデバッガーでは、上記の違いを除いて、実質的に同じ種類のオブジェクトが生成されます。StringtoString()
サミーS.

@SammyS。回答にパフォーマンス結果の例を追加していただけませんか?jsperfリンクは現在ダウンしており、確かに今後5年以上で再び表示されます。
mxmlnkn 2016年

9

上記のすべてに加えて、1つは、定義された値のことを、注意してください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でテスト済み


8

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

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

注-現時点では、ブラウザによって大きな違いがあります。


4

実際の例:任意の数のパラメーターを使用して呼び出すことができるログ関数があります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. answerのJSPerfテストを参照)。Opera 12とFirefox 19では、空の文字列の連結は途方もなく高速です(Firefox 19では95%) -または少なくともJSPerfはそう言っています。

1

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.