ホームページ ウェブフロントエンド jsチュートリアル 知っておくべきJavaScript面接の23の質問

知っておくべきJavaScript面接の23の質問

May 16, 2016 pm 03:23 PM
javascript 面接の質問

知っておくべきJavaScript面接の23の質問

1. bar がオブジェクトかどうかを判断するために typeof bar === "object" を使用する場合、潜在的な欠点がいくつかあります。この欠点を回避するにはどうすればよいでしょうか?

typeof を使用する場合の欠点は明らかです (この欠点は、instanceof を使用する場合と同じです):

let obj = {};
let arr = [];
 
console.log(typeof obj === 'object'); //true
console.log(typeof arr === 'object'); //true
console.log(typeof null === 'object'); //true
ログイン後にコピー

上記の出力結果から、typeof bar = == "object" ではありません bar がオブジェクトであるかどうかを正確に判断できません。この欠点は、 Object.prototype.toString.call(bar) === "[object Object]":

let obj = {};
let arr = [];
 
console.log(Object.prototype.toString.call(obj)); //[object Object]
console.log(Object.prototype.toString.call(arr)); //[object Array]
console.log(Object.prototype.toString.call(null)); //[object Null]
ログイン後にコピー

で回避できます。また、命を大切にするために、 == には近づかないでください。 :

And [] === false は false を返します。

おすすめ関連記事: 2020年JS面接質問集(最新)

2. 次のコードはコンソールにメッセージを出力しますか?なぜ?

(function(){
 var a = b = 3;
})();
 
console.log("a defined? " + (typeof a !== 'undefined'));
console.log("b defined? " + (typeof b !== 'undefined'));
ログイン後にコピー

これは変数スコープに関連しており、出力は次のように変更されます:

console.log(b); //3
console,log(typeof a); //undefined
ログイン後にコピー

自己実行関数内の変数割り当てを逆アセンブルします。 >

b = 3;
var a = b;
ログイン後にコピー
つまり、b はグローバル変数になり、a は自己実行関数のローカル変数になります。

3. 次のコードはコンソールにメッセージを出力しますか?なぜ?

var myObject = {
 foo: "bar",
 func: function() {
 var self = this;
 console.log("outer func: this.foo = " + this.foo);
 console.log("outer func: self.foo = " + self.foo);
 (function() {
 console.log("inner func: this.foo = " + this.foo);
 console.log("inner func: self.foo = " + self.foo);
 }());
ログイン後にコピー
ES6 より前の JavaScript には関数スコープしかなく、func の IIFE には独自の独立したスコープがあり、Self を実行できます。外部スコープがアクセスされるため、アクセス可能なスコープでは定義されていないため、3 番目の出力はエラーを報告し、4 番目の出力は bar です。クロージャを知っている場合は、簡単に解決できます:

function(test) {
 console.log("inner func: this.foo = " + test.foo); //'bar'
 console.log("inner func: self.foo = " + self.foo);
}(self));
ログイン後にコピー
クロージャに詳しくない場合は、次の記事を参照してください: スコープ チェーンからのクロージャについて説明する

4. JavaScript コードを変換する 関数ブロックにコードを含めるとはどういう意味ですか?なぜこれを行うのでしょうか?

言い換えると、なぜ即時呼び出し関数式を使用するのでしょうか?

IIFE には 2 つの古典的な使用シナリオがあります。1 つはループでデータ項目を定期的に出力することに似ており、もう 1 つは JQuery/Node プラグインおよびモジュール開発に似ています。

for(var i = 0; i < 5; i++) {
 setTimeout(function() {
 console.log(i);
 }, 1000);
}
ログイン後にコピー
上記の出力は、思ったように 0、1、2、3、4 ではありませんが、出力はすべて 5 であるため、IIFE が役立ちます。

for(var i = 0; i < 5; i++) {
 (function(i) {
 setTimeout(function() {
 console.log(i);
 }, 1000);
 })(i)
}
ログイン後にコピー
In JQuery/Node プラグインとモジュールの開発は、変数汚染を避けるために、大きな IIFE です:

(function($) {
 //代码
 } )(jQuery);
ログイン後にコピー

5. JavaScript を厳密モードで実行します ('厳密を使用') ) 開発のメリットは何ですか?

JavaScript 構文の不合理で不正確な部分を削除し、奇妙な動作を削減します。

コード実行の安全でない部分を削除し、コード実行の安全性を確保します。

コンパイラの効率を向上させ、実行速度を向上させます。

将来の Javascript の新しいバージョンへの道を開きます。

6. 次の 2 つの関数の戻り値は同じですか?なぜ?

1 つ目は、最初にパワーを上げてからパワーを下げることです。

