ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

オブジェクトを文字列連結したときは、toStringかvalueOfで文字列化したものが連結される。

結論

オブジェクトを文字列連結したときは、
toStringメソッドがあれば、toStringで文字列化したものを連結、
valueOfメソッドがあれば、valueOfで文字列化したものを連結、
toString/valueOfメソッド両方があれば、valueOfで文字列化したものを連結、
という動作になるようです。


Java使いとしては、toStringだけかと思ってたので、やや新鮮でした。

実験

// toStringのみ持つオブジェクト
function ToStringOnly() {
}
ToStringOnly.prototype.toString = function() {
    return "toString ToStringOnly";
}

// valueOfのみ持つオブジェクト
function ValueOfOnly() {
}
ValueOfOnly.prototype.valueOf = function() {
    return "valueOf ValueOfOnly";
}

// toString/valueOfの両方を持つオブジェクト
function Both() {
}
Both.prototype.toString = function() {
    return "toString Both";
}
Both.prototype.valueOf = function() {
    return "valueOf Both";
}

// 文字列連結した場合の挙動
document.writeln("<dt>ToStringOnly: <dd>" + new ToStringOnly() + "<br/>");
document.writeln("<dt>ValueOfOnly: <dd>" + new ValueOfOnly() + "<br/>");
document.writeln("<dt>Both: <dd>" + new Both() + "<br/>");
document.writeln("<dt>Both#toString: <dd>" + new Both().toString() + "<br/>");

出力結果

ToStringOnly: toString ToStringOnly
ValueOfOnly: valueOf ValueOfOnly
Both: valueOf Both
Both#toString: toString Both

Bothの場合は、valueOfが使われているのが分かります。
http://jsdo.it/taka_2/asTK