ホームページ >ウェブフロントエンド >jsチュートリアル >すべての開発者が知っておくべき JavaScript の奇妙な部分をデコードする
私たちが大好きな (あるいは大嫌いな) 言語である JavaScript には、強力であると同時に複雑さをもたらす独特の動作や癖がたくさんあります。これらの「奇妙な部分」は初心者を混乱させる可能性がありますが、これらをマスターすることは熟練した開発者になるために不可欠です。すべての開発者が知っておくべき、JavaScript の興味深い奇妙な点について詳しく見ていきましょう。
JavaScript は、型間で値を変換することで役に立とうとしますが、この「有用性」が驚くべき結果を引き起こす可能性があります。
例: 予期せぬ数学
console.log('5' - 3); // 2 console.log('5' + 3); // '53'
JavaScript での this の動作は、関数の呼び出し方法に応じて変化するため、混乱を招くことがよくあります。
例: 異なるコンテキスト
function showThis() { console.log(this); } showThis(); // Window or undefined in strict mode const obj = { method: showThis }; obj.method(); // obj const boundFunc = showThis.bind(obj); boundFunc(); // obj
JavaScript はシングルスレッドですが、イベント ループを通じて非同期タスクを処理できます。
例: 最初に実行されるものは何ですか?
console.log('Start'); setTimeout(() => console.log('Timeout'), 0); Promise.resolve().then(() => console.log('Promise')); console.log('End');
出力
Start End Promise Timeout
イベント ループを理解することは、パフォーマンスの高い非同期コードを作成するための鍵となります。
クロージャとは、外部関数が戻った後でも関数がその字句スコープを「記憶」しているときのことです。
例: プライベート変数
function counter() { let count = 0; return function () { count++; console.log(count); }; } const increment = counter(); increment(); // 1 increment(); // 2
クロージャを使用すると、プライベート変数を作成し、関数呼び出し全体で状態を維持できます。
JavaScript はプロトタイプベースの継承を使用します。つまり、オブジェクトは他のオブジェクトからプロパティとメソッドを継承できます。
例: カスタム メソッド
console.log('5' - 3); // 2 console.log('5' + 3); // '53'
プロトタイプを使用すると、インスタンス間でメソッドを効率的に共有できます。
JavaScript は緩やかな等価性 (==) と厳密な等価性 (===) の両方を提供しており、それらは異なる動作をします。
例: Null と未定義の奇妙なケース
function showThis() { console.log(this); } showThis(); // Window or undefined in strict mode const obj = { method: showThis }; obj.method(); // obj const boundFunc = showThis.bind(obj); boundFunc(); // obj
明示的に型変換が必要でない限り、常に === を使用してください。
非プリミティブ値を直接比較することは避けてください ({} !== {})。
JavaScript はオブジェクトと配列を参照型として扱います。つまり、参照への変更は元の参照に影響します。
例: コピーの落とし穴
console.log('Start'); setTimeout(() => console.log('Timeout'), 0); Promise.resolve().then(() => console.log('Promise')); console.log('End');
NaN は「Not a Number」の略ですが、その動作は単純なものではありません。
例: NaN の比較
Start End Promise Timeout
NaN などの特殊な場合の厳密な等価性が必要な場合は、Object.is を使用します。
ホイスティングにより、変数と関数の宣言がスコープの先頭に移動します。
例: 変数のホイスト
function counter() { let count = 0; return function () { count++; console.log(count); }; } const increment = counter(); increment(); // 1 increment(); // 2
変数ホイスティングの混乱を避けるには、let と const を使用します。
デフォルトのパラメータは関数をより柔軟にしますが、未定義と組み合わせると奇妙な動作をする可能性があります。
例: デフォルトと引数
function Person(name) { this.name = name; } Person.prototype.greet = function () { console.log(`Hello, my name is ${this.name}`); }; const alice = new Person('Alice'); alice.greet(); // Hello, my name is Alice
デフォルトのパラメータは、引数が null ではなく未定義の場合にのみ適用されます。
JavaScript の癖により、JavaScript はイライラすると同時に楽しいものになります。これらの動作を理解すると、より優れた開発者になるだけでなく、言語の柔軟性と設計の選択肢を理解するのにも役立ちます。
次の癖のうちどれに遭遇しましたか?どのように対処しましたか?以下のコメント欄でご意見を共有してください!
以上がすべての開発者が知っておくべき JavaScript の奇妙な部分をデコードするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。