JavaScript オブジェクトからプリミティブ値への変換の詳細な説明

JavaScript オブジェクトからプリミティブ値への変換の詳細な説明

オブジェクトプロトタイプの値()

オブジェクトの valueOf は、オブジェクトのプリミティブ値を返すように設計されており、必要な場合はいつでもオブジェクトをそのプリミティブ値に自動的に変換します。詳細はここをクリックしてください。

オブジェクトプロトタイプtoString()

toString() メソッドはオブジェクトの文字列表現を返し、オブジェクトが文字列に変換されることが予想される場合に自動的に実行されます。オブジェクトのデフォルトの toString() メソッドは [オブジェクト タイプ] を返します。ここで、type はオブジェクトのコンストラクターの名前です。詳細はここをクリックしてください。

シンボル.toPrimitive

Symbol.toPrimitive(hint)メソッドは valueOf() と同じ機能を持ちますが、valueOf() よりも優先順位が高く、また、このメソッドは、変換する元の値の特定の型を示すために使用されるパラメーター hint も受け入れます。パラメーター hint は次のとおりです。

  • 数値: 数値型
  • 文字列: 文字列型
  • デフォルト: デフォルト
obj = {
  [Symbol.toPrimitive](ヒント) {
    スイッチ(ヒント){
      ケース '番号':
        123を返します。
      ケース '文字列':
        'str' を返します。
      'デフォルト'の場合:
        'デフォルト' を返します。
      デフォルト:
        新しい Error() をスローします。
     }
   }
};
2 * オブジェクト // 246
3 + オブジェクト // '3default'
obj == 'default' // true
文字列(obj) // 'str'

オブジェクト変換プリミティブ値

上記の 3 つのメソッドは、オブジェクトが何らかのプリミティブ値に変換されることが予想される場合にトリガーされます。

1. 文字列型に変換される予定

対応するヒントタイプは文字列です

出力が実行される場所(alert()など)

文字列(obj)

a = {とする
  文字列を変換する
    '2' を返す
  }
}
コンソール.log(文字列(a)) // 2

文字列連結(+)演算

a = {とする
  文字列を変換する
    '2' を返す
  }
}
コンソールログ(a + 'vv')

テンプレート文字列

a = {とする
  [Symbol.toPrimitive] (ヒント) {
    console.log(ヒント) // 文字列
    戻る 2
  }
}
console.log(`Are you old ${a}?`) // あなたは古いですか 2?

2. 数値型に変換される予定

対応するヒントタイプは数値です

分割:

a = {とする
  値(){
    戻る 2
  }
}
コンソール.log(2 / a, a / 2) // 1 1

番号(オブジェクト):

a = {とする
  [Symbol.toPrimitive] (ヒント) {
    console.log(ヒント) // 数値
    戻る 2
  }
}
console.log(数値(a)) // 2

正負の符号(加算や減算の演算ではないことに注意してください):

a = {とする
  [Symbol.toPrimitive] (ヒント) {
    console.log(ヒント) // 数値
    戻る 2
  }
}
コンソール.log(+a) // 2
コンソール.log(-a) // -2

3. デフォルトタイプ(その他)に変換される予定

対応するヒントタイプはデフォルトです

数値の加算(つまり、加算されるオブジェクトが数値型の場合):

a = {とする
  [Symbol.toPrimitive] (ヒント) {
    console.log(ヒント) // デフォルト
    戻る 2
  }
}
コンソール.log(1 + a) // 3

これは少し予想外です。この場合、期待される変換型は数値型であるはずだと思っていましたが、実際はデフォルトです。

ブール演算: すべてのオブジェクトが true に変換されます。

a = {とする
  [Symbol.toPrimitive] (ヒント) {
    console.log(hint) // トリガーなし false を返す
  }
}
console.log(Boolean(a), a && 123) // 真 123

ブール演算には == が含まれます。

3つのメソッドが実行される順序

まず、オブジェクトに Symbol.toPrimitive(hint) メソッドがあるかどうかを確認します。ある場合は、そのメソッドを実行します。ない場合は、次の手順を実行します。

文字列型に変換されることが予想される場合は、まず toString() メソッドが実行されます。

デフォルト型または数値型に変換されることが予想される場合は、最初に valueOf() メソッドが実行されます。

: valueOf() メソッドが存在しないが、toString() メソッドが定義されている場合は、toString() メソッドが実行されます。

要約する

この記事はこれで終わりです。皆さんのお役に立てれば幸いです。また、123WORDPRESS.COM のその他のコンテンツにも注目していただければ幸いです。

以下もご興味があるかもしれません:
  • js でオブジェクトを作成する 4 つの一般的な方法とその長所と短所
  • JavaScript 組み込みオブジェクトの概要
  • JavaScript オブジェクトの不変性入門

<<:  CSS3はシームレスなスクロールと手ぶれ防止を実現します

>>:  Mysql binlog ログファイルが大きすぎる場合の解決策

推薦する

Reactは一般的なスケルトン画面コンポーネントの例を実装します

目次スケルトンスクリーンとは何ですか?デモデザインのアイデア具体的な実装スケルトンスクリーンとは何で...

大規模なデータテーブルのコピー効率を向上させるMySQLソリューション

序文この記事では主に、MySQL で大規模なデータ テーブルのコピーの効率を向上させることに関する関...

時間範囲効果を実現するためのJavaScript

この記事では、時間範囲効果を実現するためのJavaScriptの具体的なコードを参考までに紹介します...

Vue+Element UI でサマリーポップアップウィンドウを実装するプロセス全体

シナリオ: 検査文書には n 個の検査詳細があり、検査詳細には n 個の検査項目があります。実装効果...

画像をハイパーリンクとして使用したときに表示される青いボックスを削除する方法

最近、Dreamweaver を使用して製品プレゼンテーションを作成し、画像にハイパーリンクを追加し...

MySQL で珍しい文字を挿入できないときの対処方法 (文字列値が正しくない)

最近、ビジネス側から、一部のユーザー情報の挿入に失敗し、エラー メッセージが「不正な文字列値:&qu...

データベースミドルウェアMyCatの紹介

1. Mycatの適用シナリオMycat は幅広いシナリオに合わせて開発されており、新しいユーザーが...

getdata テーブル テーブル データ 結合 mysql メソッド

パブリック関数 json_product_list($where, $order){ グローバル ...

Vue はネストされたルーティングメソッドの例を実装します

1. ネストされたルーティングはサブルーティングとも呼ばれます。実際のアプリケーションでは、通常、ネ...

deepin20 で NVIDIA クローズドソース ドライバーをインストールするための詳細な手順

ステップ1: ディープ「グラフィックドライバー」をインストールするdeepin v20にはデフォルト...

MySQL の 6 つの一般的な制約タイプの詳細な説明

目次序文1.nullでない2. ユニーク3. デフォルト4.主キー自動増分主キー5. 外部キー6.チ...

Docker ネットワークの原理とカスタム ネットワークの詳細な分析

Docker はホストマシン上のブリッジを仮想化します。コンテナを作成して起動すると、各コンテナには...

Linux で pyenv をインストールする方法

前提条件gitをインストールする必要があるインストール手順1. リモートリポジトリからpyenvをク...

Windows サーバー ポートを開きます (例としてポート 8080 を使用します)

ポートとは何ですか?私たちが通常参照するポートは、物理的な意味でのポートではなく、具体的には TCP...

MySql8.023 インストール プロセスの詳細なグラフィック説明 (初回インストール)

まず、MySQL公式サイトからインストールパッケージをダウンロードします。MySQLはオープンソース...