幾道前端比較繞的前端面試題

2022-05-24 12:33:08 字數 3103 閱讀 6490

第一題

1

var fun = function

();6} 7

var p = new

fun();8//

請問p.name是:jack

第二題

1

var fun = function()6

7var p = new

fun();8//

請問p.name是:peter

1,2題考察的是建構函式的返回值的問題。

每個函式都有返回值,如果使用了return語句,則返回return後跟的值,如果沒有使用return,則預設返回undefined.

特別的,如果這個函式是建構函式,則預設返回this物件,如果建構函式內使用了return語句,並且return後跟的是乙個物件,則這個建構函式返回的是這個物件,否則返回this.

所以1題中的p =,而2題中的p =.

第三題(涉及到get了)

1

var fun = function

(){}

23 fun.prototype =8}

910var a = new

fun();

11var b = new

fun();

1213 a.info.name = 'jack';

14 b.info.name = 'tom';

1516

//請問a.info.name和b.info.name分別是:tom tom

第四題

1

var fun = function()6

}78var a = new

fun();

9var b = new

fun();

1011 a.info.name = 'jack';

12 b.info.name = 'tom';

13//

請問a.info.name和b.info.name分別是:jack tom

第五題 (只有set)

1

var fun = function

(){}

23 fun.prototype =78

var a = new

fun();

9var b = new

fun();

1011 a.name = 'jack';

12 b.name = 'tom';

13//

請問a.name和b.name分別是:jack tom

關於第五題的理解:

給某個物件設定乙個屬性的時候,是不涉及訪問該屬性的。

給a設定name屬性時,只會檢查這個屬性是否存在(此時在這個物件上),如果這個屬性存在,不會去訪問它的值,直接用新值覆蓋,如果不存在,則直接新增。整個過程不存在值的訪問,也就沒有查詢原型鏈的過程。

第六題

1

var fun = function()6

}78 fun.prototype =13}

1415

var a = new

fun();

16var b = new

fun();

1718 a.info.name = 'jack';

19 b.info.name = 'tom';

20//

請問a.info.name和b.info.name分別是:jack tom

3, 4, 5, 6題都是考察prototype的知識。

以下內容我假設你知道一些物件導向的概念。

js裡面,乙個例項(以下都用p)的[[proto]]屬性指向這個類(以下用fun)的原型,如果用等號表示指向的話就是

p.[[proto]] = fun.prototype

然後另一條規則就是,當訪問乙個物件a的屬性時,會先檢查a是否有這個屬性,如果有,則返回這個屬性的值,如果沒有則檢查a的[[proto]]是否有該屬性,有則返回,無則繼續檢查a的[[proto]]的[[proto]]直到檢查到或者[[proto]]為null為止。

注:[[proto]]是ecmascript標準裡的屬性,瀏覽器實現的時候使用的是__proto__

所以第3題:

a.info = a.__proto__.info = b.info = b.__proto__.info = fun.prototype.info = 

他們是屬於引用相等,所以更改a.info.name的值時,b.info.name, fun.prototype.info的值也會跟著改變。 4,5,6 題不再累述。

不過第五個和第三個理解上有點問題。

1

var fun = function

(){}

23 fun.prototype =8}

910var a = new

fun();

11var b = new

fun();

1213 a.info.name = 'jack';

14 b.info.name = 'tom';//

這句如果改成 b.info = {};b.info.name='123';這樣就和第五個一樣的效果了。

//請問a.info.name和b.info.name分別是:

jack , 123

b.info.name = 'tom'; 賦值的時候並不能在b下 找到b.info 所以只能去fun.prototype中把tom賦值給fun.prototype中的name值了。

而如果b.info已經存在的情況,他就不需要去fun.prototype下去尋找和賦值了。

以上摘抄網上的內容,作為自己的筆記

幾道前端面試題

這幾天跑了好多宣講會,也做了不少筆試,給我印象最深的還是這些筆試題沒有一道和前端技術有關的,大多數都是演算法題 1.在乙個字串中找到第乙個只出現一次的字元。如輸入abaccdeff,則輸出b.這題我做的時候一直在想怎麼用js寫出來,想了好久感覺沒寫好,於是回來後仔細思考了下,總算是寫出來比較滿意的解...

前端面試題

sprites是什麼和為什麼要使用他們?css 精靈 把一堆小的整合到一張大的上,減輕伺服器對的請求數量 有可能替代sprites的方法是什麼?svg圖示,字型圖示,字元編碼等等。1 在div排版的時候,假設現在是100px的寬,我在盒子左側用padding left留個10px的白,div就撐開了...

前端面試題

行內元素有哪些?塊級元素有哪些?空 void 元素有哪些?link和 import的區別是?常見相容性問題?含移動端 html5的離線儲存?描寫一段語義化的html 吧 html5的form如何關閉自動完成功能?什麼是閉包 closure 為什麼要用?localstorage和sessionstor...