[すべてのブレークスルー] JavaScript にプロパティが存在するかどうかを確認する方法
序文
JavaScript 開発では、オブジェクトにプロパティが存在するかどうかを判断する必要があることがよくあります。
JavaScript は比較的緩い言語であるため、より厳密なことを行うのは困難です。たとえば、JavaScript における「属性が存在するかどうか」の定義には、どのような場合に属性が存在し、どのような場合に存在しないとみなされるかという問題があります。正解も不正解もありませんが、状況や開発ニーズが異なれば、「存在」の意味も異なります。
ここではよく使われる5つの判断方法とその問題点についてお話します。
方法1:ブール判定
これが例です:
const obj1 = { name: 'Andy', age: 21 } const obj2 = { name: 'Alice' } console.log( obj1.age ? '存在' : '不存在' ); // 存在 console.log( obj2.age ? '存在' : '不存在' ); // 不存在
まずこの方法の欠点について話しましょう
次の場合:
const obj = { name: 'Baby', age: 0 } console.log( obj.age ? '存在' : '不存在' ); // 不存在
この場合、年齢は「存在する」はずですが、「存在しない」と判定されてしまいます。
では、この方法は使えないのでしょうか?
これはビジネスの開発ニーズによって異なります。
ビジネス開発要件で、この属性を 0、空の文字列、NaN、未定義などにすることができないことがわかっている場合でも、この判断は可能です。
より厳しい環境に置くと、この方法には欠陥が生じます。
方法 2: オプションのチェーン (?.) と未定義のチェック
まず例を挙げてみましょう:
const obj1 = { name: 'Andy', age: 21 } const obj2 = { name: 'Alice' } console.log( obj1?.age !== undefined ? '存在' : '不存在' ); // 存在 console.log( obj2?.age !== undefined ? '存在' : '不存在' ); // 不存在
この比較のロジックは、JS 言語では、存在しない値は未定義であるということです。
しかし、オブジェクトでは次の状況も発生する可能性があります:
const obj = { name: 'Andy', age: undefined }
この場合、年齢属性は「存在する」か「存在しない」のどちらにするべきでしょうか?
それは特定の需要環境によって異なりますので、何とも言えません。
方法 3: Object.keys() を検索する
オブジェクトに age 属性があるかどうかを知る必要があると言った場合、その値が何であるかは気にしません。
次のメソッドを使用できます:
const obj = { name: 'Andy', age: 21 } console.log( Object.keys(obj).includes('age') ? '存在' : '不存在' ); // 存在
Object.keys() を使用して、判断用の独自の列挙可能なプロパティ名を取得します。
ここには 2 つのキーワードがあります。1 つは「own」、もう 1 つは「enumerable」です。
まずは「自分」とは何かについて話しましょう
たとえば、ここにオブジェクトがあります。そのオブジェクトに属性名を追加します。
const obj = { name: 'Andy' } // `name` 就是 obj 自身的属性 console.log( Object.keys(obj) ); // [ 'name' ]
では、それ自体の属性ではないものは何でしょうか?そこで登場するのが「プロトタイプ」です。オブジェクトにはプロトタイプがあり、プロトタイプに追加された属性は「それ自体の」属性ではありません。
const obj = Object.create( { type: 'human' } ); obj.name = 'Andy'; console.log( obj.name ); // Andy console.log( obj.type ); // human console.log( Object.keys(obj) ); // [ 'name' ]
この例では、type が obj の属性であるかどうかをどのように判断しますか?これは言うのが難しいですよね?これは緩和された言語環境によって引き起こされる問題です。
しかし、知っておく必要があるのは、この場合、Object.keys() はプロトタイプのプロパティを取得できないということです。なぜなら、「独自の」プロパティしか読み取れないからです。
2つ目は「数えられる」
ここで属性記述子について説明しますが、私の同僚の多くは、JS 言語のオブジェクト内に各属性に記述子があることを知りません。
読み方は?印刷して見てみましょう:
const obj1 = { name: 'Andy', age: 21 } const obj2 = { name: 'Alice' } console.log( obj1.age ? '存在' : '不存在' ); // 存在 console.log( obj2.age ? '存在' : '不存在' ); // 不存在
この記述子は実際にはオブジェクトであり、値、書き込み可能、およびこの (列挙可能) 列挙可能な ...
などのこの属性に関する情報を記述していることがわかります。この列挙可能変数は、その属性と列挙可能かどうかを定義します。たとえば、この属性は for...in ループ中に読み取ることができ、同じことが Object.keys() にも当てはまります。
プロパティを非列挙可能として再定義すると、Object.keys() はこのプロパティを読み取ることができません。
const obj = { name: 'Baby', age: 0 } console.log( obj.age ? '存在' : '不存在' ); // 不存在
これには属性記述子に関する知識が関係します。これはネイティブ JS 言語の非常に重要な知識ですが、私の知っているフロントエンド プログラマーの多くはネイティブ JS の知識が不足していることがわかりました。
では、判定したい属性が列挙可能かどうかに関係なく、それ自体の属性だけでよい場合はどうなるでしょうか?その場合、Object.keys() は使用できません。次の方法を使用できます。
方法 4: Object.hasOwn() または hasOwnProperty() を使用する
Object.hasOwn() と hasOwnProperty() の違いは何ですか?
Object.hasOwn()はES2022で追加されたメソッドで、オブジェクト自体が特定のプロパティを持っているかどうかを確認するために使用され、hasOwnPropertyの最適化処理を置き換えるために使用されます。このメソッドは後から追加されたものであるため、ブラウザの新しいバージョンだけを考慮すれば、引き続き使用できます。
これら 2 つのメソッドは "独自の" 属性名を決定するため、列挙可能かどうかに関係なく読み取ることができます。
const obj1 = { name: 'Andy', age: 21 } const obj2 = { name: 'Alice' } console.log( obj1?.age !== undefined ? '存在' : '不存在' ); // 存在 console.log( obj2?.age !== undefined ? '存在' : '不存在' ); // 不存在
なぜ Object.hasOwn() を使用するかというと、オブジェクトの hasOwnProperty() が変更される可能性があるためです。
const obj = { name: 'Andy', age: undefined }
判定したい属性名がそれ自体で列挙可能である必要がなく、プロトタイプでもよい場合は、最後の方法を使用する必要があります。
方法 5: 演算子内
in 演算子は、プロパティがオブジェクトまたはそのプロトタイプ チェーンに存在するかどうかを判断するために使用されます。
const obj = { name: 'Andy', age: 21 } console.log( Object.keys(obj).includes('age') ? '存在' : '不存在' ); // 存在
要約する
これらの方法は、どの方法が正しいか、どちらが間違っているかを示しているわけではありません。すべてのシナリオが同じアプローチに適しているわけではないため、状況に応じてベスト プラクティスに従って、コードの可読性とセキュリティを強化してください。
以上が[すべてのブレークスルー] JavaScript にプロパティが存在するかどうかを確認する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undress AI Tool
脱衣画像を無料で

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

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

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











PLACSTHETTHETTHE BOTTOMOFABLOGPOSTORWEBPAGESERVESPAGESPORCICALPURPOSESESFORSEO、userexperience、andDesign.1.IthelpswithiobyAllowingseNStoAccessKeysword-relevanttagwithtagwithtagwithtagwithemaincontent.2.iTimrovesexperiencebyepingepintepepinedeeping

JavaScriptで日付と時間を処理する場合は、次の点に注意する必要があります。1。日付オブジェクトを作成するには多くの方法があります。 ISO形式の文字列を使用して、互換性を確保することをお勧めします。 2。時間情報を取得および設定して、メソッドを設定でき、月は0から始まることに注意してください。 3.手動でのフォーマット日付には文字列が必要であり、サードパーティライブラリも使用できます。 4.ルクソンなどのタイムゾーンをサポートするライブラリを使用することをお勧めします。これらの重要なポイントを習得すると、一般的な間違いを効果的に回避できます。

イベントキャプチャとバブルは、DOMのイベント伝播の2つの段階です。キャプチャは最上層からターゲット要素までであり、バブルはターゲット要素から上層までです。 1.イベントキャプチャは、AddEventListenerのUseCaptureパラメーターをTrueに設定することにより実装されます。 2。イベントバブルはデフォルトの動作であり、UseCaptureはfalseに設定されているか、省略されます。 3。イベントの伝播を使用して、イベントの伝播を防ぐことができます。 4.イベントバブルは、動的なコンテンツ処理効率を改善するためにイベント委任をサポートします。 5.キャプチャを使用して、ロギングやエラー処理など、事前にイベントを傍受できます。これらの2つのフェーズを理解することは、タイミングとJavaScriptがユーザー操作にどのように反応するかを正確に制御するのに役立ちます。

ESモジュールとCommonJSの主な違いは、ロード方法と使用シナリオです。 1.CommonJSは同期的にロードされ、node.jsサーバー側環境に適しています。 2.ESモジュールは、ブラウザなどのネットワーク環境に適した非同期にロードされています。 3。Syntax、ESモジュールはインポート/エクスポートを使用し、トップレベルのスコープに配置する必要がありますが、CommonJSは実行時に動的に呼ばれるrequire/Module.Exportsを使用します。 4.CommonJSは、Expressなどのnode.jsおよびLibrariesの古いバージョンで広く使用されていますが、ESモジュールは最新のフロントエンドフレームワークとnode.jsv14に適しています。 5.混合することはできますが、簡単に問題を引き起こす可能性があります。

JavaScriptのごみ収集メカニズムは、タグクリアリングアルゴリズムを介してメモリを自動的に管理して、メモリ漏れのリスクを減らします。エンジンはルートオブジェクトからアクティブオブジェクトを横断およびマークし、マークされていないオブジェクトはゴミとして扱われ、クリアされます。たとえば、オブジェクトが参照されなくなった場合(変数をnullに設定するなど)、次のリサイクルでリリースされます。メモリリークの一般的な原因には以下が含まれます。 closurures閉鎖の外部変数への参照。 globalグローバル変数は引き続き大量のデータを保持しています。 V8エンジンは、世代のリサイクル、増分マーキング、並列/同時リサイクルなどの戦略を通じてリサイクル効率を最適化し、メインスレッドのブロック時間を短縮します。開発中、不必要なグローバル参照を避け、パフォーマンスと安定性を改善するためにオブジェクトの関連付けを迅速に装飾する必要があります。

node.jsでHTTPリクエストを開始するには、組み込みモジュール、axios、およびnode-fetchを使用する3つの一般的な方法があります。 1.依存関係のない内蔵http/httpsモジュールを使用します。これは基本的なシナリオに適していますが、https.get()を使用してデータを取得したり、.write()を介してPOSTリクエストを送信するなど、データステッチとエラーモニタリングの手動処理が必要です。 2.Axiosは、約束に基づいたサードパーティライブラリです。簡潔な構文と強力な機能を備えており、非同期/待ち声、自動JSON変換、インターセプターなどをサポートします。非同期リクエスト操作を簡素化することをお勧めします。 3.Node-Fetchは、約束と単純な構文に基づいて、ブラウザフェッチに似たスタイルを提供します

var、let、constの違いは、範囲、昇進、繰り返し宣言です。 1.VARは機能範囲であり、変動的なプロモーションを備えており、繰り返しの宣言が可能になります。 2.一時的なデッドゾーンを備えたブロックレベルの範囲であり、繰り返される宣言は許可されていません。 3.Constはブロックレベルの範囲でもあり、すぐに割り当てる必要があり、再割り当てすることはできませんが、参照型の内部値を変更できます。最初にconstを使用し、変数を変更するときにletを使用し、varの使用を避けます。

DOMの動作が遅い主な理由は、再配置と再描画のコストが高く、アクセス効率が低いことです。最適化方法には次のものが含まれます。1。アクセス数を減らし、読み取り値をキャッシュします。 2。バッチ読み取りおよび書き込み操作。 3.マージして変更し、ドキュメントフラグメントまたは非表示要素を使用します。 4.レイアウトジッターを避け、読み書きを中央に処理します。 5.フレームワークまたはrequestAnimationFrame非同期更新を使用します。
