JavaScript の typeof の目的

Nov 26, 2016 pm 04:07 PM
JavaScript

JavaScript の

typeof は実際には非常に複雑ですが、多くのことを行うために使用できますが、多くの奇妙な動作もあります。 この記事では、その複数の用途をリストし、既存の問題と解決策も指摘します。

この記事を読む前提は、プリミティブ値とオブジェクト値の違いを理解する必要があるということです。

変数が存在し、値があるかどうかを確認します

typeof は、次の 2 つの場合に「未定義」を返します:

変数が宣言されていない

変数の値が未定義

例:

> typeof undeclaredVariable === "未定義"

> vardeclaredVariable;

>

&g t; ​​タイプが未定義です

'未定義'

値が未定義かどうかを検出する方法は他にもあります:

> var value = unknown;

> value === unknown

tru​​e

undeclared 変数がオンの場合、typeof のみがエラーを報告せずに宣言されていない変数を正常に検出できるため、例外がスローされます:

> undeclaredVariable === unknown

ReferenceError: undeclaredVariable が定義されていません

注 : 未初期化変数、パラメータが渡されない仮パラメータ、および存在しないプロパティは常にアクセス可能であり、値は常に未定義であるため、上記の問題は発生しません。

tru​​e

> (function (x) { return x === 未定義 }())

tru​​e

> = == 未定義

tru​​e

注: したがって、宣言されていない可能性のあるグローバル変数の存在を検出したい場合は、if(window.maybeUndeclaredVariable){} を使用することもできます。

問題: このようなタスクを完了する場合、typeof は非常に複雑に見えます

解決策: この種の操作はあまり一般的ではないため、より良い解決策を見つける必要はないと感じる人もいます。 しかし、おそらく誰かが特別な演算子を提案するでしょう:

>

> defined undeclaredVariable

false

または、おそらく誰かが検出を必要とします。変数

& & gt; Declared UndeClaredvariable

false

& & gt; Var Declaredvariable; 演算子は、define() と同等であり、上記で宣言された演算子は、exists() と同等です。

値が未定義または null に等しいかどうかを判断する

問題: 値が定義されているかどうか (値が未定義でも null でもない) を検出したい場合、最も有名な奇妙な症状の 1 つに遭遇したことになります。 of typeof (バグと考えられます): typeof null returns "object":

> typeof null

'object'

翻訳者注: これは元の JavaScript 実装のバグであるとしか言えません。標準はこれが標準化されています。 V8 では一度 typeof null === "null" を修正して実装しましたが、最終的には実行不可能であることが判明しました。 http://wiki.ecmascript.org/doku.php?id=harmony:typeof_null。

