JavaScript 型検出方法の例のチュートリアル

JavaScript 型検出方法の例のチュートリアル

序文

JavaScriptはWebフロントエンドで広く使われている言語の一つであり、Webアプリケーション制作、スクリプト制作、小規模プログラムなど多くの分野でかけがえのない位置を占めています。著者はしばらくフロントエンドを勉強してきましたが、JS の知識ポイントは非常に複雑だと感じているため、学んだ知識、考え、洞察の一部を記録しました。

JS 基本型

JavaScript の基本型は、プリミティブ基本型と参照データ型に分けられます。

プリミティブ基本型:

  • 番号
  • ブール値
  • ヌル
  • 未定義
  • シンボル

参照データ型:

  • 物体
  • 関数
  • 配列
  • 日付
  • 正規表現

注: ES5にはシンボル型はありません

タイプ検出

型検出には、次の 5 つの一般的な方法があります。

  1. インスタンス
  2. オブジェクト.プロトタイプ.toString
  3. コンストラクタ
  4. アヒル型

1.typeofは基本型を決定する

キーワード typeof によって返される型名には、数値、文字列、ブール値、未定義、シンボル、オブジェクト、関数の 7 つの型のみが含まれます。

null およびほとんどの参照型は typeof を使用して判断できません。

数値を32とします
str = "32" とします
ブール値を true にする
null = nullとする
undef = 未定義とする
sym = シンボル() とします。

const obj = 新しいオブジェクト()
const arr = 新しい配列()
const fun = 新しい関数()
定数date = 新しいDate()
const reg = 新しい RegExp()

console.log(typeof num) //数値
console.log(typeof str) //文字列
console.log(typeof bool) //ブール値
console.log(typeof nul) //オブジェクト
console.log(typeof undef) //未定義
console.log(typeof sym) //シンボル

console.log(typeof obj) //オブジェクト
console.log(typeof arr) //オブジェクト
console.log(typeof fun) //関数
console.log(typeof date) //オブジェクト
console.log(typeof reg) //オブジェクト

注意: typeofを使用してnull、配列、日付、正規表現などを判断する場合、結果はすべてオブジェクトになります。

2.instanceofは参照データ型を決定します

Instanceof は変数の __proto__ プロパティを使用して、型判定のためのプロトタイプの prototype プロパティを指します。基本データ型に直接代入方式を使用する場合は、__proto__ プロパティが存在しないため、コンストラクタを使用する必要があることに注意してください。

const obj = 新しいオブジェクト()
const arr = 新しい配列()
const fun = 新しい関数()
定数date = 新しいDate()
const reg = 新しい RegExp()

console.log(obj インスタンスオブオブジェクト) //true
console.log(arr 配列インスタンス) //true
console.log(fun instanceof Function) //true
console.log(date インスタンス Date) //true
console.log(reg インスタンスの RegExp) //true

num1 = 32とする
num2 = 新しい数値(32)
console.log(num1 インスタンス of Number) //false
console.log(num2 インスタンス of Number) //true

さらに、instanceof は arr が Array のインスタンスであることを判別できますが、Object のインスタンスであるとも認識するため、不明な参照型を判別するのに適していません。

const arr = 新しい配列()
console.log(arr 配列インスタンス) //true
console.log(arr インスタンスオブオブジェクト) //true

その理由は、arr.__proto__ の __proto__ プロパティが Object のプロトタイプ オブジェクトを指しているためです。

この場合はコンストラクターを使用して判断を行うことができます。

注意: instanceof は、異なるウィンドウまたは iframe 間のオブジェクト検出には使用できません。

3. Object.prototype.toStringは型を決定する

toString() は Object のプロトタイプ メソッドです。Object を継承するすべてのオブジェクトには toString メソッドがあります。

typeof がオブジェクトの値を返すすべてのオブジェクトには、内部プロパティ [[class]] が含まれています。このプロパティには直接アクセスすることはできず、通常は Object.prototype.toString() を介して表示されます。

toString メソッドがオーバーライドされていない場合、デフォルトでは現在のオブジェクトの [[Class]] が [object Xxx] の形式で返されます。ここで、Xxx はオブジェクトの型です。ただし、Object 型のオブジェクトを除き、他の型では toString メソッドを直接使用すると、内容を含む文字列が直接返されるため、call メソッドまたは apply メソッドを使用して toString メソッドの実行コンテキストを変更する必要があります。

