連載五:乾貨《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步神曲,祝你早日高薪!
開心一角:
同學,你上課吃個糖、瓜子也就罷了,你拿個比手臂還長的甘蔗吃,老師突然覺得心好累,勸誡談話也已經多次了,為師想丟個粉筆提醒你,還怕你丟回根甘蔗……


※連載一:乾貨《8步神曲》可以反問面試官的NodeJS面試題
TAG:IT有些事兒 |