ホームページ ウェブフロントエンド jsチュートリアル トップの挑戦的で最も難しいJavaScript技術面接の質問とその解決策。

トップの挑戦的で最も難しいJavaScript技術面接の質問とその解決策。

Oct 19, 2024 pm 02:31 PM

こんにちは!私は Vishal Tiwari です。JavaScript の面接での難しい質問をいくつか紹介します。

1. 次のコードの出力は何になりますか?

console.log(typeof null); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

答え:

出力: オブジェクト

説明: これは JavaScript のよく知られた癖です。 typeof 演算子は、null がオブジェクトではない場合でも、null に適用されると「object」を返します。この動作は JavaScript の実装方法に起因しており、下位互換性のために保持されています。


2. 次のコードの出力は何になりますか?

console.log(0.1 + 0.2 === 0.3); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

答え:

出力: false

説明: JavaScript (および多くのプログラミング言語) での浮動小数点演算の仕組みにより、0.1 0.2 は 0.3 と正確には等しくありません。代わりに、結果は 0.30000000000000004 となり、比較では false が返されます。


3. 次のコードの出力は何になりますか?

const a = {};
const b = { key: 'b' };
const c = { key: 'c' };

a[b] = 123; // What happens here?
console.log(a[b]); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

答え:

出力: 123

