[解決済み] JavascriptにおけるvalueOf()とtoString()の比較
2022-08-22 14:35:43
質問
Javascriptでは、すべてのオブジェクトにvalueOf()とtoString()メソッドがあります。 私は、文字列の変換が要求されるときはいつでもtoString()メソッドが呼び出されると考えていましたが、どうやらvalueOf()によって切り取られるようです。
たとえば、コード
var x = {toString: function() {return "foo"; },
valueOf: function() {return 42; }};
window.console.log ("x="+x);
window.console.log ("x="+x.toString());
と表示されます。
x=42
x=foo
例えば、x が複素数であった場合、私は valueOf() がその大きさを与えることを望みますが、私が文字列に変換したいときはいつでも、私は "a+bi" のようなものを望みます。そして、文字列を暗示するコンテキストで明示的に toString() を呼び出す必要はないでしょう。
これは単なる方法なのでしょうか?
どのように解決するのですか?
("x="+x) が "x=value" となり、 "x=tostring" とならないのは、以下の理由によります。javascript は "+" を評価するとき、まずオペランドのプリミティブ値を収集し、各プリミティブの型に基づいて加算または連結を適用するかどうかを決定します。
つまり、このような仕組みになっているのですね。
a + b:
pa = ToPrimitive(a)
if(pa is string)
return concat(pa, ToString(b))
else
return add(pa, ToNumber(b))
そしてこれが実際に起こることです。
a + b:
pa = ToPrimitive(a)
pb = ToPrimitive(b)*
if(pa is string || pb is string)
return concat(ToString(pa), ToString(pb))
else
return add(ToNumber(pa), ToNumber(pb))
つまり、toStringは元のオブジェクトではなく、valueOfの結果に対して適用されます。
さらなる参考のために、11.6.1節をチェックしてください。 加算演算子 ( + ) を参照してください。
*文字列コンテキストで呼び出された場合、ToPrimitiveは が行います。 はtoStringを呼び出しますが、'+'は型コンテキストを強制しないため、ここではそのようなことはありません。
関連
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] JavaScriptでメールアドレスを検証するのに最適な方法は何ですか?
-
[解決済み] JavaScriptでタイムスタンプを取得する方法は?
-
[解決済み】JavaScriptの比較では、どちらの等号演算子(== vs ===)を使うべきですか?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
-
[解決済み] JavaScript で `throw` の後に `return` をする必要がありますか?
-
[解決済み] JavaScriptのArray.sort()メソッドでシャッフルするのは正しいのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JSのDateからDay名
-
[解決済み] ExtJS 4のイベントハンドリングについて
-
[解決済み] 文字列が空白であるかどうかをチェックする
-
[解決済み] JavaScriptで:hoverのCSSプロパティを変更する
-
[解決済み] JavaScriptで文字列を数値に変換する最速の方法は何ですか?
-
[解決済み] AJAX Mailchimp サインアップフォームの統合
-
[解決済み] Chromeのwebkitインスペクタで「Unsafe JavaScript attempt to access frame with URL...」というエラーが継続的に発生する。
-
[解決済み] JavaScriptで長い配列を小さい配列に分割する方法
-
[解決済み] JavaScript で `throw` の後に `return` をする必要がありますか?
-
[解決済み] HTML要素にスクロールバーがあるかどうかをチェックする