less

きづかないくらいイージーなクオリティー

Archive

8月
12th
permalink

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#valueOfString#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で文字列の判定が出来るようになりました。