{}const=>[]async()letfn</>var
JSWebキャリア

すべてのシニアが知っておくべき11のJavaScriptの重要なコンセプト👨‍💻

Hoisting、TDZ、ディープコピーとサーフェスコピー、タイピングなど、すべてがわかりやすいガイドにまとめられています。例とヒントを使って、基本を整理しましょう!

К

Kodik

著者

2分で読める

🧠 JavaScriptはシンプルかもしれませんが、その下には多くの興味深いものが隠されています。 言語を使用して1年以上経っている場合でも、その内部メカニズム、複雑さ、落とし穴について知ることで、よりクリーンで予測可能で効率的なコードを書くことができます。この記事は、初心者だけでなく経験豊富な開発者にも役立つ JavaScript の主要機能に関する詳細なガイドです。

🚀 取り上げるテーマ:

  • 浮揚

  • Temporal Dead Zone(一時的なデッドゾーン)

  • Function Declaration vs Function Expression

  • Shallow Copy vs Deep Copy(シャローコピーとディープコピー)

  • Object.assign

  • Slice vs Splice

  • forEach vs Map

  • Global Execution Context

  • ポリフィリング

  • map ()の詳細

  • 型のキャスト(型の強制)


🪄 1. ホイスト(Hoisting)

Hoistingは、初心者にとって最も謎めいたJavaScriptメカニズムの1つです。これは、変数と関数の宣言がそのスコープの先頭に「浮かび上がる」エンジンの動作です。

これは、変数または関数が実際に宣言される前にそれらを参照しようとすることができ、時にはそれが機能することさえあることを意味します。

console.log(a); // undefined
var a = 10;

varundefinedがポップアップして初期化されますが、letconstはポップアップしますが、初期化されません。したがって、次のコードはエラーを引き起こします。

console.log(b); // ReferenceError
let b = 20;

機能に関しては、 function declarationfunction expression 特に重要です:

console.log(getNum()); // OK
function getNum() { return 42; }

console.log(getArrow()); // TypeError: getArrow is not a function
var getArrow = () => 42;

📸 写真のプロンプト: "JavaScriptでのhoistingに関するインフォグラフィック、var/let/const変数とfunction/function expressionの区別"


🕳 2. Temporal Dead Zone (TDZ)

一時的なデッドゾーンは、変数がすでに宣言されている期間(letまたはconstを介して)ですが、まだ初期化されていません。TDZ では、変数へのアクセスを試みると、ReferenceError が呼び出されます。

console.log(value); // ReferenceError
let value = 100;

このメカニズムはエラーからユーザーを保護し、コードの動作をより予測可能にします。TDZは、constおよびletとして定義された関数にも適用されます。


🧩 3. Function Declaration vs Function Expression

Function Declaration

function greet() {
  console.log("Hello!");
}

このような関数はポップアップ表示され、スコープ内の任意の場所で呼び出すことができます。これは、関数のロジックがスクリプト全体で利用可能である必要がある場合に便利です。

Function Expression

const greet = function() {
  console.log("Hello!");
}

ここでは、変数が割り当てられた後にのみ関数が使用可能になります。これは、クロージャーやコールバックでの使用に最適です。


📦 4. Shallow Copy vs Deep Copy

シャローコピー

オブジェクトのプロパティの最上位レベルのみをコピーします。ネストされたオブジェクトは、同じメモリ領域を参照し続けます。

const obj1 = { name: "Olga", address: { city: "Kazan" } };
const obj2 = { ...obj1 };
obj2.address.city = "Ufa";
console.log(obj1.address.city); // "Ufa"

ディープコピー

ネストされた構造を含むオブジェクトを完全にコピーできます。

const deepCopy = structuredClone(obj1);
deepCopy.address.city = "Sochi";

代替案:

  • JSON.stringify/parse — 機能とundefinedでは動作しません

  • structuredCloneは最新の方法です

  • ユーザー定義の再帰関数

📸 写真のプロンプト:「ネストされたオブジェクトの可視化による表面コピーと深いコピーの比較」


🔄 5. Object.assign()

このメソッドを使用すると、1つまたは複数のオブジェクトのプロパティをターゲットにコピーできます。

const objA = { name: "Alice" };
const objB = { age: 30 };
const result = Object.assign({}, objA, objB);

特徴:

  • ターゲットオブジェクトを返します

  • 独自の列挙型プロパティのみをコピーします

  • 同じ名前のプロパティを上書きします

代替案は、スプレッド構文です。{ ...objA, ...objB }


✂️ 6. Slice vs Splice

slice()splice()は、しばしば混同される配列メソッドです。

  • slice(start, end) — 元の配列を変更せずに新しい配列を返します

  • splice(start, deleteCount, ...items) — 配列をその場で変更します

const arr = [1, 2, 3, 4, 5];
console.log(arr.slice(1, 3)); // [2, 3]
console.log(arr.splice(1, 2, 9, 9)); // [2, 3], arr は現在 [1, 9, 9, 4, 5]

🔁 7. forEach vs map

どちらのメソッドも配列を反復しますが、次のようなニュアンスがあります。

特徴

forEach

map

新しい配列を返します

ループを抜けられますか?

使用目的

副作用

変換

[1, 2, , 4].map(x => x || 0); // スパース配列を処理します

実行を停止する必要がある場合は、forfor...ofsome、またはeveryを使用します。


🌍 8. Global Execution Context

実行の背景 — コードが実行される環境です。2種類あります。

  1. グローバル - 最初に作成され、グローバル変数、関数、およびオブジェクト this を含みます。

  2. 機能的 — 各関数を呼び出すと作成されます。

スクリプトが完了すると、グローバルコンテキストが削除されます。


🛠 9. Polyfilling

ポリフィルを使用すると、古いブラウザで新しい言語機能の動作をエミュレートできます。

例:Array.prototype.includesのポリフィル:

if (!Array.prototype.includes) {
  Array.prototype.includes = function(el) {
    return this.indexOf(el) !== -1;
  };
}

ポリフィルは、クロスブラウザソリューションを開発する際に特に重要です。


🗺 10. Map Deep Dive

メソッド map() は、3つの引数を受け取ります。

  • インデックス

  • 元の配列

const data = [1, 2, , 4];
const result = data.map((val, idx, arr) => val ? val * 2 : (arr[idx - 1] || 1));

特徴:

  • 省略された要素(empty slots)は無視されます

  • 実行時に追加された新しい要素は処理されません

  • 実行前に削除されたものはスキップされます


⚖️ 11. 型変換

暗黙的 (implicit):

10 + "2"; // "102"
10 - "2"; // 8
true + 1; // 2
[] + 1;   // "1"
null + 1; // 1
undefined + 1; // NaN

明示的 (explicit):

String(123);
Number("456");
Boolean(0); // false

予期しないバグを回避するために、変換がいつどのように行われるかを理解することが重要です。


📝 結論

📚 JavaScriptの内部構造を深く理解することで、コードを書くだけでなく、アプリケーションアーキテクチャをより信頼性が高く、わかりやすく設計することができます。これは、読みやすさと動作の予測可能性が重要なチーム開発において特に重要です。

ホイスト、TDZ、関数の種類、オブジェクトのコピー、mapとforEachの機能、型のキャストなどのテーマを理解することで、JavaScriptが単なる言語ではなく、ロジックを微調整するためのツールとなるレベルに到達します。

🎯先延ばしをやめよう

記事は気に入った?
実践の時間だ!

Kodikでは読むだけでなく、すぐにコードを書く。理論 + 実践 = 本当のスキル。

即座に実践
🧠AIがコードを説明
🏆修了証

登録不要 • カード不要