2016-11-28 13 views
2

私はちょうど何かをしようと、この発見された:カスタムtoStringString(n)を呼び出した場合、それは自分自身を呼び出し、エラーMaximum Call Stack exceededをスローし、String(number)はnumber.toStringを内部的に呼び出しますか?

JSFiddle

Number.prototype.toString = function() { 
 
    return String(this) 
 
} 
 

 
var a = 10; 
 
try { 
 
    a.toString() 
 
} catch (err) { 
 
    console.log(err.message) 
 
}

しかし

var b = String(a)に直接電話すると、01を呼び出さない機能。

JSFiddle

Number.prototype.toString = function(){ 
 
    console.log(this); 
 
    return '' + this; 
 
} 
 

 
var a = 10; 
 
a.toString();

注:私は、スニペットの上知っも同じエラーを投げているが、私はNodechrome - JSFiddleFirefox - JSFiddleにチェックして、それが一貫しています。 var b = String(a)number.toString()を呼び出さないので、'' + thisも呼び出します。これはnumber.toString()''+thisに呼び出すStack snippetの最適化です。

私の質問は何ですか?なぜこの奇妙な行動ですか?

+0

@Downvotersで、私はあなたの視点を尊重し、しかし、あなたが考える場合は、何かがポストと間違っている、あなたのコメントを共有してください。それを投票するだけで誰も助けにならないでしょう。 – Rajesh

答えて

2

実際の数値は、文字列に変換する内部メソッドを呼び出し、明示的に呼び出されない限り、その出力はvalueOfおよびtoStringの影響を受けません。

なぜ、toStringが最初に呼び出されたのですか? 「ずさんな」(非厳密)モードでは、thisの値はString(this)または'' + thisに渡される前に、そのオブジェクト形式(new Number(10)のすなわち相当)に変換されるので

これ

です。

(このような理由から、あなたがstrictモードが使用されている通常のアプリケーションでは、これらの二つの方法の違いが表示されない場合があります。)

thisがオブジェクトであるため、String()+加算演算子の両方を変換しようとしますオブジェクトを文字列に変換します。これは通常obj.toStringまたはobj.valueOfのいずれかを呼び出して行います。

String(this)が失敗した理由については

しかし'' + thisにはない、String機能はvalueOfを呼び出す前に、オブジェクト上toStringを呼び出します。

ただし、加算(+)演算子を使用すると、valueOftoStringの順序が逆になります。

+0

"*値はオブジェクト形式に変換されます。*。私はそれが第2部分だと思います。' String(value) 'は' value.toString'を呼び出します。そのため、* toString *メソッドが呼び出し*文字列*、再帰が発生します。[* ECMA-262§21.1.1.1*](http://ecma-international.org/ecma-262/7.0/index.html#sec-string-constructor-string-value) 。 – RobG

+0

@RobG:最初の理由で 'toString'が呼び出されたのは、数値のオブジェクト形式の' String() 'であることを意味していました。私が言ったことを明確にしようとします。 –

+0

クール実際には、ECMA-262はToString(number)*のアルゴリズムでtoStringを呼び出すことを指定していません(http://ecma-international.org/ecma-262/7.0/index.html#sec – RobG

0

あなたはcall/applyを使用する必要があります。私が思う

Number.prototype.toString = function() { 
 
    console.log(this) 
 
    return String(this) 
 
} 
 

 
var a = 10; 
 
try { 
 
    a.toString.call() 
 
    console.log(a) 
 
} catch (err) { 
 
    console.log(err.message) 
 
}

理由はThe reason to use JS .call() method?

+0

ねえ、質問の目的は、なぜこれが起こっているのか理解することです。ポインタだけでも、 'this 'なしで' .call'を実行するとコンテキストが消去されます。 – Rajesh

関連する問題