はじめに
基本的に、null を除くすべての JS データ型にはこれら 2 つのメソッドがあります。どちらも JavaScript 値の計算と表示の問題を解決し、書き換えることで呼び出しの最適化が向上します。
テスト分析
まず例を見てみましょう:
var aaa = {
i: 10,
valueOf: function() { return this.i 30; },
toString: function() { return this.valueOf() }
}
alert(aaa > 20); // true
alert(aaa) // 40
alert(aaa) // 50
それは、valueOf メソッドまたは toString メソッドを密かに呼び出すためです。
しかし、どのような状況でどのメソッドが呼び出されるのかを、別のメソッドでテストできるのでしょうか?
console.logを使用するので、firebugをインストールしたFFで実験してみてください!
var bbb = {
i: 10,
toString: function() {
console.log('toString');
return this.i;
},
valueOf: function() {
コンソール。 log(' valueOf');
return this.i;
}
}
alert(bbb); // 10 toString
alert(bbb); // 10 valueOf
alert(bbb); / 10 toString
alert(Number(bbb)) // 10 valueOf
alert(bbb == '10') // true valueOf
alert(bbb === '10'); / false
この結果は、文字列に変換するときに toString メソッドが呼び出され、数値に変換するときに valueOf メソッドが呼び出されるような印象を与えますが、そのうち 2 つは非常に矛盾しています。 1 つは、alert('' bbb) です。文字列の連結では toString メソッドを呼び出す必要があります。もう 1 つは、=== 演算子が暗黙的な変換を実行しないため、呼び出されないということです。真実を知るには、より厳密な実験が必要です。
var aa = {
i: 10,
toString: function() {
console.log('toString');
return this.i;
}
}
alert(aa);// 10 toString
alert( aa); // 10 toString
alert('' aa); // 10 toString
alert(String(aa)); )); // 10 toString
alert(aa == '10'); // true toString
もう一度 valueOf を見てください。
var bb = {
i: 10、
valueOf: function() {
console.log('valueOf')
return this.i; }
}
alert(bb);// [オブジェクト オブジェクト]
alert( bb); // 10 valueOf alert('' bb); // 10 valueOf
alert(String(bb)) ; // [object Object]
alert(Number(bb)); // 10 valueOf
alert(bb == '10'); // true valueOf
何かが見つかりました違う? !上記の toString ほど統一されておらず、規則的でもありません。
その[オブジェクト Object] については、Object から継承されていると思います。それを削除して見てみましょう。
コードをコピーします
コードは次のとおりです。Object.prototype.toString = null; 🎜>var cc = {
i: 10,
valueOf: function() {
console.log('valueOf');
return this.i;
alert(cc); // 10 valueOf
alert('' cc); // 10 valueOf
alert(cc); ); // 10 valueOf
alert(Number(cc)); // 10 valueOf alert(cc == '10'); // true valueOf
概要: valueOfこれは操作に偏っており、toString は表示に偏っています。
1. オブジェクト (alert(a) など) を変換する場合、toString メソッドが最初に呼び出されます。どちらのメソッドもオーバーライドされていない場合は、toString の出力が呼び出されます。オブジェクトは です。
2.文字列型に強制変換する場合はtoStringメソッドが、数値型に強制変換する場合はvalueOfメソッドが最初に呼び出されます。
3. 演算演算子がある場合、valueOf は toString よりも優先されます。