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 ログファイルが大きすぎる場合の解決策

推薦する

MySql 5.7.20 のインストールとデータおよび my.ini ファイルの構成

1. まずMySqlの公式サイトからダウンロードします参考: https://www.jb51.ne...

Mysqlツリー再帰クエリの実装方法

序文部門テーブルなどのデータベース内のツリー構造データの場合、部門のすべての従属部門または部門のすべ...

Vue プロジェクトで SVG コンポーネントをパッケージ化して構成する手順

最近新しい会社に入社しました。プロジェクトに携わった後、タイトルアイコンが svg で作られていると...

docker 環境でのデータベース バックアップ (postgresql、mysql) のサンプル コード

目次posgresql バックアップ/リストアMySQL バックアップ/復元posgresql バッ...

インライン要素とブロック要素とは何ですか?

1. インライン要素はコンテンツの幅のみを占めますが、ブロック要素はコンテンツの量に関係なく行全体を...

「いいね!」機能では MySQL と Redis のどちらを使用すればよいでしょうか?

目次1. 初心者が陥りがちな間違い2. Iteratorのremove()メソッドを使用する3. f...

Alibaba Cloud ECS サーバーでポート 8080 を開く方法

セキュリティ上の理由から、Alibaba Cloud Server ECS にはデフォルトで独自のセ...

vsftpd ユーザーが ssh 経由でログインすることを禁止する方法

序文vsftp は使いやすく安全な FTP サーバー ソフトウェアです。システムユーザーまたは仮想ユ...

Win10でのJDKのインストールと環境変数の設定に関する詳細なチュートリアル

目次序文1. 準備2. インストール3. 環境変数を設定する1. 「新規」をクリックすると、ポップア...

MySQL 作成ルーチン権限に関する注意事項

1. ユーザーにルーチン作成権限がある場合は、プロシージャ | 関数を作成できます。 2. ユーザー...

docker-machineの使い方の詳しい説明

Docker-machineはDockerが公式に提供しているDocker管理ツールです。これは d...

JSコンストラクタとインスタンス化およびプロトタイプ導入の関係

目次1. コンストラクタとインスタンス化2. コンストラクターとインスタンス化の関係は何ですか? 3...

ページリファクタリングスキル - コンテンツ

雑談はここまでにして、インターネット上で見つかる高性能な Yahoo ウェブサイトを構築するための数...

2048 ゲームを実装するためのネイティブ js

2048ミニゲーム、参考までに具体的な内容は以下のとおりですまず、2048ゲームは16のグリッドか...

SQLでEXPLAINコマンドを使用する方法

日常業務では、実行に時間のかかる SQL ステートメントを記録するために、スロー クエリを実行するこ...