(注釈: null を操作すると typeof は "object" を返します。これは JavaScript 言語自体のバグです。残念ながら、既存のコードがすでにこのパフォーマンスに依存しすぎているため、このバグは修正されることはありません。しかし、null はこの問題については stackoverflow で議論があります: http://stackoverflow.com/questions/801032/null-object-in-javascript/7968470@justjavac)

解決済みの解決策: typeof を使用しないでください。このタスクでは、代わりに次の関数を使用します:

function isDefined(x) {

return x !== null && x !== unknown;

}

another 1 つの可能性は、「デフォルト値演算子」を導入することです。 "。myValue が定義されていない場合、次の式は defaultValue を返します:

myValue ??defaultValue

上記の式は次と同等です:

(myValue !== unknown && myValue !== null) ? myValue :defaultValue

または:

myValue ??=defaultValue

は、実際には次のステートメントを簡略化したものです:

myValue = myValue ??defaultValue

bar などのネストされたプロパティにアクセスするとき、次の演算子の助けが必要になるかもしれません:

obj.foo.bar

obj または obj.foo が定義されていない場合、上記の式は例外をスローします。 演算子 .?? を使用すると、上記の式は、属性をレイヤーごとに移動するときに、値が未定義または null である最初に見つかった属性を返すことができます:

obj.??foo.??bar

:

(obj === 未定義 || obj === null) ?

: (obj.foo === unknown || obj.foo === null) ? obj.foo

: obj.foo.bar

オブジェクト値とプリミティブ値を区別する

以下の関数を使用しますx がオブジェクト値かどうかを検出するには:

function isObject(x) {

return (typeof x === "function"

|| (typeof x === "object" && x !== null ));

}

問題: typeof は関数とオブジェクトを異なる型として扱い、typeof null は「object」を返すため、上記の検出はより複雑になります。

解決策: 次の方法もオブジェクトの検出によく使用されます。値:

function isObject2(x) {

return x === Object(x);

}

警告: ここで検出するには、instanceof Object を使用できると思うかもしれませんが、instanceof は次のようにオブジェクトを使用します。プロトタイプはインスタンスの関係を決定するために使用されるため、プロトタイプのないオブジェクトをどうするか: var obj = Object.create(null);

>

obj Indeed はオブジェクトですが、値のインスタンスではありません:

> typeof obj

'object'

> obj instanceof Object

false

オブジェクトですが、実際に存在し、用途があります。

翻訳者注: Object.prototype は、プロトタイプのない唯一の組み込みオブジェクトです。 & & Gt; object.getprototypeof (object.prototype)

null

& gt; Typeoflact.protothpe

'Object'

& gt; オブジェクト lFalse

の型は何ですか? typeof は、プリミティブ値の型を確認する最良の方法です。問題: typeof null の奇妙な動作に注意する必要があります。

> typeof null // 注意してください!

'object'

解決策: 次の関数でこの問題を解決できます (この使用例の場合のみ)。

function getPrimitiveTypeName(x) {

var typeName = typeof x;

switch(typeName) {

case "未定義":

case "boolean":

case "number":

case "文字列:

> : 実装するgetTypeName() 関数。元の値の型だけでなく、オブジェクトの値の内部 [[Class]] 属性も返すことができます。 この関数の実装方法は次のとおりです (翻訳者注: jQuery の $.type はそのような実装です)

特定の値が関数であるかどうか

typeof を使用して、値が関数であるかどうかを検出できます。

> typeof function () {}

'function'

> typeof Object.prototype.toString

'function'

原則として、instanceof Function もこの要件を検出できます。 一見すると、よりエレガントな書き方に見えます。 ただし、ブラウザには癖があります。すべてのフレームとウィンドウに独自のグローバル変数があります。 したがって、あるフレームから別のフレームにオブジェクトを渡す場合、2 つのフレームのコンストラクターが異なるため、instanceof は正しく機能しません。 ECMAScript5 に Array.isArray() メソッドがあるのはこのためです。 オブジェクトが特定のコンストラクターのインスタンスであるかどうかをチェックするためのクロスフレームワーク メソッドがあれば便利です。 上記の getTypeName() は利用可能な回避策ですが、より根本的な解決策がある可能性があります。

概要

以下に挙げるものは、現時点で JavaScript で最も緊急に必要とされるものであり、typeof の現在の責任の機能の一部を置き換えることができます:

isDefined() (Object.isDefined() など) : 関数または演算子として使用できます

isObject()

getTypeName()

オブジェクトが指定されたコンストラクターのインスタンスであるかどうかを検出するクロスフレームワークメカニズム

Check変数 このような要件が宣言されていれば、独自の演算子は必要ないかもしれません。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

独自のJavaScriptライブラリを作成および公開するにはどうすればよいですか? 独自のJavaScriptライブラリを作成および公開するにはどうすればよいですか? Mar 18, 2025 pm 03:12 PM

記事では、JavaScriptライブラリの作成、公開、および維持について説明し、計画、開発、テスト、ドキュメント、およびプロモーション戦略に焦点を当てています。

ブラウザでのパフォーマンスのためにJavaScriptコードを最適化するにはどうすればよいですか? ブラウザでのパフォーマンスのためにJavaScriptコードを最適化するにはどうすればよいですか? Mar 18, 2025 pm 03:14 PM

この記事では、ブラウザでJavaScriptのパフォーマンスを最適化するための戦略について説明し、実行時間の短縮、ページの負荷速度への影響を最小限に抑えることに焦点を当てています。

フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? Apr 04, 2025 pm 02:42 PM

フロントエンドのサーマルペーパーチケット印刷のためのよくある質問とソリューションフロントエンド開発におけるチケット印刷は、一般的な要件です。しかし、多くの開発者が実装しています...

ブラウザ開発者ツールを使用してJavaScriptコードを効果的にデバッグするにはどうすればよいですか? ブラウザ開発者ツールを使用してJavaScriptコードを効果的にデバッグするにはどうすればよいですか? Mar 18, 2025 pm 03:16 PM

この記事では、ブラウザ開発者ツールを使用した効果的なJavaScriptデバッグについて説明し、ブレークポイントの設定、コンソールの使用、パフォーマンスの分析に焦点を当てています。

誰がより多くのPythonまたはJavaScriptを支払われますか? 誰がより多くのPythonまたはJavaScriptを支払われますか? Apr 04, 2025 am 12:09 AM

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

ソースマップを使用して、マイナイドJavaScriptコードをデバッグするにはどうすればよいですか? ソースマップを使用して、マイナイドJavaScriptコードをデバッグするにはどうすればよいですか? Mar 18, 2025 pm 03:17 PM

この記事では、ソースマップを使用して、元のコードにマッピングすることにより、Minified JavaScriptをデバッグする方法について説明します。ソースマップの有効化、ブレークポイントの設定、Chrome DevtoolsやWebpackなどのツールの使用について説明します。

Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Apr 04, 2025 pm 05:12 PM

Console.log出力の違いの根本原因に関する詳細な議論。この記事では、Console.log関数の出力結果の違いをコードの一部で分析し、その背後にある理由を説明します。 �...

JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? Apr 04, 2025 pm 05:09 PM

同じIDを持つ配列要素をJavaScriptの1つのオブジェクトにマージする方法は?データを処理するとき、私たちはしばしば同じIDを持つ必要性に遭遇します...

See all articles