function add(num1, num2){
 let r1, r2, m;
 r1 = (&#39;&#39;+num1).split(&#39;.&#39;)[1].length;
 r2 = (&#39;&#39;+num2).split(&#39;.&#39;)[1].length;
 
 m = Math.pow(10,Math.max(r1,r2));
 return (num1 * m + num2 * m) / m;
}
console.log(add(0.1,0.2)); //0.3
console.log(add(0.15,0.2256)); //0.3756
ログイン後にコピー
2 つ目は、組み込みの toPrecision() メソッドと toFixed() メソッドを使用することです。メソッドの戻り値の文字列に注意してください。

function add(x, y) {
 return x.toPrecision() + y.toPrecision()
}
console.log(add(0.1,0.2)); //"0.10.2"
ログイン後にコピー

7. x が整数であるかどうかを判断する関数 isInteger(x) を実装します。

x を 10 進数に変換し、次と等しいかどうかを判断できます。それ自体です:

function isInteger(x) {
 return parseInt(x, 10) === x;
}
ログイン後にコピー
ES6 は数値を拡張し、パラメーターが整数であるかどうかを判断する静的メソッド isInteger() を提供します:

Number.isInteger(25) // true
Number.isInteger(25.0) // true
Number.isInteger(25.1) // false
Number.isInteger("15") // false
Number.isInteger(true) // false
ログイン後にコピー
整数の範囲JavaScript が正確に表現できる値は -2^53 ~ 2^53 (2 つのエンドポイントを除く) であり、この範囲を超えると値を正確に表現できません。 ES6 では、この範囲の上限と下限を表す 2 つの定数 Number.MAX_SAFE_INTEGER と Number.MIN_SAFE_INTEGER が導入され、整数が安全な整数かどうかを判断する Number.isSafeInteger() が提供されました。

8. 次のコードでは、1 ~ 4 の数字はどのような順序で出力されますか?なぜこのように出力されるのでしょうか?

(function() {
 console.log(1);
 setTimeout(function(){console.log(2)}, 1000);
 setTimeout(function(){console.log(3)}, 0);
 console.log(4);
})();
ログイン後にコピー
ログイン後にコピー
これについてはあまり説明しません。主に JavaScript のタイミング メカニズムとタイム ループについてです。JavaScript はシングルスレッドであることを忘れないでください。詳しい説明は setTimeout からの JavaScript 実行機構の話 を参照してください。

9. 文字列が回文文字列であるかどうかを判断するための 80 文字未満の関数を作成します。

function isPalindrome(str) {
 str = str.replace(/\W/g, &#39;&#39;).toLowerCase();
 return (str == str.split(&#39;&#39;).reverse().join(&#39;&#39;));
}
ログイン後にコピー
ログイン後にコピー
codewars でこの質問に遭遇し、いくつかの良い解決策が含まれています。ここ: Palindrome For Your Dome

10. 次の方法で呼び出されたときに正常に動作する sum メソッドを作成します

console.log(sum(2,3)); // Outputs 5
console.log(sum(2)(3)); // Outputs 5
ログイン後にコピー
ログイン後にコピー
この質問は解決できますパラメータの数を判断します:

function sum() {
 var fir = arguments[0];
 if(arguments.length === 2) {
 return arguments[0] + arguments[1]
 } else {
 return function(sec) {
 return fir + sec;
 }
 }
  
}
ログイン後にコピー
ログイン後にコピー

11. 以下のコード スニペットに基づいて次の質問に答えます。

for (var i = 0; i < 5; i++) {
 var btn = document.createElement(&#39;button&#39;);
 btn.appendChild(document.createTextNode(&#39;Button &#39; + i));
 btn.addEventListener(&#39;click&#39;, function(){ console.log(i); });
 document.body.appendChild(btn);
}
ログイン後にコピー
1. ボタン 4 をクリックします。コンソールに出力されるのでしょうか?

5 つのボタンのいずれかをクリックすると、5

2 が出力されます。

IIFE を参照してください。

12. 次のコードは何を出力しますか?なぜ?

var arr1 = "john".split(&#39;&#39;); j o h n
var arr2 = arr1.reverse(); n h o j
var arr3 = "jones".split(&#39;&#39;); j o n e s
arr2.push(arr3);
console.log("array 1: length=" + arr1.length + " last=" + arr1.slice(-1));
console.log("array 2: length=" + arr2.length + " last=" + arr2.slice(-1));
ログイン後にコピー
何が出力されるでしょうか?実行してみるとわかりますが、意外かもしれません。

reverse() は配列自体を変更し、元の配列への参照を返します。

slice の使用方法については、slice

13 を参照してください。13. 次のコードは何を出力しますか?なぜ?

console.log(1 + "2" + "2");
console.log(1 + +"2" + "2");
console.log(1 + -"1" + "2");
console.log(+"1" + "1" + "2");
console.log( "A" - "B" + "2");
console.log( "A" - "B" + 2);
ログイン後にコピー

输出什么,自己去运行吧,需要注意三个点:

多个数字和数字字符串混合运算时,跟操作数的位置有关

console.log(2 + 1 + &#39;3&#39;); / /‘33&#39;
console.log(&#39;3&#39; + 2 + 1); //&#39;321&#39;
ログイン後にコピー

数字字符串之前存在数字中的正负号(+/-)时,会被转换成数字

console.log(typeof &#39;3&#39;); // string
console.log(typeof +&#39;3&#39;); //number
ログイン後にコピー

同样,可以在数字前添加 '',将数字转为字符串

console.log(typeof 3); // number
console.log(typeof (&#39;&#39;+3)); //string
ログイン後にコピー

对于运算结果不能转换成数字的,将返回 NaN

console.log(&#39;a&#39; * &#39;sd&#39;); //NaN
console.log(&#39;A&#39; - &#39;B&#39;); // NaN
ログイン後にコピー

14、什么是闭包?举例说明

可以参考此篇:从作用域链谈闭包

15、下面的代码会输出什么?为啥?

for (var i = 0; i < 5; i++) {
 setTimeout(function() { console.log(i); }, i * 1000 );
}
ログイン後にコピー

请往前面翻,参考第4题,解决方式已经在上面了

16、解释下列代码的输出

console.log("0 || 1 = "+(0 || 1));
console.log("1 || 2 = "+(1 || 2));
console.log("0 && 1 = "+(0 && 1));
console.log("1 && 2 = "+(1 && 2));
ログイン後にコピー

逻辑与和逻辑或运算符会返回一个值,并且二者都是短路运算符:

逻辑与返回第一个是 false 的操作数 或者 最后一个是 true的操作数

console.log(1 && 2 && 0); //0
console.log(1 && 0 && 1); //0
console.log(1 && 2 && 3); //3
ログイン後にコピー

如果某个操作数为 false,则该操作数之后的操作数都不会被计算

逻辑或返回第一个是 true 的操作数 或者 最后一个是 false的操作数

console.log(1 || 2 || 0); //1
console.log(0 || 2 || 1); //2
console.log(0 || 0 || false); //false
ログイン後にコピー

如果某个操作数为 true,则该操作数之后的操作数都不会被计算

如果逻辑与和逻辑或作混合运算,则逻辑与的优先级高:

console.log(1 && 2 || 0); //2
console.log(0 || 2 && 1); //1
console.log(0 && 2 || 1); //1
ログイン後にコピー

在 JavaScript,常见的 false 值:

0, '0', +0, -0, false, '',null,undefined,null,NaN

要注意空数组([])和空对象({}):

console.log([] == false) //true
console.log({} == false) //false
console.log(Boolean([])) //true
console.log(Boolean({})) //true
ログイン後にコピー

所以在 if 中,[] 和 {} 都表现为 true:

17、解释下面代码的输出

console.log(false == &#39;0&#39;)
console.log(false === &#39;0&#39;)
ログイン後にコピー

18、解释下面代码的输出

var a={},
 b={key:&#39;b&#39;},
 c={key:&#39;c&#39;};
 
a[b]=123;
a[c]=456;
 
console.log(a[b]);
输出是456。
ログイン後にコピー

19、在下面的代码中,数字 1-4 会以什么顺序输出?为什么会这样输出?

(function() {
 console.log(1);
 setTimeout(function(){console.log(2)}, 1000);
 setTimeout(function(){console.log(3)}, 0);
 console.log(4);
})();
ログイン後にコピー
ログイン後にコピー

这个就不多解释了,主要是 JavaScript 的定时机制和时间循环,不要忘了,JavaScript 是单线程的。详解可以参考 从setTimeout谈JavaScript运行机制。

20、写一个少于 80 字符的函数,判断一个字符串是不是回文字符串

function isPalindrome(str) {
 str = str.replace(/\W/g, &#39;&#39;).toLowerCase();
 return (str == str.split(&#39;&#39;).reverse().join(&#39;&#39;));
}
ログイン後にコピー
ログイン後にコピー

这个题我在 codewars 上碰到过,并收录了一些不错的解决方式,可以戳这里:Palindrome For Your Dome

21、写一个按照下面方式调用都能正常工作的 sum 方法

console.log(sum(2,3)); // Outputs 5
console.log(sum(2)(3)); // Outputs 5
ログイン後にコピー
ログイン後にコピー

针对这个题,可以判断参数个数来实现:

function sum() {
 var fir = arguments[0];
 if(arguments.length === 2) {
 return arguments[0] + arguments[1]
 } else {
 return function(sec) {
 return fir + sec;
 }
 }
  
}
ログイン後にコピー
ログイン後にコピー

22、解释下面代码的输出,并修复存在的问题

var hero = {
 _name: &#39;John Doe&#39;,
 getSecretIdentity: function (){
 return this._name;
 }
};
 
var stoleSecretIdentity = hero.getSecretIdentity;
 
console.log(stoleSecretIdentity());
console.log(hero.getSecretIdentity());
ログイン後にコピー

将 getSecretIdentity 赋给 stoleSecretIdentity,等价于定义了 stoleSecretIdentity 函数:

var stoleSecretIdentity = function (){
 return this._name;
}
stoleSecretIdentity
ログイン後にコピー

的上下文是全局环境,所以第一个输出 undefined。若要输出 John Doe,则要通过 call 、apply 和 bind 等方式改变 stoleSecretIdentity 的this 指向(hero)。

第二个是调用对象的方法,输出 John Doe。

23、给你一个 DOM 元素,创建一个能访问该元素所有子元素的函数,并且要将每个子元素传递给指定的回调函数。

函数接受两个参数:

DOM

指定的回调函数

原文利用 深度优先搜索(Depth-First-Search) 给了一个实现:

function Traverse(p_element,p_callback) {
 p_callback(p_element);
 var list = p_element.children;
 for (var i = 0; i < list.length; i++) {
 Traverse(list[i],p_callback); // recursive call
 }
}
ログイン後にコピー

相关学习推荐:javascript视频教程

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

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 Dec 17, 2023 pm 02:54 PM

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 はじめに: 技術の継続的な発展により、音声認識技術は人工知能の分野の重要な部分になりました。 WebSocket と JavaScript をベースとしたオンライン音声認識システムは、低遅延、リアルタイム、クロスプラットフォームという特徴があり、広く使用されるソリューションとなっています。この記事では、WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法を紹介します。

WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー Dec 17, 2023 pm 05:30 PM

WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 Dec 17, 2023 pm 12:09 PM

JavaScript と WebSocket を使用してリアルタイム オンライン注文システムを実装する方法の紹介: インターネットの普及とテクノロジーの進歩に伴い、ますます多くのレストランがオンライン注文サービスを提供し始めています。リアルタイムのオンライン注文システムを実装するには、JavaScript と WebSocket テクノロジを使用できます。 WebSocket は、TCP プロトコルをベースとした全二重通信プロトコルで、クライアントとサーバー間のリアルタイム双方向通信を実現します。リアルタイムオンラインオーダーシステムにおいて、ユーザーが料理を選択して注文するとき

WebSocketとJavaScriptを使ったオンライン予約システムの実装方法 WebSocketとJavaScriptを使ったオンライン予約システムの実装方法 Dec 17, 2023 am 09:39 AM

WebSocket と JavaScript を使用してオンライン予約システムを実装する方法 今日のデジタル時代では、ますます多くの企業やサービスがオンライン予約機能を提供する必要があります。効率的かつリアルタイムのオンライン予約システムを実装することが重要です。この記事では、WebSocket と JavaScript を使用してオンライン予約システムを実装する方法と、具体的なコード例を紹介します。 1. WebSocket とは何ですか? WebSocket は、単一の TCP 接続における全二重方式です。

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 Dec 17, 2023 pm 05:13 PM

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を学びます。この記事では、具体的なコード例を通じて実装プロセスを説明します。私たちは

簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 Jan 05, 2024 pm 06:08 PM

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

JavaScriptでinsertBeforeを使用する方法 JavaScriptでinsertBeforeを使用する方法 Nov 24, 2023 am 11:56 AM

使用法: JavaScript では、insertBefore() メソッドを使用して、DOM ツリーに新しいノードを挿入します。このメソッドには、挿入される新しいノードと参照ノード (つまり、新しいノードが挿入されるノード) の 2 つのパラメータが必要です。

JavaScript で HTTP ステータス コードを簡単に取得する方法 JavaScript で HTTP ステータス コードを簡単に取得する方法 Jan 05, 2024 pm 01:37 PM

JavaScript で HTTP ステータス コードを取得する方法の紹介: フロントエンド開発では、バックエンド インターフェイスとの対話を処理する必要があることが多く、HTTP ステータス コードはその非常に重要な部分です。 HTTP ステータス コードを理解して取得すると、インターフェイスから返されたデータをより適切に処理できるようになります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法と、具体的なコード例を紹介します。 1. HTTP ステータス コードとは何ですか? HTTP ステータス コードとは、ブラウザがサーバーへのリクエストを開始したときに、サービスが

See all articles