初心者でもjsのtypeofとinstanceofの違いを理解できます

初心者でもjsのtypeofとinstanceofの違いを理解できます

1. 型

typeof 演算子は、評価されていないオペランドの型を示す文字列を返します。次のように使用されます。

オペランドの型
typeof(オペランド)

オペランドはオブジェクトまたはプリミティブ値を表す式であり、その型が返されます。たとえば、

typeof 1 // '数値'
typeof '1' // '文字列'
typeof undefined // 'undefined'
typeof true // 'ブール値'
typeof Symbol() // 'シンボル'
typeof null // 'オブジェクト'
typeof [] // 'オブジェクト'
typeof {} // 'オブジェクト'
typeof コンソール // 'オブジェクト'
typeof console.log // 'function'

上記の例では、最初の 6 つが基本データ型です。 typeof null はオブジェクトですが、これは JavaScript の長年のバグにすぎません。null が参照データ型であることを意味するわけではなく、null 自体はオブジェクトではありません。

したがって、typeof の後に null によって返される結果には問題があり、null を判定する方法として使用することはできません。 if ステートメントで null かどうかを確認する必要がある場合は、===null を使用して確認します。

同時に、参照型データも見つけることができます。typeofを使用して判断すると、関数を除いて残りはオブジェクトを出力します。
変数が存在するかどうかを判断したい場合は、typeof を使用できます。(a が宣言されていない場合はエラーが発生するため、if(a) は使用できません)

