18.2.26深信服Web實習生補坑(已拿到offer)


26號晚上8點左右收到電話,面試大概一小時左右,問的很廣,發揮的一般,問到的大部分都答出來了,有些沒有講好。然后面試官說等通知,問了評價,面試官說我現在大三懂這么多已經很不錯了,表達能力需要加強,有點緊張口吃。30分鍾后收到實習生offer郵件。這里只記錄下幾個答的不好的點。

1.var和不var的區別?

先問了作用域相關,然后問如果不用var聲明一個變量是屬於什么變量,這個是全局變量,肯定一下子答上來,然后又問那么不var的和用var聲明的變量有什么區別?

js里面的屬性是有權限設置的,比如我們直接創建一個對象:

// 我心愛的對象 ob
var ob = {a:1};

// 訪問屬性
ob.a; // => 1

// 修改屬性值
ob.a = 0;
ob.a; // => 0

// 創建新屬性
ob.b = 2;
ob.b; // => 2

// 刪除屬性
delete ob.b;
ob.b; // => undefined

但是上面代碼中的對象的所有屬性都是可迭代、可修改和可配置的嗎?

  • 可迭代,意味着我能夠通過 for..in 循環來訪問該對象的所有屬性. 還能通過 Object.keys() 方法獲取該對象的所有屬性名.
  • 可修改,意味着我能修改該對象的所有屬性的值,通過為這些屬性賦予一個新值就能修改: ob.a = 1000;.
  • 可配置,意味着我能修改屬性的行為,讓該對象的屬性都是不可迭代的、不可修改的和不可配置的. 只有可配置的屬性才能通過 delete 被刪除.

我們用var和不用var的一個區別就在可配置屬性上,聲明一個全局變量,其實都是給window增加一個屬性(瀏覽器環境下),由於window對象是全局對象,因此默認可以不加"window.",全局作用域下,window也可以用this來代替。

var test = function(){
 a = 'aa';
}
test();
alert(this.a);//彈出'aa' 
alert(window.a);//彈出'aa'
var a = 'aa';
alert(a); //彈出 'aa'
alert(window.a)//彈出'aa' 
a = 'aa';
alert(a); //彈出 'aa'
alert(window.a)//彈出'aa' 

然后關鍵來了:

var a = 'aa';
delete window.a; // false 
a = 'aa';
delete window.a; // true 

都是為'window'對象增加了屬性,一個可以刪除,一個不能刪除。
"delete 不可以刪除那些可配置性為false的屬性" ,某些內置對象的屬性是不可配置的,比如通過變量聲明或者函數聲明創建的全局對象的屬性
不用var創建的變量就可以進行刪除。

這個可配置屬性在Object.defineProperty()中的第三個參數部分就可以配置,以前在vue框架原理里面也看到過。這個可配置屬性名為"configurable",具體看defineProperty()的文檔:鏈接

然后在一些場景里其實也相關了變量函數聲明提前,當時跟面試官說了這個,但是面試官否決了,但是確實有些場景確實涉及到了啊:

var var01 = 1;
function funtest() {
 document.write(var01);
 var var01 = 0;
} 

結果為:undefined,函數里面聲明的產生了函數作用域,變量聲明提前了,所以為undefined。

var var01 = 1;
function funtest() {
 document.write(var01);
 var01 = 0;
} 

結果為:1,不用var就沒有提前聲明吧,所以我當時其實也答出了一個點,只是沒把場景說好,面試官心中可能要的是第一個答案?

 var01 = 1;
function funtest() {
 document.write(var01);
 var var01 = 0;
}

結果為:undefined

var01 = 1;
function funtest() {
 document.write(var01);
 var01 = 0;
}

結果為:1

2.node中間件有哪些?

正確來說是問你用過什么中間件,這個問題先要弄懂中間件和模塊,插件概念的區別,不要隨便瞎說用過哪個插件。
來自cnode的一位大佬的回答:

在軟件領域,中間件是在應用與應用之間充當連接服務的,這並非是nodejs的概念,其他領域也會有這個概念。舉個例子,比如消息隊列、數據庫驅動等。
插件一般來說extra的,就是你整個系統或應用不需要插件也能正常工作,插件一般是提供一些額外功能。而且插件這個詞本身代表的就是可拓展的(形象的說,可插拔)。
我個人認為 plugin/addon = extra feature 模塊一般是系統的負責某一功能的一部分,不可或缺。即 module =
a part of system/application
在 nodejs 里一般你在 package.json 里指定的那些package 都是 module,當然你從文件名 node_modules 也能看出來。

還有另外一位大佬舉了一個生動的例子:

把大象放入冰箱的過程是這樣的:

function play_with_elephant () {
open(); // 打開門
in_elephant(); // 放入大象
close(); // 關上門
return result; } 那么如果這樣寫:

function play_with_elephant (action_elephant) {
open(); // 打開門
action_elephant(); // 搗鼓大象
close(); // 關上門
return result; }
action_elephant 就可以看作是play_with_elephant的一個中間件,ta運行在一套算法的中間,屬於可變動的內容。

其實express不就是基於Connect中間件開發的嗎,而且用過express的肯定用過express.static吧, express.static是 Express 內置的唯一一個中間件。是基於 serve-static 開發的,負責托管 Express 應用內的靜態資源。當時竟然連這個都忘了答出來。

3.express3.x與4.x的區別?

4.x 變得更加純粹,以前只是內置了一些中間件…現在獨立出來…,默認就不支持 files了,核心的東西其實都沒變…4.X 源代碼更清晰,文檔更全面了,把connect模塊替換成更簡單的自己實現router http請求流程控制,原理還是一樣,用數組儲存中間件,其實就是(path,fn)對,然后http按次序進入各個中間件,執行完后返回。

詳細變化的優缺點可以看這個:鏈接

4.項目有個雙重回調為什么不用一層XXXXX?(沒聽太清楚面試官的意思)

這個在電話中沒聽太清楚面試官的問意,面試官給的說法也沒聽懂,有機會去當面問下現在的師傅。

5.怎么看一個屬性是對象自有的還是從原型鏈繼承下來的?

其實就是問in和hasOwnProperty()操作:

1.in 運算符

var obj = {name:'jack'};
alert('name' in obj); // --> true
alert('toString' in obj); // --> true

可看到無論是name,還是原形鏈上的toString,都能檢測到返回true。

2,hasOwnProperty 方法

var obj = {name:'jack'};
obj.hasOwnProperty('name'); // --> true
obj.hasOwnProperty('toString'); // --> false

原型鏈上繼承過來的屬性無法通過hasOwnProperty檢測到,返回false。

需注意的是,雖然in能檢測到原型鏈的屬性,但for in通常卻不行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM