亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

ホームページ ウェブフロントエンド jsチュートリアル [すべてのブレークスルー] JavaScript にプロパティが存在するかどうかを確認(rèn)する方法

[すべてのブレークスルー] JavaScript にプロパティが存在するかどうかを確認(rèn)する方法

Jan 09, 2025 pm 08:30 PM

[每次突破] JavaScript 如何判斷屬性是否存在

序文

JavaScript 開発では、オブジェクトにプロパティが存在するかどうかを判斷する必要があることがよくあります。
JavaScript は比較的緩い言語であるため、より厳密なことを行うのは困難です。たとえば、JavaScript における「屬性が存在するかどうか」の定義には、どのような場合に屬性が存在し、どのような場合に存在しないとみなされるかという問題があります。正解も不正解もありませんが、狀況や開発ニーズが異なれば、「存在」の意味も異なります。
ここではよく使われる5つの判斷方法とその問題點(diǎn)についてお話します。

方法1:ブール判定

これが例です:

const obj1 = { name: 'Andy', age: 21 }
const obj2 = { name: 'Alice' }

console.log( obj1.age ? '存在' : '不存在' ); // 存在
console.log( obj2.age ? '存在' : '不存在' ); // 不存在

まずこの方法の欠點(diǎn)について話しましょう
次の場合:

const obj = { name: 'Baby', age: 0 }

console.log( obj.age ? '存在' : '不存在' ); // 不存在

この場合、年齢は「存在する」はずですが、「存在しない」と判定されてしまいます。

では、この方法は使えないのでしょうか?
これはビジネスの開発ニーズによって異なります。
ビジネス開発要件で、この屬性を 0、空の文字列、NaN、未定義な??どにすることができないことがわかっている場合でも、この判斷は可能です。
より厳しい環(huán)境に置くと、この方法には欠陥が生じます。

方法 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
}

この場合、年齢屬性は「存在する」か「存在しない」のどちらにするべきでしょうか?

それは特定の需要環(huán)境によって異なりますので、何とも言えません。

方法 3: Object.keys() を検索する

オブジェクトに age 屬性があるかどうかを知る必要があると言った場合、その値が何であるかは気にしません。

次のメソッドを使用できます:

const obj = { name: 'Andy', age: 21 }

console.log( Object.keys(obj).includes('age') ? '存在' : '不存在' ); // 存在

Object.keys() を使用して、判斷用の獨(dú)自の列挙可能なプロパティ名を取得します。

ここには 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 の屬性であるかどうかをどのように判斷しますか?これは言うのが難しいですよね?これは緩和された言語環(huán)境によって引き起こされる問題です。

しかし、知っておく必要があるのは、この場合、Object.keys() はプロトタイプのプロパティを取得できないということです。なぜなら、「獨(dú)自の」プロパティしか読み取れないからです。

2つ目は「數(shù)えられる」

ここで屬性記述子について説明しますが、私の同僚の多くは、JS 言語のオブジェクト內(nèi)に各屬性に記述子があることを知りません。
読み方は?印刷して見てみましょう:

const obj1 = { name: 'Andy', age: 21 }
const obj2 = { name: 'Alice' }

console.log( obj1.age ? '存在' : '不存在' ); // 存在
console.log( obj2.age ? '存在' : '不存在' ); // 不存在

この記述子は実際にはオブジェクトであり、値、書き込み可能、??およびこの (列挙可能) 列挙可能な ...

などのこの屬性に関する情報(bào)を記述していることがわかります。

この列挙可能変數(shù)は、その屬性と列挙可能かどうかを定義します。たとえば、この屬性は for...in ループ中に読み取ることができ、同じことが Object.keys() にも當(dāng)てはまります。

プロパティを非列挙可能として再定義すると、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で追加されたメソッドで、オブジェクト自體が特定のプロパティを持っているかどうかを確認(rèn)するために使用され、hasOwnPropertyの最適化処理を置き換えるために使用されます。このメソッドは後から追加されたものであるため、ブラウザの新しいバージョンだけを考慮すれば、引き続き使用できます。

これら 2 つのメソッドは "獨(dú)自の" 屬性名を決定するため、列挙可能かどうかに関係なく読み取ることができます。

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: 演算子內(nèi)

in 演算子は、プロパティがオブジェクトまたはそのプロトタイプ チェーンに存在するかどうかを判斷するために使用されます。

const obj = { name: 'Andy', age: 21 }

console.log( Object.keys(obj).includes('age') ? '存在' : '不存在' ); // 存在

要約する

これらの方法は、どの方法が正しいか、どちらが間違っているかを示しているわけではありません。すべてのシナリオが同じアプローチに適しているわけではないため、狀況に応じてベスト プラクティスに従って、コードの可読性とセキュリティを強(qiáng)化してください。

以上が[すべてのブレークスルー] JavaScript にプロパティが存在するかどうかを確認(rèn)する方法の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國語 Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中國語版

SublimeText3 中國語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

node.jsでHTTPリクエストを作成する方法は? node.jsでHTTPリクエストを作成する方法は? Jul 13, 2025 am 02:18 AM

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

JavaScriptデータ型:プリミティブ対參照 JavaScriptデータ型:プリミティブ対參照 Jul 13, 2025 am 02:43 AM

JavaScriptデータ型は、プリミティブタイプと參照タイプに分割されます。プリミティブタイプには、文字列、數(shù)字、ブール、ヌル、未定義、シンボルが含まれます。値は不変であり、コピーは値を割り當(dāng)てるときにコピーされるため、互いに影響を與えません。オブジェクト、配列、関數(shù)などの參照タイプはメモリアドレスを保存し、同じオブジェクトを指す変數(shù)は互いに影響します。 TypeofとInstanceOFを使用してタイプを決定できますが、TypeOfNullの歴史的な問題に注意してください。これらの2種類の違いを理解することは、より安定した信頼性の高いコードを書くのに役立ちます。

JavaScript Timeオブジェクト、誰かがEACTEXE、Google Chromeなどのより高速なWebサイトを構(gòu)築します。 JavaScript Timeオブジェクト、誰かがEACTEXE、Google Chromeなどのより高速なWebサイトを構(gòu)築します。 Jul 08, 2025 pm 02:27 PM

こんにちは、JavaScript開発者!今週のJavaScriptニュースへようこそ!今週は、DenoとのOracleの商標(biāo)紛爭、新しいJavaScript Timeオブジェクトがブラウザ、Google Chromeアップデート、およびいくつかの強(qiáng)力な開発ツールによってサポートされています。始めましょう! 「JavaScript」の商標(biāo)を登録しようとするDeno Oracleの試みとのOracleの商標(biāo)紛爭は、論爭を引き起こしました。 Node.jsとDenoの作成者であるRyan Dahlは、商標(biāo)をキャンセルするために請願書を提出しました。

キャッシュAPIとは何ですか?また、サービスワーカーでどのように使用されますか? キャッシュAPIとは何ですか?また、サービスワーカーでどのように使用されますか? Jul 08, 2025 am 02:43 AM

Cacheapiは、ブラウザからネットワークリクエストをキャッシュするツールです。これは、ウェブサイトのパフォーマンスとオフラインエクスペリエンスを改善するために、サービスワーカーと併用することがよくあります。 1.開発者は、スクリプト、スタイルシート、寫真などのリソースを手動で保存できるようにします。 2。要求に応じてキャッシュ応答と一致させることができます。 3.特定のキャッシュの削除またはキャッシュ全體のクリアをサポートします。 4.フェッチイベントを聞いているサービスワーカーを介して、キャッシュの優(yōu)先順位またはネットワークの優(yōu)先戦略を?qū)g裝できます。 5.オフラインサポート、繰り返しのアクセス速度の高速化、主要なリソースのプリロード、バックグラウンドアップデートコンテンツによく使用されます。 6.それを使用する場合、キャッシュバージョンの制御、ストレージ制限、およびHTTPキャッシングメカニズムとの違いに注意する必要があります。

ハンドリングの約束:javascriptのチェーン、エラー処理、および約束の組み合わせ ハンドリングの約束:javascriptのチェーン、エラー処理、および約束の組み合わせ Jul 08, 2025 am 02:40 AM

約束は、JavaScriptで非同期操作を処理するためのコアメカニズムです。チェーンコール、エラー処理、コンビナーの理解は、アプリケーションをマスターするための鍵です。 1.チェーンコールは、.then()を通じて新しい約束を返し、非同期プロセスの連結(jié)を?qū)g現(xiàn)します。それぞれ.then()は以前の結(jié)果を受け取り、値または約束を返すことができます。 2。エラー処理は、.catch()を使用して例外をキャッチしてサイレント障害を回避し、キャッチのデフォルト値を返すためにプロセスを継続する必要があります。 3。promise.all()などの組み合わせ(すべての成功後にのみ成功しました)、promise.race()(最初の完了が返されます)、promise.allsettled()(すべての完了を待っています)

JavaScriptでのデータ操作のためのArray.Prototypeメソッドを活用します JavaScriptでのデータ操作のためのArray.Prototypeメソッドを活用します Jul 06, 2025 am 02:36 AM

.map()、.filter()、.reduce()などのJavaScriptアレイ內(nèi)蔵メソッドは、データ処理を簡素化できます。 1).map()は、要素を1つに変換して新しい配列を生成するために使用されます。 2).filter()は、條件ごとに要素をフィルタリングするために使用されます。 3).reduce()は、データを単一の値として集約するために使用されます。使用すると誤用を避ける必要があり、その結(jié)果、副作用やパフォーマンスの問題が発生します。

JSラウンドアップ:JavaScriptイベントループに深く潛り込む JSラウンドアップ:JavaScriptイベントループに深く潛り込む Jul 08, 2025 am 02:24 AM

JavaScriptのイベントループは、コールスタック、WebAPIS、およびタスクキューを調(diào)整することにより、非同期操作を管理します。 1.コールスタックは同期コードを?qū)g行し、非同期タスクに遭遇すると、処理のためにWebAPIに引き渡されます。 2。WebAPIがバックグラウンドでタスクを完了した後、コールバックを?qū)潖辘工毳濠`(マクロタスクまたはマイクロタスク)に入れます。 3.イベントループは、コールスタックが空であるかどうかをチェックします。空の場合、コールバックはキューから取り出され、実行のためにコールスタックに押し込まれます。 4.マイクロタスク(Promise.thenなど)は、マクロタスク(SettimeOutなど)より優(yōu)先されます。 5.イベントループを理解するには、メインスレッドのブロックを避け、コード実行順序を最適化するのに役立ちます。

JavaScript DOMイベントでのイベントの泡立ちとキャプチャの理解 JavaScript DOMイベントでのイベントの泡立ちとキャプチャの理解 Jul 08, 2025 am 02:36 AM

イベントの泡は、ターゲット要素から祖先ノードに外側(cè)に伝播し、イベントキャプチャは外側(cè)の層からターゲット要素に內(nèi)側(cè)に伝播します。 1。イベントバブル:子要素をクリックした後、イベントは親要素のリスナーを上向きにトリガーします。たとえば、ボタンをクリックした後、最初に保育を出してから、親クリックしました。 2。イベントキャプチャ:3番目のパラメーターをtrueに設(shè)定して、リスナーが[親子要素のキャプチャリスナー]をクリックする前に[親要素のキャプチャリスナーをトリガーするなど、キャプチャステージで実行されるようにします。 3.実用的な用途には、子どもの要素イベントの統(tǒng)一された管理、傍受前処理、パフォーマンスの最適化が含まれます。 4. DOMイベントストリームは、キャプチャ、ターゲット、バブルの3つの段階に分割され、デフォルトのリスナーはバブルステージで実行されます。

See all articles