目次
问题一
質問 1
问题二
问题三
问题四
问题五
问题六
问题七
问题八
问题九
问题十
问题十一
问题十二
问题十三
问题十四
写在最后
ホームページ ウェブフロントエンド jsチュートリアル JavaScript の面接での 14 の厳しい質問に対するコード例の詳細な分析

JavaScript の面接での 14 の厳しい質問に対するコード例の詳細な分析

Mar 06, 2017 pm 02:49 PM

フロントエンド エンジニアは、面接中にある種の面接官に遭遇することがあります。彼らが尋ねる質問は、言語自体について非常に深刻であり、多くの場合、候補者が期待する実際的な質問ではありません (一部の候補者は、それができれば十分であると強調します。理由を知っているかどうかについては関係ありません)。このタイプの質問には論理はありませんが、受験者の javascript 言語に対する理解をある程度テストします。 javascript这门语言的理解。

突然想到这个话题是无聊在翻自己的Github,看看以前都写过什么丑货。然后翻到了这篇解释Javascript quiz的文章quiz-legend,反正没事儿,就想搬过来供大家学习、理解、背诵、批判。

问题一

(function(){
    return typeof arguments;//"object"
})();
ログイン後にコピー

arguments是一个Array-like对象,对应的就是传入函数的参数列表。你可以在任何函数中直接使用该变量。

typeof操作符只会返回string类型的结果。参照如下列表可知对应不同数据,typeof返回的值都是什么:

私が突然このトピックを思い出したのは、退屈していて、自分が以前にどんな醜いことを書いたかを確認するために Github を調べていたからです。そんなとき、JavaScript クイズを説明するこの記事のクイズ凡例を見つけました。とにかく、それでいいので、誰もが学び、理解し、暗唱し、批判できるようにここに移動したいと思いました。

質問 1

var f = function g(){ return 23; };
typeof g();//报错
ログイン後にコピー
ログイン後にコピー
arguments は、関数に渡されるパラメーター リストに対応する、配列のようなオブジェクトです。この変数は任意の関数で直接使用できます。
类型结果
undefined'undefined'
null'object'
Boolean'boolean'
Number'number'
String'string'
Symbol (new in ECMAScript 2015)'symbol'
Host object (provided by the JS environment)Implementation-dependent
Function object (implements [[Call]] in ECMA-262 terms)'function'
Any other object'object'
🎜 typeof 演算子は、string 型の結果のみを返します。さまざまなデータに対して typeof によって返される値が何であるかを確認するには、次のリストを参照してください: 🎜🎜< td align="left">番号🎜< td align="left">その他のオブジェクト🎜
入力結果
未定義🎜 '未定義'🎜🎜
null🎜'オブジェクト' 🎜🎜
ブール値🎜'boolean'🎜🎜
'number'🎜🎜
文字列</code >🎜<td align="left"><code>'string'🎜🎜
シンボル (ECMAScript 2015 の新機能)🎜< code>'symbol'🎜🎜
ホスト オブジェクト (JS 環境によって提供される)🎜実装に依存します🎜🎜< tr>関数オブジェクト (ECMA-262 用語で [[Call]] を実装)🎜'function'🎜🎜
'object'🎜🎜🎜🎜

由此我们推断出,typeof argumentsobject

问题二

var f = function g(){ return 23; };
typeof g();//报错
ログイン後にコピー
ログイン後にコピー

这是一个名字是g的function expression,然后又被赋值给了变量f

这里的函数名g和被其赋值的变量f有如下差异:

  • 函数名g不能变动,而变量f可以被重新赋值

  • 函数名g只能在函数体内部被使用,试图在函数外部使用g会报错的

问题三

(function(x){
    delete x;
    return x;//1
})(1);
ログイン後にコピー

delete操作符可以从对象中删除属性,正确用法如下:

