5つの経典の先端面接問題は大丈夫ですか?

5318 ワード

JavaScript開発者のIT業界での需要はずっと大きいです.神という言葉に精通しているなら、転職して給料を上げる機会がたくさんあります.しかし、ある会社であなたを採用する前に、順調に面接に合格して、あなたのスキルを証明しなければなりません.本稿では、前の段階に関する5つの問題を示して、候補者のJavaScript技能と彼らの問題解決能力をテストします.あるととても面白いです.
問題1:Scopeの作用範囲
以下のコードを考慮します.
(function() {  
     var a = b = 5;
})();
console.log(b);
何がコンソールに印刷されますか?上記のコードを答えたら5をプリントします.この問題のコツは、ここで二つの変数宣言がありますが、aはキーワードvarを使って声明します.これは関数の局所変数です.これに対して、bはグローバル変数になります.この問題のもう一つのコツは、厳格なモードを使用していないことです.厳密なモードを有効にすると、コードはReferenceErrのエラーを引き起こします.Bは定義されていません.ハードモードでは、明確な指定が必要となり、グローバル変数宣言が実現されることを覚えてください.例えば、書くべきです.
(function() {  
     'use strict';  
     var a = window.b = 5;
})();
console.log(b);
問題2:「原生」の作成方法
文字列オブジェクトにrepeatfy機能を定義します.整数nが入力されると、n回の文字列が繰り返される結果が返されます.たとえば:
console.log('hello'.repeatify(3));
ハローハローを印刷します.一つの可能な実装に答えると以下のようになります.
String.prototype.repeatify = String.prototype.repeatify || function(times) {   
    var str = '';  
     for (var i = 0; i < times; i++) {      
        str += this;   
    }   
    return str;
};
 
現在の問題は開発者のJavaScript継承とprototypeに関する知識点をテストします.これはまた、開発者が内蔵オブジェクトを拡張する場合に知っているかどうかを検証しています.ここのもう一つのポイントは、定義されている機能を上書きしない方法を知ることです.この機能の定義をテストするまでは存在しません.
String.prototype.repeatify = String.prototype.repeatify || function(times) {/* code here */};
JavaScript関数の互換性を求められた時には、この技術は特に有用です.
問題3:声明の昇格(Hoisting)
このコードを実行して、どのような結果を出力しますか?
function test() {   
    console.log(a);   
    console.log(foo());  
     var a = 1;   
    function foo() {     
         return 2;   
    }
}
test();
このコードに答えた結果はundefinedと2です.理由は、変数と関数の宣言が前倒しされていますが、変数はどの値も割り当てられていません.したがって、変数を印刷するときは関数に存在しますが、それでもundefinedです.つまり、上のコードは以下の内容と同じです.
function test() {  
     var a;  
     function foo() {     
         return 2;   
    }    
    console.log(a);   
    console.log(foo());      
     a = 1;
}
test();
 
問題4:thisはJavaScriptの中でどのように働いていますか?
下のコードはどんな結果を出力しますか?答えをあげます.
var fullname = 'John Doe';
var obj = {  
    fullname: 'Colin Ihrig',   
    prop: {      
        fullname: 'Aurelio De Rosa',      
        getFullname: function() {         
            return this.fullname;      
        }   
    }
};
console.log(obj.prop.getFullname()); 
var test = obj.prop.getFullname; 
console.log(test());
 
答えはAurelioのRosaとJohn Doeです.理由は、一つの関数では、thisの挙動は、JavaScript関数の呼び出し方式と定義方式に依存し、それがどのように定義されているかを見るだけではないからです.最初のconsolie.log()呼び出しでは、get Fullname()は、Obj.propオブジェクトの関数として呼び出される.したがって、コンテキストは後者を指し、関数はオブジェクトのfullnameを返します.これに対して、get Fullname()がtest変数に割り当てられた場合、コンテキストはグローバルオブジェクト(window)を意味する.これは、testが暗黙的にグローバルオブジェクトに設定された属性であるためである.このため、この関数はwindowのfullnameに戻ります.つまり、1行目の値を定義します.
問題5:call()とappy()
今は前の問題を解決して、最後のconsolie.logs()にAurelioのRosaを印刷させます.この質問に対しては、強制的にcall()またはappy()を使うことで関数のコンテキストを変更することができます.下記ではcallを使いますが、この場合はapply()は同じ結果を出力します.
console.log(test.call(obj.prop));
結論
この文章では、JavaScriptの開発者をテストするための5つの古典的な問題について議論しました.面接の概念とテーマはよく似ています.知らない問題の答えなら、心配しなくてもいいです.勉強と経験はゆっくりと積み重ねられます.他に面白い問題があれば、迷わずに私たちと共有してください.多くの開発者を助けます.