node.js面試

InterviewQuestions

some questions and answers


Q1:JS 繼承有哪幾種方式厘唾?

首先有兩個構(gòu)造函數(shù)Animal,Dog

function Animal(){
  this.species = 'animal';
}
      
function Dog(name,color){
  this.name = name;
  this.color = color;
}

我們要讓Dog繼承Animal的屬性画机。(通過utils.inherits只能繼承基于原型的屬性)

ANSWER:

1.構(gòu)造函數(shù)綁定

使用apply或者call方法

function Dog(name,color){
   Animal.apply(this,arguments);
  //Animal.call(this,name,color);
  this.name = name;
  this.color = color;
}
    
var lucky = new Dog('lucky','brown');
console.log(lucky.species; // animal'
2.prototype模式
Dog.prototype = new Animal();
Dog.prototype.constructor = Dog;
var lucky = new Dog('lucky','Brown');
console.log(lucky.species);

先將Dog的prototype對象指向一個Animal的實例,然后將prototype.constructor指向構(gòu)造函數(shù)Dog税肪,這樣就實現(xiàn)了繼承

3.直接繼承prototype
function Animal(){}
Animal.prototype.species = 'animal';

function Dog(name,color){
    this.name = name;
    this.color = color;
};

Dog.prototype = Animal.prototype;
Dog.prototype.constructor = Dog;
var lucky = new Dog('lucky','brown');
console.log(lucky.species);

這樣做的好處是效率高罐监,速度快沼撕,省內(nèi)存侧啼,但是Dog.prototype和Animal.prototype現(xiàn)在指向了同一個對象,修改Dog.prototype會直接修改Animal.prototype泪蔫。

4.利用空對象作為中介
var F = function(){};
F.prototype = Animal.prototype;
Dog.prototype = new F();
Dog.prototype.constructor = Dog;

console.log(Animal.prototype.constructor); //Animal
var lucky = new Dog('lucky','brown');
console.log(lucky.species); // animal
5.拷貝繼承
function extend(Child,Parent){
    var p = Parent.prototype;
    var c = Child.prototype;
    for(var i in p){
        c[i] = p[i];
    }
    c.uber = p;//為子對象留有可以訪問父對象的接口
}

function Dog(name,color){}

extend(Dog,Animal);
var lucky = new Dog('lucky','brown');
console.log(lucky.species); //animal

Q2:JS 嚴(yán)格模式跟普通模式的區(qū)別棒旗?

ANSWER:

1.在js文件中使用'use strict‘進入嚴(yán)格模式
  • 消除Javascript語法的一些不合理、不嚴(yán)謹(jǐn)之處撩荣,減少一些怪異行為;
  • 消除代碼運行的一些不安全之處铣揉,保證代碼運行的安全;
  • 提高編譯器效率餐曹,增加運行速度逛拱;
  • 為未來新版本的Javascript做好鋪墊。
2.會將拼寫錯誤轉(zhuǎn)成異常
'use strict';

var maxNumber = 100;
maxNumbre = 10;//ReferenceError
console.log(maxNumber);
3.全局變量顯式聲明

正常模式中台猴,一個變量未聲明直接賦值朽合,默認(rèn)是全局變量,嚴(yán)格模式中禁止這種用法饱狂,全局變量必須顯示聲明

'use strict';
v1 = 1;//error
4.禁用with旁舰,eval
5.禁止刪除聲明變量
'use strict';

var x;
delete x; //語法錯誤

Q3:V8垃圾回收機制

ANSWER:

V8使用是垃圾回收器(GC)進行回收,
具體信息可以參考下列文章:
1.阿里云團隊博客
2.Segmentfault


Q4:web后端緩存策略有哪些嗡官?

ANSWER:

1.利用redis(node-redis)或 memcached

在服務(wù)器與數(shù)據(jù)庫之間設(shè)置redis數(shù)據(jù)庫作為緩存介質(zhì)箭窜,在需要緩存的請求到達時,先檢查redis數(shù)據(jù)庫是否有衍腥,使用

var redis = require('redis').createClient();
redis.get('key',function (err,reply){
      //logic code
});

進行判斷磺樱,如果不存在,則從對應(yīng)數(shù)據(jù)庫獲取數(shù)據(jù)婆咸,然后將數(shù)據(jù)寫入redis數(shù)據(jù)庫竹捉,并設(shè)置過期時間。

var redis = require('redis').createClient();
redis.set('key','value');
redis.expire('key',1000);//ms
2.max-age和cache-control

主要針對靜態(tài)資源的緩存

response.setHeader('Cache-Control','public,max-age=3600');
3.etag

從req.headers里取'if-none-match',如果存在且hash值一致尚骄,返回304

var hashStr = "A hash string.";
var hash = require("crypto").createHash('sha1').update(hashStr).digest('base64');
require("http").createServer(function(req, res){  
    if(req.headers['if-none-match'] == hash){ 
        res.writeHead(304);
        res.end(); 
        return; 
    } 
    res.writeHead(200, { "Etag": hash }) 
    res.write(hashStr); res.end();
}).listen(9999);

這樣可以在輸出沒有變化的時候過濾請求块差,減輕服務(wù)器壓力。

4.CDN緩存

將圖片等數(shù)據(jù)放在CDN緩存倔丈,可以大大減輕自己服務(wù)器壓力憨闰,可以參考這個模塊express-cdn

參考資料:
Web開發(fā)后端緩存思路
Etag緩存
緩存策略


Q5:TCP與UDP的區(qū)別?

A:

1.TCP是面向鏈接的需五,雖然說網(wǎng)絡(luò)的不安全不穩(wěn)定特性決定了多少次握手都不能保證連接的可靠性鹉动,但TCP的三次握手在最低限度上(實際上也很大程度上保證了)保證了連接的可靠性;
  而UDP不是面向連接的,UDP傳送數(shù)據(jù)前并不與對方建立連接宏邮,對接收到的數(shù)據(jù)也不發(fā)送確認(rèn)信號泽示,發(fā)送端不知道數(shù)據(jù)是否會正確接收缸血,當(dāng)然也不用重發(fā),所以說UDP是無連接的械筛、不可靠的一種數(shù)據(jù)傳輸協(xié)議捎泻。
2.也正由于1所說的特點,使得UDP的開銷更小數(shù)據(jù)傳輸速率更高埋哟,因為不必進行收發(fā)數(shù)據(jù)的確認(rèn)族扰,所以UDP的實時性更好。

Q6:為什么選擇mocha這種測試框架定欧?

ANSWER:

  • 與node完美結(jié)合,可以在node端和瀏覽器端測試
  • 可以使用不同的斷言庫(chai,should等)
  • 異步方法測試簡單
  • 支持before,after等hook

mocha git
mocha測試

Q7:TDD/BDD分別是什么怒竿?

ANSWER:

TDD(測試驅(qū)動開發(fā))

即先寫測試用例砍鸠,再一一實現(xiàn)功能

BDD(行為驅(qū)動開發(fā))

先寫功能,再對功能進行測試耕驰,更貼近人類思維方式

Q8:閉包

ANSWER:

我理解的閉包就是外部函數(shù)獲取內(nèi)部函數(shù)私有屬性的一種方法爷辱,簡單的用下面的例子解釋一下:

function myHouse(){
  var __myname = 'Kevin';
  var getMyname = function(){
      return __myname;
  };
  return getMyname;
}

var getName = myHouse();
console.log(getName());//Kevin

即通過在myHouse()中返回getMyname函數(shù),getMyname函數(shù)中返回私有變量__myname朦肘,從而獲取私有變量饭弓,同時保護私有變量不會直接暴露給外部,以免改變私有變量值媒抠。

Q9:node.js跨域問題

ANSWER:

var express = require('express');
var app = express();//設(shè)置跨域訪問
app.all('*', function(req, res, next) { 
    res.header("Access-Control-Allow-Origin", "*"); //核心
    res.header("Access-Control-Allow-Headers", "X-Requested-With"); //核心
    res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS"); //核心
    res.header("X-Powered-By",' 3.2.1') ;
    res.header("Content-Type", "application/json;charset=utf-8"); next();
});
app.get('/auth/:id/:password', function(req, res) { 
    res.send({
        id:req.params.id, 
        name: req.params.password
    });
});
app.listen(3000);console.log('Listening on port 3000...');

還可以參考這個模塊:cors
參考:推酷

Q10:ES6新特性:

ANSWER:

這個寫的很不錯弟断,推薦閱讀
阮一峰的日志

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市趴生,隨后出現(xiàn)的幾起案子阀趴,更是在濱河造成了極大的恐慌,老刑警劉巖苍匆,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刘急,死亡現(xiàn)場離奇詭異,居然都是意外死亡浸踩,警方通過查閱死者的電腦和手機叔汁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來检碗,“玉大人据块,你說我怎么就攤上這事≌厶辏” “怎么了瑰钮?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長微驶。 經(jīng)常有香客問我浪谴,道長开睡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任苟耻,我火速辦了婚禮篇恒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘凶杖。我一直安慰自己胁艰,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布智蝠。 她就那樣靜靜地躺著腾么,像睡著了一般。 火紅的嫁衣襯著肌膚如雪杈湾。 梳的紋絲不亂的頭發(fā)上解虱,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天,我揣著相機與錄音漆撞,去河邊找鬼殴泰。 笑死,一個胖子當(dāng)著我的面吹牛浮驳,可吹牛的內(nèi)容都是我干的悍汛。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼至会,長吁一口氣:“原來是場噩夢啊……” “哼离咐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起奉件,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤健霹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瓶蚂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體糖埋,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年窃这,在試婚紗的時候發(fā)現(xiàn)自己被綠了瞳别。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡杭攻,死狀恐怖祟敛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情兆解,我是刑警寧澤馆铁,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站锅睛,受9級特大地震影響埠巨,放射性物質(zhì)發(fā)生泄漏历谍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一辣垒、第九天 我趴在偏房一處隱蔽的房頂上張望望侈。 院中可真熱鬧,春花似錦勋桶、人聲如沸脱衙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捐韩。三九已至,卻和暖如春鹃锈,著一層夾襖步出監(jiān)牢的瞬間荤胁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工仪召, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人松蒜。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓扔茅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親秸苗。 傳聞我的和親對象是個殘疾皇子召娜,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 這篇文章來自 Github 上的一位開發(fā)者收集整理的 Node.js 中文學(xué)習(xí)資料和教程導(dǎo)航。Node 是一個服務(wù)...
    吾名無雙閱讀 1,497評論 0 19
  • 作者:Weiwei SUN文章源自:http://wwsun.github.io/posts/nodejs-int...
    IT程序獅閱讀 42,906評論 3 52
  • 1惊楼、什么是錯誤優(yōu)先的回調(diào)函數(shù)玖瘸? 錯誤優(yōu)先的回調(diào)函數(shù)用于傳遞錯誤和數(shù)據(jù)。第一個參數(shù)始終應(yīng)該是一個錯誤對象檀咙, 用于檢查...
    Keely閱讀 12,387評論 1 7
  • 1.為什么使用 Node 雅倒?(面騰訊時被問答) 我當(dāng)時簡歷有寫到 node ,騰訊的小姐姐就問到了這個問題弧可,當(dāng)時復(fù)...
    肆意木閱讀 1,137評論 5 14
  • 在很多時候蔑匣,我們只能選擇一種,而不是一種選擇棕诵。 價值觀決定我們選擇什么裁良。 我們可以列出一系列我們必需的物品,當(dāng)不斷...
    扶翼閱讀 209評論 0 0