数値を32とします
str = "32" とします
ブール値を true にする
null = nullとする
undef = 未定義とする
sym = シンボル() とします。

const obj = 新しいオブジェクト()
const arr = 新しい配列()
const fun = 新しい関数()
定数date = 新しいDate()
const reg = 新しい RpgExp()

console.log(Object.prototype.toString.apply(num)) //"[オブジェクト番号]"
console.log(Object.prototype.toString.apply(str)) //"[オブジェクト String]"
console.log(Object.prototype.toString.apply(bool)) //"[オブジェクト ブール値]"
console.log(Object.prototype.toString.apply(nul)) //"[オブジェクト Null"
console.log(Object.prototype.toString.apply(undef)) //"[オブジェクトが未定義です]"
console.log(Object.prototype.toString.apply(sym) //"[オブジェクト シンボル]"

console.log(Object.prototype.toString.call(obj)) //"[オブジェクト オブジェクト]"
console.log(Object.prototype.toString.call(arr)) //"[オブジェクト配列]"
console.log(Object.prototype.toString.call(fun)) //"[オブジェクト関数]"
console.log(Object.prototype.toString.call(date)) //"[オブジェクト Date]"
console.log(Object.prototype.toString.call(reg) //"[オブジェクト RegExp]"

Object.prototype.toString は null を判定できますが、通常は null===null を使用して null かどうかを判定します。

4. コンストラクタが型を決定する

コンストラクタープロパティは、変数のコンストラクターを返します。もちろん、文字列インターセプションを使用して、判断のためのコンストラクター名を取得し、" ".constructor === String のようにブール値を取得することもできます。

数値を32とします
str = "32" とします
ブール値を true にする
null = nullとする
undef = 未定義とする
sym = シンボル() とします。

定数オブジェクト = 新しいオブジェクト()
const arr = 新しい配列()
const fun = 新しい関数()
定数date = 新しいDate()
const reg = 新しい RegExp()

console.log(num.constructor) //ƒ Number() { [ネイティブコード] }
console.log(str.constructor) //ƒ String() { [ネイティブコード] }
console.log(bool.constructor) //ƒ Boolean() { [ネイティブコード] }
console.log(nul.constructor) // キャッチされない TypeError: null のプロパティ 'constructor' を読み取ることができません
console.log(undef.constructor) // キャッチされない TypeError: 未定義のプロパティ 'constructor' を読み取ることができません
console.log(sym.constructor) //ƒ Symbol() { [ネイティブコード] }

console.log(obj.constructor === Object) //true
console.log(arr.constructor === 配列) //true
console.log(fun.constructor === Function) //true
console.log(date.constructor === 日付) //true
console.log(reg.constructor === RegExp) //true

コンストラクターは null および undefined を判断するために使用できませんが、instanceof を使用すると回避できます。arr のプロトタイプ オブジェクトは、Array または Object のいずれかになります。

5. アヒルのタイプは特徴を利用してタイプを決定します

プログラミングにおいて、ダックタイピングは動的型付けのスタイルです。このスタイルでは、オブジェクトの有効なセマンティクスは、特定のクラスからの継承や特定のインターフェースの実装によってではなく、「現在のメソッドとプロパティのセット」によって決定されます。

「アヒルのように歩き、アヒルのように泳ぎ、アヒルのように鳴く鳥を見たら、その鳥はアヒルと呼ぶことができます。」

ダックタイピングでは、オブジェクトの型ではなく、オブジェクトの動作、つまりオブジェクトが何ができるかに重点が置かれます。

たとえば、ダックタイピングを使用しない言語では、「duck」型のオブジェクトを受け取り、その「walk」メソッドと「quack」メソッドを呼び出す関数を記述できます。

その後、ダックタイピングを使用する関数では、任意のタイプのオブジェクトを受け入れ、その「walk」メソッドと「quack」メソッドを呼び出すことができます。呼び出す必要のあるメソッドが存在しない場合は、ランタイム エラーが発生します。正しい「go」および「call」メソッドを持つすべてのオブジェクトがこの関数によって受け入れられます。

たとえば、オブジェクトが配列であるかどうかを判断するには、オブジェクトに push() などのメソッドがあるかどうかを確認します。

要約する

JavaScript 型検出に関するこの記事はこれで終わりです。JavaScript 型検出に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • JS配列インデックス検出におけるデータ型の問題の詳細な説明
  • JavaScript のデータ型とデータ型の検出方法の詳細な説明
  • JavaScript におけるデータ型検出方法の詳細な説明
  • jsデータ型検出の概要
  • js学習まとめ_データ型検出に基づく4つの方法(必読)
  • 配列型を検出するためのJSメソッドの概要
  • JavaScript でデータ型を検出するいくつかの方法の概要
  • JavaScript の基本データ型と一般的な型検出方法の概要
  • JS でデータ型を検出するいくつかの方法とその長所と短所のまとめ
  • さまざまな数値型の JS 正規表現マッチング検出 (デジタル検証)
  • さまざまな種類のJavaScriptを検出する方法
  • JavaScript の型検出: typeof と instanceof の欠陥と最適化
  • JavaScript 学習ノート: クライアントの種類 (エンジン、ブラウザ、プラットフォーム、オペレーティング システム、モバイル デバイス) の検出
  • Javascriptはクライアントタイプのコードパッケージの検出を実装します
  • ファイルの種類を検出するJavaScriptメソッド

<<:  nginx のロケーションで URI の傍受を実装する方法

>>:  MySQL 5.7.20 Green Edition のインストールの詳細なグラフィックチュートリアル

推薦する

コマンドを使用してMySQLデータベース(de1)を作成する方法

1. MYSQLに接続するフォーマット: mysql -h ホストアドレス -u ユーザー名 -p ...

nginx で http でアクセスする Web サイトを https に変更する方法

目次1. 背景2. 前提条件https:証明書システム: 3. 操作プロセス3.1 証明書の生成3....

jQuery はパーセンテージスコアリングの進捗バーを実装します

この記事では、パーセンテージスコアリングプログレスバーを実現するためのjQueryの具体的なコードを...

Linux スレッド間の同期と排他制御の知識ポイントのまとめ

スレッドが同時に実行される場合、スレッドがリソースを競合してデータの曖昧さが生じるのを防ぐために、重...

CSS エラスティック ボックス flex-grow、flex-shrink、flex-basis の詳細な説明

3 つの属性 flex-grow、flex-shrink、flex-basis の機能は次のとおりで...

Nginx の起動に失敗した場合のいくつかのエラー処理の詳細な説明

Nginx を Web サーバーとして使用する際に、次の問題が発生しました。 1. nginxの起動...

Mysql5.7.14 Linux版のパスワードを忘れた場合の完璧な解決策

/etc/my.confファイルで、[mysqld]の下に次の行を追加します: skip-grant...

複合主キーと複数列インデックスに遭遇した場合の MySQL 行ロックの詳細な説明

背景今日、他のプロジェクト チームと協力してシス​​テムのストレス テストを実施しているときに、プロ...

VUE を使用して Ali Iconfont ライブラリをオンラインで呼び出す方法

序文何年も前、私はサーバー側の初心者でしたが、業界の競争が激しくなるにつれて、フロントエンドの初心者...

nginx ロードバランシングを介して https にリダイレクトする方法

ウェブ上で証明書とキーをコピーするscp -rp -P52113 /application/ngin...

クロスドメインの問題を解決するためのNginxの実用的な方法

フロントエンドとバックエンドを分離し、nginxを使用してクロスドメインの問題を解決するフロントエン...

16進カラーコード(完全版)

赤とピンク、およびそれらの 16 進コード。 #990033 #CC6699 #FF6699 #FF...

MySql 最適化のための my.ini 中国語構成スキームの詳細な説明: InnoDB、4GB メモリ、および複数のクエリ

この記事は、4G メモリ システム用の MySQL 構成ファイル ソリューションです (主に Inn...

進捗バーのネイティブ JavaScript 実装

進捗バーを実装するためのJavaScriptの具体的なコードは参考までに。具体的な内容は次のとおりで...

表示しているページのスナップショットを Baidu が保存できないように設定する方法

今日、Baidu でページを検索したところ、ページが削除されていたため、当然 Baidu スナップシ...