初心者でも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 型を選択する方法

推薦する

Vue モバイル開発で better-scroll を使用するときにクリック イベントが失敗する問題の解決策

最近、モバイル プロジェクトの開発方法を学ぶために vue を使用し、スクロールには better-...

Server-U 14バージョンのインストールと使用方法

Server-Uソフトウェアの紹介Server-U は非常に強力なファイル マネージャーです。FTP...

Flutterを使用して移動可能なスタックウィジェット機能を作成する

この投稿では、キャンバスとドラッグ可能なノード インターフェースを使用するデスクトップおよび Web...

MySQL が「operate_time」エラーのデフォルト値が無効であると報告する問題を解決する

データベースでcreate tableステートメントを実行する テーブル `sys_acl` を作成...

MySQL インデックス使用状況監視スキル (収集する価値あり!)

概要リレーショナル データベースでは、インデックスは、データベース テーブル内の 1 つ以上の列の値...

CSS での三角形の描画と巧妙な応用例の詳細な説明

鉛Web ページ上の一般的な三角形の一部は、画像やフォント アイコンにする必要なく、CSS を使用し...

適応幅(パーセンテージ)に応じて Div の高さを調整する純粋な CSS

今日のレスポンシブ レイアウトの要件では、サイズを自動的に調整できる多くの要素で高さと幅の適応を実現...

ミニプログラムカスタムコンポーネントの非効率的なグローバルスタイルの解決策

目次長すぎて読めないコンポーネントスタイルの分離デモテスト優先度ページの分離構成参考文献ネイティブ ...

Docker コンテナのカスタム ホストのネットワーク アクセス操作

docker-compose.yml に extra_hosts キーワードを追加すると、コンテナの...

レスポンシブレイアウトについて知っておくべきこと

1. はじめにレスポンシブ Web デザインにより、Web サイトは複数のデバイスと複数の画面に同時...

HTML コメント HTML 内のテキストコメントをマークするための記号

HTML コメント。コードの横に HTML コメントを付ける必要があることがよくあります。そうするこ...

JavaScript の基本変数

目次1. 変数の概要1.1 変数のメモリへの保存1.2 変数の使用1. 変数を宣言する2. 譲渡3....

MySQLで最大接続数を達成する方法

目次データベース接続数が急増した理由は何ですか? 1. はじめに2. 知識ポイント3. 練習するIV...

MySQL 変数宣言とストアド プロシージャの分析

変数の宣言グローバル変数の設定@a='新しい変数' を設定します。関数やストアドプロ...

HTML タグに類似: strong および em、q、cite、blockquote

XHTML には似た機能を持つタグがいくつかあります。もちろん、ここでの類似性とは意味の類似性を指...