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 のインストールの詳細なグラフィックチュートリアル

推薦する

Web プロジェクト開発 JS 機能の手ぶれ補正とスロットリングのサンプル コード

目次安定導入手ぶれ補正シーン1(マウスの動き込み)手ぶれ補正シーン2(キーボードのキー)関数のスロッ...

Ubuntu 18.04 でソースコードから Odoo14 をインストールするチュートリアル

目次このシリーズの背景概要PostgreSQL データベースの準備ソースからインストール仮想環境の作...

埋め込みJavaScriptと外部リンクの基本的な応用方法

目次埋め込みJavaScriptと外部リンクの基本的な応用JavaScript の記述方法には、イン...

Linux で実行可能ファイルを実行するときに「そのようなファイルまたはディレクトリはありません」というプロンプトが表示される場合の解決策

最近、Linux オペレーティング システムを使用して実行可能ファイルを実行していたところ、「そのよ...

HTML の blockquote タグの使用と美化

ブロック引用の定義と使用法<blockquote> タグは引用ブロックを定義します。 &...

Nginx Linux のインストールと展開の詳細なチュートリアル

1. Nginx の紹介Nginxは負荷分散やリバースプロキシにも使えるWebサーバーです。現在最も...

jQueryはフォーム検証機能を実装します

jQuery フォーム検証の例 / ユーザー名、パスワード、住所、電子メールの検証を含む下記の通り ...

Vue スキャフォールディング プロジェクトを作成するための詳細な手順

vue スキャフォールディング -> vue.cli大規模で完全に機能する Vue プロジェク...

CSS でフローティングにより親要素の高さが崩れる問題を解決するいくつかの方法

1. ドキュメントフローとフローティング1. ドキュメントフローとは何ですか? HTML では、ドキ...

MySQL でテーブルを作成するときの NULL と NOT NULL の使用方法の詳細な説明

MySQL の仕様によっては、テーブル作成仕様にすべてのフィールドが空であってはならないという要件を...

Docker+Jenkins+Gitlab+Djangoアプリケーションデプロイ実践の詳細な説明

1. 背景インターネット アプリケーションの急速な更新と反復という状況では、従来の手作業や単純なスク...

MySQL ロック制御同時実行方法

目次序文1. 楽観的ロックバージョンフィールドを追加する2. 悲観的ロック読み取りロック完全なテーブ...

VirtualBox で作成された Debian 仮想マシンは Windows ホストとファイルを共有します

用語: 1. VM: 仮想マシンステップ: 1. Windows 10 に VirtualBox 6...

Vue3.0 手書きカルーセル効果

この記事では、Vue3.0の手書きカルーセル効果の具体的なコードを参考までに共有します。具体的な内容...