なぜ文字列リテラルのメソッドを呼び出すと遅いのか?

Javascript 型判定の方法とその処理速度について:humming birdでの投稿の時点ではまだ分からなかったこと。

端的に言えば『[].constructor』より『"foo".constructor』の方が処理に時間が掛る。
文字列リテラルだけではなく、真偽値リテラル、数値リテラルも同様に他(例えば Array)と比べて処理に時間が掛る。

その理由が以下。


引用:
文字列リテラルの値でなら、String オブジェクトのどんなメソッドでも呼び出すことができます。JavaScript が自動的に文字列リテラルを一時的な String オブジェクトに変換し、メソッドを呼び出し、その一時的な String オブジェクトを破棄するのです。...
Literals - MDC

これは文字列リテラルの説明ですが、真偽値リテラルと数値リテラルも同様の理由と考えるのが妥当と思われる。

「instanceof」を使うと違いが分かる。
Example:
"foo" instanceof String // false

表にすると以下のようになる。

Value instanceof ObjectType
Value
Result
String
"foo"
false
new String("foo")
true
Number
0
false
new Number(0)
true
Boolean
true
false
new Boolean(true)
true
Array
[]
true
new Array([])
true
RegExp
/(?:)/
true
new RegExp()
true
Object
{}
true
new Object()
true

つまり、「文字列リテラル"foo"はインスタンスはStringのインスタンスではない。しかし、コンストラクタはStringですよ」という、ちょっと首を傾げる結果を返すということだ。


理由が分かってスッキリした。\(^o^)/

でも、頻繁にメソッドを使用するならString オブジェクトを利用した方がイイってことにならないか?

Firefoxで処理に掛る時間を計測するとその差は約3倍
construtorメソッドしか調べてないが、いちいち new String() とかするなんてハッキリ言って...

そんなのメンドクサイ(-_-;)

0 Comments:

Sony Style(ソニースタイル)
デル株式会社

Recent Posts