當前位置:
首頁 > 最新 > 連載五:乾貨《8步神曲》可以反問面試官的NodeJS面試題

連載五:乾貨《8步神曲》可以反問面試官的NodeJS面試題

1. js裡邊的this指的是什麼?

this指的是對象本身,而不是構造函數.

代碼演示

function Person {

}

var person1 = new Person;

person1.name = "michaelqin";

person1.sayName; // michaelqin

2. js里的作用域是什麼樣子的?

大多數語言裡邊都是塊作作用域,以{}進行限定,js裡邊不是.js裡邊叫函數作用域,就是一個變數在全函數里有效.比如有個變數p1在函數最後一行定義,第一行也有效,但是值是undefined.

代碼演示

var globalVar = "global var";

function test {

alert(globalVar); // undefined,因為globalVar在本函數內被重定義了,導致全局失效,這裡使用函數內的變數值,可是此時還沒定義

var globalVar = "overrided var"; //globalVar在本函數內被重定義

alert(globalVar);// overrided var

}

alert(globalVar); // global var,使用全局變數

3. caller, callee和arguments分別是什麼?

caller,callee之間的關係就像是employer和employee之間的關係,就是調用與被調用的關係,二者返回的都是函數對象引用.arguments是函數的所有參數列表,它是一個類數組的變數.

代碼演示

function parent(param1, param2, param3) {

child(param1, param2, param3);

}

function child {

console.log(arguments); // { "0": "mqin1", "1": "mqin2", "2": "mqin3" }

console.log(arguments.callee); // [Function: child]

console.log(child.caller); // [Function: parent]

}

parent("mqin1", "mqin2", "mqin3");

4. apply, call和bind有什麼區別?

三者都可以把一個函數應用到其他對象上,注意不是自身對象.apply,call是直接執行函數調用,bind是綁定,執行需要再次調用.apply和call的區別是apply接受數組作為參數,而call是接受逗號分隔的無限多個參數列表,

代碼演示

function Person {

}

var obj = ; //注意這是一個普通對象,它不是Person的實例

1) apply

Person.prototype.sayName.apply(obj, [param1, param2, param3]);

2) call

3) bind

sn([param1, param2, param3]); // bind需要先綁定,再執行

sn(param1, param2, param3); // bind需要先綁定,再執行

5.什麼是閉包,閉包有哪些用處?

閉包這個術語,,兩個字函數,更多字嵌套函數的父子自我引用關係.所有函數都是閉包.通俗的說,閉包就是作用域範圍,因為js是函數作用域,所以函數就是閉包.全局函數的作用域範圍就是全局,所以無須討論.更多的應用其實是在內嵌函數,這就會涉及到內嵌作用域,或者叫作用域鏈.說到內嵌,其實就是父子引用關係(父函數包含子函數,子函數因為函數作用域又引用父函數,這它媽不是死結嗎?所以叫閉包),這就會帶來另外一個問題,什麼時候引用結束?如果不結束,就會一直佔用內存,引起內存泄漏.好吧,不用的時候就引用設為空,死結就解開了.

6. defineProperty, hasOwnProperty, isEnumerable的作用?

Object.defineProperty(obj, prop, descriptor)用來給對象定義屬性,有value,writable,configurable,enumerable,set/get等。

hasOwnProerty用於檢查某一屬性是不是存在於對象本身,繼承來的父親的屬性不算。

isEnumerable用來檢測某一屬性是否可遍歷,也就是能不能用for..in循環來取到。

7. js常用設計模式的實現思路,單例,工廠,代理,裝飾,觀察者模式等

1)單例:任意對象都是單例,無須特別處理

var obj = ;

2)工廠:就是同樣形式參數返回不同的實例

function Person { this.name = "Person1"; }

function Animal { this.name = "Animal1"; }

function Factory {}

return eval("new " + className + "");

}

var factory = new Factory;

var obj1 = factory.getInstance("Person");

var obj2 = factory.getInstance("Animal");

console.log(obj1.name); // Person1

console.log(obj2.name); // Animal1

3)代理:就是新建個類調用老類的介面,包一下

function Person { }

function PersonProxy {

this.person = new Person;

var that = this;

this.callMethod = function(functionName) {

console.log("before proxy:", functionName);

that.person[functionName]; //代理

console.log("after proxy:", functionName);

}

}

var pp = new PersonProxy;

pp.callMethod("sayName"); //代理調用Person的方法sayName

pp.callMethod("sayAge"); //代理調用Person的方法sayAge

4)觀察者:就是事件模式,比如按鈕的onclick這樣的應用.

function Publisher {

this.listeners = ;

}

Publisher.prototype = {

"addListener": function(listener) {

},

"removeListener": function(listener) {

delete this.listeners[listener];

},

"notify": function(obj) {

var listener = this.listeners[i];

if (typeof listener !== "undefined") {

listener.process(obj);

}

}

}

}; //發布者

function Subscriber {

}

Subscriber.prototype = {

"process": function(obj) {

console.log(obj);

}

};//訂閱者

var publisher = new Publisher;

publisher.addListener(new Subscriber);

publisher.addListener(new Subscriber);

publisher.notify(); //發布一個對象到所有訂閱者

publisher.notify("2 subscribers will both perform process"); //發布一個字元串到所有訂閱者

8.列舉數組相關的常用方法

push/pop,

shift/unshift,

split/join,

slice/splice/concat,

sort/reverse,

map/reduce,

forEach,

Filter

每日8步神曲,祝你早日高薪!


開心一角:

同學,你上課吃個糖、瓜子也就罷了,你拿個比手臂還長的甘蔗吃,老師突然覺得心好累,勸誡談話也已經多次了,為師想丟個粉筆提醒你,還怕你丟回根甘蔗……


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 IT有些事兒 的精彩文章:

連載一:乾貨《8步神曲》可以反問面試官的NodeJS面試題

TAG:IT有些事兒 |