delete object.property
delete object[&#39;property&#39;]
ログイン後にコピー

delete操作符只能作用在对象的属性上,对变量和函数名无效。也就是说delete x是没有意义的。

你最好也知道,delete是不会直接释放内存的,她只是间接的中断对象引用

问题四

var y = 1, x = y = typeof x; x;//"undefined"
ログイン後にコピー

我们试图分解上述代码成下面两步:

var y = 1; //step 1
var x = y = typeof x; //step 2
ログイン後にコピー

第一步应该没有异议,我们直接看第二步

  1. 赋值表达式从右向左执行

  2. y被重新赋值为typeof x的结果,也就是undefined

  3. x被赋值为右边表达式(y = typeof x)的结果,也就是undefined

问题五

(function f(f){
    return typeof f();//"number"
})(function(){ return 1; });
ログイン後にコピー

直接上注释解释:

(function f(f){
    //这里的f是传入的参数function(){ return 1; }
    //执行的结果自然是1
    return typeof f(); //所以根据问题一的表格我们知道,typeof 1结果是"number"
})(function(){ return 1; });
ログイン後にコピー

问题六

var foo = {
    bar: function() { return this.baz; },
    baz: 1
};

(function(){
    return typeof arguments[0]();//"undefined"
})(foo.bar);
ログイン後にコピー

这里你可能会误以为最终结果是number。向函数中传递参数可以看作是一种赋值,所以arguments[0]得到是是真正的bar函数的值,而不是foo.bar这个引用,那么自然this也就不会指向foo,而是window了。

问题七

var foo = {
    bar: function(){ return this.baz; },
    baz: 1
}
typeof (f = foo.bar)();//"undefined"
ログイン後にコピー

这和上一题是一样的问题,(f = foo.bar)返回的就是bar的值,而不是其引用,那么this也就指的不是foo了。

问题八

var f = (function f(){ return &#39;1&#39;; }, function g(){ return 2; })();
typeof f;//"number"
ログイン後にコピー

逗号操作符 对它的每个操作对象求值(从左至右),然后返回最后一个操作对象的值

所以(function f(){ return &#39;1&#39;; }, function g(){ return 2; })的返回值就是函数g,然后执行她,那么结果是2;最后再typeof 2,根据问题一的表格,结果自然是number

问题九

var x = 1;
if (function f(){}) {
    x += typeof f;
}
x;//"1undefined"
ログイン後にコピー

这个问题的关键点,我们在问题二中谈到过,function expression中的函数名f是不能在函数体外部访问的

问题十

var x = [typeof x, typeof y][1];
typeof typeof x;//"string"
ログイン後にコピー
  1. 因为没有声明过变量y,所以typeof y返回"undefined"

  2. typeof y的结果赋值给x,也就是说x现在是"undefined"

  3. 然后typeof x当然是"string"

  4. 最后typeof "string"的结果自然还是"string"

问题十一

(function(foo){
    return typeof foo.bar;//"undefined"
})({ foo: { bar: 1 } });
ログイン後にコピー

这是个纯粹的视觉诡计,上注释

(function(foo){

    //这里的foo,是{ foo: { bar: 1 } },并没有bar属性哦。
    //bar属性是在foo.foo下面
    //所以这里结果是"undefined"
    return typeof foo.bar;
})({ foo: { bar: 1 } });
ログイン後にコピー

问题十二

(function f(){
    function f(){ return 1; }
    return f();//2
    function f(){ return 2; }
})();
ログイン後にコピー

通过function declaration声明的函数甚至可以在声明之前使用,这种特性我们称之为hoisting。于是上述代码其实是这样被运行环境解释的:

(function f(){
    function f(){ return 1; }
    function f(){ return 2; }
    return f();
})();
ログイン後にコピー

问题十三

function f(){ return f; }
new f() instanceof f;//false
ログイン後にコピー

当代码new f()执行时,下面事情将会发生:

  1. 一个新对象被创建。它继承自f.prototype

  2. 构造函数f被执行。执行的时候,相应的传参会被传入,同时上下文(this)会被指定为这个新实例。new f等同于new f(),只能用在不传递任何参数的情况。

  3. 如果构造函数返回了一个“对象”,那么这个对象会取代整个new出来的结果。如果构造函数没有返回对象,那么new出来的结果为步骤1创建的对象,

ps:一般情况下构造函数不返回任何值,不过用户如果想覆盖这个返回值,可以自己选择返回一个普通对象来覆盖。当然,返回数组也会覆盖,因为数组也是对象。

于是,我们这里的new f()返回的仍然是函数f本身,而并非他的实例

问题十四

with (function(x, undefined){}) length;//2
ログイン後にコピー

with语句将某个对象添加的作用域链的顶部,如果在statement中有某個未使用命名空间的变量,跟作用域链中的某個属性同名,則這個变量将指向這個属性值。如果沒有同名的属性,则将拋出ReferenceError异常。

OK,现在我们来看,由于function(x, undefined){}是一个匿名函数表达式,是函数,就会有length属性,指的就是函数的参数个数。所以最终结果就是2

写在最后

有人觉得这些题坑爹,也有人觉得开阔了眼界,见仁见智吧。但有一件事是真的,无论你是否坚定的实践派,缺了理论基础,也铁定走不远 - 你永远不会见到哪个熟练的技术工人突然成了火箭专家。

看文档、读标准、结合实践,才是同志们的决胜之道。

以上就是关于14 个折磨人的 JavaScript 面试题的代码示例详细分析的内容,更多相关内容请关注PHP中文网(www.php.cn)!

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

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

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

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

JavaScript と WebSocket: 効率的なリアルタイム画像処理システムの構築 JavaScript と WebSocket: 効率的なリアルタイム画像処理システムの構築 Dec 17, 2023 am 08:41 AM

JavaScript は Web 開発で広く使用されているプログラミング言語であり、WebSocket はリアルタイム通信に使用されるネットワーク プロトコルです。 2 つの強力な機能を組み合わせることで、効率的なリアルタイム画像処理システムを構築できます。この記事では、JavaScript と WebSocket を使用してこのシステムを実装する方法と、具体的なコード例を紹介します。まず、リアルタイム画像処理システムの要件と目標を明確にする必要があります。リアルタイムの画像データを収集できるカメラ デバイスがあるとします。

See all articles