if(typeof a != 'undefined'){
    //変数が存在する}

2. インスタンス

instanceof 演算子は、コンストラクター関数のプロトタイプ プロパティがインスタンス オブジェクトのプロトタイプ チェーンに出現するかどうかを検出するために使用されます。次のように使用されます。

オブジェクトインスタンスコンストラクタ

object はインスタンス オブジェクト、constructor はコンストラクタ関数です。コンストラクタ関数は new を通じてオブジェクトをインスタンス化でき、instanceof はこのオブジェクトが前のコンストラクタによって生成されたオブジェクトかどうかを判断できます。

// 構築関数を定義する let Car = function() {}
benz = new Car() とします。
benz instanceof Car // true
車 = 新しい文字列('xxx')
car インスタンス 文字列 // true
str = 'xxx' とします
str 文字列のインスタンス // false

instanceof の実装原理については以下を参照してください。

関数 myInstanceof(left, right) {
    // ここではtypeofを使って基本データ型を決定します。そうであれば、直接falseを返します
    if(typeof left !== 'object' || left === null) は false を返します。
    // getProtypeOf は Object オブジェクトの API であり、パラメータのプロトタイプ オブジェクトを取得できます。let proto = Object.getPrototypeOf(left);
    while(true) {                  
        if(proto === null) は false を返します。
        if(proto === right.prototype) return true; //同じプロトタイプオブジェクトを見つけてtrueを返す
        proto = Object.getPrototypeof(proto);
    }
}

つまり、同じプロトタイプオブジェクトが見つかるまでプロトタイプチェーンをたどり、trueを返し、そうでない場合はfalseを返します。

3. 違い

typeof と instanceof はどちらもデータ型を決定するメソッドです。違いは次のとおりです。

  • typeofは変数の基本型を返し、instanceofはブール値を返します。
  • instanceofは複雑な参照データ型を正確に判別できますが、基本データ型を正しく判別することはできません。
  • ただし、typeof にも欠点があります。基本データ型 (null を除く) を判別できますが、関数型以外の参照データ型を判別することはできません。

1. オブジェクト、配列、および null の場合、返される値はオブジェクトです。例えば、typeof(window)、typeof(document)、typeof(null) によって返される値はすべてオブジェクトです。
2. 関数型の場合、返される値は function です。たとえば、typeof(eval) と typeof(Date) によって返される値はどちらも関数です。

上記の 2 つの方法には欠点があり、すべてのシナリオのニーズを満たすことができないことがわかります。

一般的にデータ型を検出する必要がある場合は、Object.prototype.toStringを使用してこのメ​​ソッドを呼び出し、次のように"[object Xxx]"の形式で文字列を返します。

Object.prototype.toString({}) // "[オブジェクト Object]"
Object.prototype.toString.call({}) // 上記と同じ結果ですが、呼び出しもOKです
Object.prototype.toString.call(1) // "[オブジェクト番号]"
Object.prototype.toString.call('1') // "[オブジェクト文字列]"
Object.prototype.toString.call(true) // "[オブジェクト ブール値]"
Object.prototype.toString.call(function(){}) // "[オブジェクト Function]"
Object.prototype.toString.call(null) //"[オブジェクト Null]"
Object.prototype.toString.call(undefined) //"[オブジェクトは未定義です]"
Object.prototype.toString.call(/123/g) //"[オブジェクト正規表現]"
Object.prototype.toString.call(new Date()) //"[オブジェクト Date]"
Object.prototype.toString.call([]) //"[オブジェクト配列]"
Object.prototype.toString.call(document) //"[オブジェクト HTMLDocument]"
Object.prototype.toString.call(window) //"[オブジェクト Window]"

toString の基本的な使い方がわかったので、グローバルなデータ型判定メソッドを実装してみましょう。

関数 getType(obj){
  type = typeof obj; とします。
  if (type !== "object") { // 最初に typeof 判定を実行します。基本データ型の場合は、戻り値の型を直接返します。
  }
  // typeof の場合、結果は object です。次に、次の判断を行います。通常の結果は return Object.prototype.toString.call(obj).replace(/^\[object (\S+)\]$/, '$1'); です。 
}

以下のように使用します

getType([]) // "Array" typeof [] はオブジェクトなので、toString は getType('123') を返します // "string" typeof は直接 getType(window) を返します // "Window" toString は getType(null) を返します // "Null" は最初の文字が大文字なので、typeof null はオブジェクトなので、toString で判別する必要があります getType(undefined) // "undefined" typeof は直接 getType() を返します // "undefined" typeof は直接 getType(function(){}) を返します // "function" typeof で判別できるので、最初の文字は小文字です getType(/123/g) //"RegExp" toString は

初心者でも js の typeof と instanceof の違いを理解する方法についての記事はこれで終わりです。 js の typeof と instanceof の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。 今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • JavaScript における typeof と instanceof の使用法の詳細な説明
  • Javascript の typeof と instanceof の違い
  • JavaScript の型検出: typeof と instanceof の欠陥と最適化
  • JavaScript の typeof と instanceof についての私の深い理解について話します
  • JavaScript の instanceof と typeof についての簡単な説明
  • JavaScript における instanceof 演算子と typeof 演算子の使用法と違いの詳細な分析
  • JS における typeof と instanceof の違いのまとめ
  • データ型の判断における js typeof と instanceof の違いと、その開発と使用について

<<:  MySQLの共通関数の概要

>>:  時刻を保存するために適切な MySQL の datetime 型を選択する方法

推薦する

MySQL 5.7 のスロークエリログの時間がシステム時間より 8 時間遅れている理由の詳細な説明

遅いクエリをチェックすると、時間が正しくなく、システム時間とちょうど 8 時間異なっていることがわか...

Ubuntu Linux に Git と GitHub をインストールして使用する

Git 入門Git は、Linux(R) カーネル開発の管理を支援するために 2005 年に Lin...

Webリクエストと処理のTomcatソースコード分析

目次序文1. エンドポイント2. 接続ハンドラ3. コヨーテ4. コンテナ責任チェーンパターン序文T...

Vueはvueメタ情報を使用して各ページのタイトルとメタ情報を設定します。

title: vue は vue-meta-info を使用して各ページのタイトルとメタ情報を設定...

Nginx プロキシ転送構成を通じてクロスドメイン API プロキシ転送を実装する方法

序文WEB 開発では、クロスドメイン リクエストが頻繁に発生します。クロスドメインの問題を解決する方...

Dockerカスタムブリッジdocker0とdockerのコマンド操作の開始、終了、再起動

質問会社がサーバーを移行した後、デフォルトで作成された docker0 ブリッジが会社の外部ネットワ...

image/x-png の ContentType について

これにより、png ファイルのアップロードも不可能になりました (後で情報を調べたところ、レジストリ...

JS でタブ効果を書く

この記事の例では、タブ効果を記述するためのJSの具体的なコードを参考までに共有しています。具体的な内...

燃える炎効果の英語フォント16種類をシェアする

私たちは視覚の世界に住んでおり、多くの視覚効果に囲まれています。コンピューターの前にいても、屋外にい...

突然外部ネットワークからDockerにアクセスできなくなる問題の解決方法

マスターのメソッドによると、原因は sysctl net.ipv4.ip_forward であること...

複数のフィールドをグループ化するMySQLグループ

日常の開発タスクでは、データ テーブル内のグループ化フィールドに基づいて統計データを取得するために、...

nginx サーバーでの 502 不正なゲートウェイ エラーの原因のトラブルシューティング

パブリックアカウントのファンデータを同期してバッチプッシュするときに、サーバーがエラー502を報告し...

Vueはmockjsを使用してシミュレートされたデータケースの詳細を生成します

目次プロジェクトにmockjsをインストールするVueプロジェクトでmockjsを使用する基本的なプ...

フォームの読み取り専用属性と無効な属性についての簡単な説明

フォーム内の読み取り専用および無効な属性1. 読み取り専用:サーバーは、ユーザーがデータを変更するこ...

MySQL 8.0 のユーザーとロールの管理原則と使用方法の詳細

この記事では、MySQL 8.0 のユーザーとロールの管理について例を挙げて説明します。ご参考までに...