8月
12th
水
12th
valueOfが役に立つ場面
滅多に使わないのでvalueOfをよく知らなかったー。
valueOfはそのオブジェクトをプリミティブな値に変換出来る場合は変換、出来ない場合はそのままオブジェクトを返してくれます。変換出来るのはNumber、String、Boolean辺り。
var num = 123;
alert(typeof num); // number
var num = new Number(123);
alert(typeof num); // object
alert(typeof num.valueOf()); // number
Stringの場合が便利で、String#valueOfはString#toStringと同じ働きをするのでそのまま変換が出来ます:)
var str = new String('hello!');
alert(typeof str); // object
alert(typeof str.valueOf()); // string
これらは普段は内部的に使われるので意識する必要がないのですが、変なことしようとするとその限りではない。。例えばthis。MDCのthis Operatorの項目には
thisは関数に「渡される」のであって、関数に固定されている訳ではありません。言い換えると、メソッドはそれをメソッドとして持つオブジェクトに束縛されているのではなく、オブジェクトによって参照されているだけです。
というわけでthisは常にオブジェクトです。文字列リテラルで渡してもオブジェクトになります。
var foo = function() {
alert(typeof this);
};
foo.call('foo'); // object
このような時にはvalueOfを明示的に指定してあげると役に立ちますね。
var foo = function() {
alert(typeof this.valueOf());
};
foo.call('foo'); // string
typeofで文字列の判定が出来るようになりました。