説明: 別のオブジェクトをキー (a[b]) として使用してオブジェクトにプロパティを設定しようとすると、JavaScript はオブジェクト b を文字列に変換します。その結果、「[object Object 】」。したがって、基本的にプロパティ "[object Object]" を 123 に設定することになり、a[b] をログに記録すると 123 が返されます。


4. 次のコードの出力は何になりますか?

const arr = [1, 2, 3];
arr[10] = 11;
console.log(arr.length); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

答え:

出力: 11

説明: 配列の現在の長さより大きいインデックス (arr[10] = 11 など) に値を割り当てると、JavaScript はその配列に「空のスロット」を作成します。ただし、配列の長さのプロパティは、最大のインデックスに 1 を加えたものを反映しており、この場合は 11 です。


5. 次のコードの出力は何になりますか?

let x = 1;
let y = 2;

const obj = {
    x: 10,
    y: 20,
    sum: function() {
        return this.x + this.y;
    }
};

console.log(obj.sum()); // Output?
console.log(obj.sum.call({ x: 100, y: 200 })); // Output?
console.log(obj.sum.apply({ x: 1000, y: 2000 })); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

答え:

出力:

  • 最初のコンソールログ: 30
  • 2 番目のコンソール.ログ: 300
  • 3 番目のコンソール.ログ: 3000

説明:

  • obj.sum() は obj の this コンテキストを使用するため、10 と 20 を加算して 30 を返します。
  • obj.sum.call({ x: 100, y: 200 }) は、call メソッドを使用して、これを x 値と y 値がそれぞれ 100 と 200 の新しいオブジェクトに変更し、300 を返します。
  • obj.sum.apply({ x: 1000, y: 2000 }) は apply と同じことを行い、3000 を返します。

6. 次のコードの出力は何になりますか?

console.log(1 + '1'); // Output?
console.log(1 - '1'); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

答え:

出力:

  • 最初の console.log: '11'
  • 2 番目のコンソールログ: 0

説明:

  • 1 '1' では、JavaScript は型強制を実行し、数値 1 を文字列に変換し、結果は '11' になります。
  • 1 - '1' では、JavaScript は文字列 '1' を数値に変換し、結果は 1 - 1、つまり 0 となります。

7. 次のコードの出力は何になりますか?

console.log(typeof null); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

答え:

出力: 出力は foo が呼び出されるコンテキストによって異なりますが、グローバル コンテキストにある場合は、グローバル オブジェクト (ブラウザーのウィンドウまたは Node.js のグローバル) をログに記録します。

説明: アロー関数では、これは字句的に制限されており、周囲のコンテキストからの this 値を使用します。 foo がグローバル スコープで呼び出された場合、これはグローバル オブジェクトを参照します。


8. 次のコードの出力は何になりますか?

console.log(0.1 + 0.2 === 0.3); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

答え:

出力:

  • 最初のコンソールログ: 1
  • 2 番目の console.log: 2
  • 3 番目のコンソール.ログ: 2
  • 4 番目のコンソールログ: 1
  • 5 番目のコンソール.ログ: 1

説明: createCounter 関数は、独自のカウント変数を維持するクロージャを作成します。各メソッド (インクリメント、デクリメント、getCount) は同じカウント変数にアクセスして変更し、一貫した動作を提供します。


9. 次のコードの出力は何になりますか?

const a = {};
const b = { key: 'b' };
const c = { key: 'c' };

a[b] = 123; // What happens here?
console.log(a[b]); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

答え:

出力: [99, 2, 3]

説明: JavaScript では、配列 (すべてのオブジェクトと同様) は参照型です。 b が a に代入されると、両方の変数はメモリ内の同じ配列を指します。したがって、b を変更すると a に影響します。


10. 次のコードの出力は何になりますか?

const arr = [1, 2, 3];
arr[10] = 11;
console.log(arr.length); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

答え:

出力: 3

説明: この例では、内部関数には独自の a 変数があり、外部関数の a 変数をシャドウします。 console.log(a) が inner 内で呼び出される場合、inner で定義された a である 3.

を参照します。

11. 次のコードの出力は何になりますか?

let x = 1;
let y = 2;

const obj = {
    x: 10,
    y: 20,
    sum: function() {
        return this.x + this.y;
    }
};

console.log(obj.sum()); // Output?
console.log(obj.sum.call({ x: 100, y: 200 })); // Output?
console.log(obj.sum.apply({ x: 1000, y: 2000 })); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

答え:

出力: { a: 1, b: 3, c: 4 }

説明: Object.assign() メソッドは、すべての列挙可能なプロパティの値を 1 つ以上のソース オブジェクト (obj1 および obj2) からターゲット オブジェクト (空のオブジェクト {}) にコピーします。同じプロパティが複数のソース オブジェクトに存在する場合は、最後のプロパティが優先されます。したがって、obj2 の b: 3 は obj1 の b: 2 を上書きします。


12. 次のコードの出力は何になりますか?

console.log(1 + '1'); // Output?
console.log(1 - '1'); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

答え:

出力: 未定義

説明: 改行がある場合、JavaScript は return ステートメントの後に自動的にセミコロンを挿入します。したがって、これは return; として解釈され、未定義を返します。オブジェクトを返すには、return キーワードと同じ行に左中括弧 { を置く必要があります。


13. 次のコードの出力は何になりますか?

console.log(typeof null); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

答え:

出力: 未定義

説明: 関数 foo 内の変数 x はホイストされますが、代入 var x = 2; になるまで初期化されません。したがって、console.log(x); の場合、を実行すると、ローカル x は宣言されていますが、まだ割り当てられていないため、unknown が出力されます。


14. 次のコードの出力は何になりますか?

console.log(0.1 + 0.2 === 0.3); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

答え:

出力: 99

説明: a と b は両方ともメモリ内の同じ配列を参照します。 b[0] を変更すると、両方とも同じ配列を参照するため、a[0] も変更することになります。


15. 次のコードの出力は何になりますか?

const a = {};
const b = { key: 'b' };
const c = { key: 'c' };

a[b] = 123; // What happens here?
console.log(a[b]); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

答え:

  • 最初のコンソールログ: "123"
  • 2 番目の console.log: "33"

説明:

  • 1、2、3 では、JavaScript は 1 を文字列に変換して連結し、その結果、「12」、次に「123」になります。
  • 1 2 "3" では、JavaScript は最初に 3 (数値) に等しい 1 2 を評価し、次に "3" を連結して "33" となります。

16. 次のコードの出力は何になりますか?

const arr = [1, 2, 3];
arr[10] = 11;
console.log(arr.length); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

答え:

出力: []

説明: 配列の長さプロパティを 0 に設定すると、実質的に配列がクリアされます。したがって、arr は空の配列になりました。


17. 次のコードの出力は何になりますか?

let x = 1;
let y = 2;

const obj = {
    x: 10,
    y: 20,
    sum: function() {
        return this.x + this.y;
    }
};

console.log(obj.sum()); // Output?
console.log(obj.sum.call({ x: 100, y: 200 })); // Output?
console.log(obj.sum.apply({ x: 1000, y: 2000 })); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

答え:

出力: 2

説明: 内部関数は呼び出されると、独自の変数 2 を持ちます。 innerFunc() を呼び出すと、内部のローカル変数 a を参照するため、2 が記録されます。


18. 次のコードの出力は何になりますか?

console.log(1 + '1'); // Output?
console.log(1 - '1'); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

答え:

出力: 3

説明: c メソッドは obj に対して呼び出されるため、メソッド内の this は obj を参照します。したがって、obj.a と obj.b の合計である 3 が出力されます。


19. 次のコードの出力は何になりますか?

const foo = () => {
    console.log(this);
};

foo(); // Output?
ログイン後にコピー
ログイン後にコピー

答え:

  • 最初の console.log: false
  • 2 番目の console.log: true

説明:

  • 最初のステートメントは、浮動小数点精度の問題により false を返します (0.1 0.2 は 0.30000000000000004 に等しい)。
  • 2 番目のステートメントは、toFixed(1) を使用して 0.1 0.2 を 0.3 に丸め、それを数値に戻します。その結果、比較結果は 0.3 === 0.3 となり、これは true です。

20. 次のコードの出力は何になりますか?

console.log(typeof null); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

答え:

出力: グローバル オブジェクト (または厳密モードでは未定義)

説明: 非厳密モードでは、グローバル コンテキストで呼び出される関数内の this の値はグローバル オブジェクト (つまり、ブラウザーのウィンドウまたは Node.js のグローバル) です。厳密モードでは、これは未定義になります。

21. 次のコードの出力は何になりますか?

console.log(0.1 + 0.2 === 0.3); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

答え:

  • 最初のコンソールログ: 2
  • 2 番目のコンソール.ログ: 1

説明:

  • Object.assign(obj3, obj2) はプロパティを obj2 から obj3 にコピーするため、obj3.a は 2 になります。
  • obj3.__proto__ は、値 1 のプロパティ a を持つ obj1 を参照します。

22. 次のコードの出力は何になりますか?

const a = {};
const b = { key: 'b' };
const c = { key: 'c' };

a[b] = 123; // What happens here?
console.log(a[b]); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

答え:

出力: 3

説明: 内部関数では、a は外部関数で定義された変数を参照します。 inner が呼び出されると、a は 2 から 3 に増分され、ログに記録されます。


23. 次のコードの出力は何になりますか?

const arr = [1, 2, 3];
arr[10] = 11;
console.log(arr.length); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

答え:

出力: こんにちは、私の名前は未定義です

説明: コンテキストなしで (つまり、person のメソッドとしてではなく) 挨拶が呼び出された場合、これは person にバインドされません。非厳密モードでは、これはデフォルトでグローバル オブジェクトになり、名前がグローバル オブジェクトで定義されていないため、未定義のログが記録されます。


24. 次のコードの出力は何になりますか?

let x = 1;
let y = 2;

const obj = {
    x: 10,
    y: 20,
    sum: function() {
        return this.x + this.y;
    }
};

console.log(obj.sum()); // Output?
console.log(obj.sum.call({ x: 100, y: 200 })); // Output?
console.log(obj.sum.apply({ x: 1000, y: 2000 })); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

答え:

  • 最初の console.log: true
  • 2 番目の console.log: true

説明:

  • console.log([1] == true) の場合、配列 [1] はプリミティブ型に変換され、結果は 1 になり、1 == true は true になります。
  • console.log([0] == false) の場合、配列 [0] は 0 に変換され、0 == false も true になります。

25. 次のコードの出力は何になりますか?

console.log(1 + '1'); // Output?
console.log(1 - '1'); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

答え:

  • 最初の foo(): 1
  • 2 番目の foo(): 2
  • 3 番目の foo(): 3

説明: foo 関数は count 変数の周囲のクロージャを維持し、foo が呼び出されるたびにインクリメントされ、呼び出し間でその状態を保持します。


26. 次のコードの出力は何になりますか?

console.log(typeof null); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

答え:

出力:

  • 最初の console.log(a): 1
  • 2 番目の console.log(b): 2
  • 3 番目の console.log(c): 3

説明: a は、クロージャのため 2 番目の関数でアクセスできます。 b も、最初に定義されているようにアクセスできます。 c は秒に対してローカルであるため、3 つの変数はすべて正しくログに記録されます。


27. 次のコードの出力は何になりますか?

console.log(0.1 + 0.2 === 0.3); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

答え:

出力: 3

説明: call メソッドは、このように newObj でインクリメントを呼び出すため、this.num は newObj.num を参照します。インクリメント操作により、newObj.num が 2 から 3 に変更されます。


28. 次のコードの出力は何になりますか?

const a = {};
const b = { key: 'b' };
const c = { key: 'c' };

a[b] = 123; // What happens here?
console.log(a[b]); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

答え:

出力:

const arr = [1, 2, 3];
arr[10] = 11;
console.log(arr.length); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

説明: ホイストのため、setTimeout 関数はすべて同じ i 変数を参照しています。タイムアウトが実行されると、i はすでに 4 に増分されており、その結果、4 が 3 回ログに記録されます。


29. 次のコードの出力は何になりますか?

let x = 1;
let y = 2;

const obj = {
    x: 10,
    y: 20,
    sum: function() {
        return this.x + this.y;
    }
};

console.log(obj.sum()); // Output?
console.log(obj.sum.call({ x: 100, y: 200 })); // Output?
console.log(obj.sum.apply({ x: 1000, y: 2000 })); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

答え:

  • 配列: [1、2、3]
  • 新しい配列: [2、3、4]

説明: マップ関数は、各項目に適用された変換に基づいて新しい配列を作成します。元の配列は変更されませんが、newArray は増分を反映します。


30. 次のコードの出力は何になりますか?

console.log(1 + '1'); // Output?
console.log(1 - '1'); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

答え:

出力: 出力は foo が呼び出されるコンテキストによって異なりますが、グローバル コンテキストにある場合は、グローバル オブジェクト (ブラウザーのウィンドウまたは Node.js のグローバル) をログに記録します。

説明: アロー関数では、これは字句的に制限されており、周囲のコンテキストからの this 値を使用します。 foo がグローバル スコープで呼び出された場合、これはグローバル オブジェクトを参照します。


31. 次のコードの出力は何になりますか?

const foo = () => {
    console.log(this);
};

foo(); // Output?
ログイン後にコピー
ログイン後にコピー

答え:

出力: 42

説明: 内部関数はアロー関数であり、これをメソッド関数のコンテキストに字句的にバインドします。したがって、this.value は obj.value、つまり 42.

を参照します。

32. 次のコードの出力は何になりますか?

function createCounter() {
    let count = 0;
    return {
        increment: function() {
            count++;
            return count;
        },
        decrement: function() {
            count--;
            return count;
        },
        getCount: function() {
            return count;
        }
    };
}

const counter = createCounter();
console.log(counter.increment()); // Output?
console.log(counter.increment()); // Output?
console.log(counter.getCount());  // Output?
console.log(counter.decrement()); // Output?
console.log(counter.getCount());  // Output?
ログイン後にコピー

答え:

出力: ReferenceError

説明: 変数 x は myFunction 内でホイストされます。これは、変数 x が関数スコープ内に存在しますが、console.log(x) の後まで初期化されないことを意味します。 x 変数は宣言前にアクセスされるため、ReferenceError が発生します。


33. 次のコードの出力は何になりますか?

console.log(typeof null); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

答え:

出力: こんにちは、未定義です

説明: 明示的なコンテキストなしでgreetが呼び出された場合、これはobjを参照しないため、this.nameは未定義です。


34. 次のコードの出力は何になりますか?

console.log(0.1 + 0.2 === 0.3); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

答え:

出力: 数値

説明: JavaScript では、NaN (Not-a-Number) は数値型とみなされ、typeof NaN は「数値」を返します。


35. 次のコードの出力は何になりますか?

const a = {};
const b = { key: 'b' };
const c = { key: 'c' };

a[b] = 123; // What happens here?
console.log(a[b]); // Output?
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

答え:

出力: [1, 2, 3, 4]

説明: a と b は両方ともメモリ内の同じ配列を参照します。 4 を b に押し込むと、a にも影響します。

Top Challenging and hardest javascript technical interview questions with solutions.

以上がトップの挑戦的で最も難しいJavaScript技術面接の質問とその解決策。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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 11, 2025 am 12:07 AM

JavaScriptの文字列文字を交換します

jQuery日付が有効かどうかを確認します jQuery日付が有効かどうかを確認します Mar 01, 2025 am 08:51 AM

jQuery日付が有効かどうかを確認します

jQueryは要素のパディング/マージンを取得します jQueryは要素のパディング/マージンを取得します Mar 01, 2025 am 08:53 AM

jQueryは要素のパディング/マージンを取得します

10 jQuery Accordionsタブ 10 jQuery Accordionsタブ Mar 01, 2025 am 01:34 AM

10 jQuery Accordionsタブ

10 jqueryプラグインをチェックする価値があります 10 jqueryプラグインをチェックする価値があります Mar 01, 2025 am 01:29 AM

10 jqueryプラグインをチェックする価値があります

ノードとHTTPコンソールを使用したHTTPデバッグ ノードとHTTPコンソールを使用したHTTPデバッグ Mar 01, 2025 am 01:37 AM

ノードとHTTPコンソールを使用したHTTPデバッグ

カスタムGoogle検索APIセットアップチュートリアル カスタムGoogle検索APIセットアップチュートリアル Mar 04, 2025 am 01:06 AM

カスタムGoogle検索APIセットアップチュートリアル

jQueryはscrollbarをdivに追加します jQueryはscrollbarをdivに追加します Mar 01, 2025 am 01:30 AM

jQueryはscrollbarをdivに追加します

See all articles