這兩道常見的Javascript面試題,看看你都會做嗎?

編程語言 JavaScript GitHub 文章 coder分享 2017-06-14

前言

Javascript作為前端開發的三大基礎之一,其重要性不言而喻。今天我們就一起來看下在面試過程中出現頻率比較高的幾道題目吧,看看你都會不會做呢?

這兩道常見的Javascript面試題,看看你都會做嗎?

Javascript

今天的這篇文章相關代碼已經放到Github上了,感興趣的可以自行看源碼,地址如下。

https://github.com/zhouxiongking/article-pages/blob/master/articles/interviewTopic/interviewTopic.js

題目1

我們都知道在Javascript中,有5大原生數據類型,分別是Number,String,Boolean,Undefined,Null。引用類型有Object,Array和Function三種。

那麼題目是這樣的,給定一個變量如何判斷該變量是不是一個數組呢?

有很多人看到這個題目的第一反應就是,調用這個變量的slice,splice等方法,如果有這些方法就是數組,沒有的話就是對象。當然這種說法太片面了,如果我給這個對象添加了slice或者splice等方法呢?還有的人會說,判斷是否有length屬性,同樣這個說法也是錯誤的。

  • 方法1-使用toString方法

調用call方法改變執行主體,間接的調用toString方法,將傳入的變量轉化為表示其類型的字符串。

對於不同數據類型,toString方法返回不同的值。Object類型返回的是'[object Object]',Array類型返回的是'[object Array]',Function類型返回的是'[object Function]'。

因此可以使用toString方法實現,代碼如下。

這兩道常見的Javascript面試題,看看你都會做嗎?

方法1代碼

通過後面的測試我們發現,這個方法能夠滿足我們的要求。

  • 方法2

直接調用Array.isArray()方法,這個方法是Array對象的原生方法,專門用於判斷傳入的對象是否為一個數組,如果是則返回true,如果不是則返回false。

但是需要注意的是Array.isArray()是ES5中才增加的新方法,如果被問起,這個點也是應該要知道的。

使用Array.isArray()方法編寫的代碼如下。

這兩道常見的Javascript面試題,看看你都會做嗎?

方法2

  • 方法3

方法3則稍顯複雜一點,使用typeof和instanceof方法結合的方式。

針對原生數據類型typeof可以完全判斷出,但是對於引用類型typeof卻不能起作用,因為Array和Object類型的值都會返回'object'。此時就需要借用instanceof來判斷,具體是屬於哪個類型的實例。

通過上述的解釋,我們可以得出如下代碼。

這兩道常見的Javascript面試題,看看你都會做嗎?

方法3

通過後面的測試代碼,我們發現方法3也是可行的。

題目2

題目2是這樣的,如何進行一個對象的克隆?這裡的所說的克隆分為兩種,一種是淺度克隆,一種是深度克隆,我們一一來看。

  • 淺度克隆

我們可以通過for...in語句實現對象的淺度克隆,將一個對象的所有屬性都複製到另一個新的對象中去。

實現和測試都在下面的代碼中。

這兩道常見的Javascript面試題,看看你都會做嗎?

淺度克隆

通過最後的測試代碼我們發現,將克隆得到的新對象的province屬性修改後,同樣會影響到被克隆的對象,相當於兩個對象引用同一片內存地址。這樣的結果並不是我們想要的,我們想要的結果是進行深度克隆,接著往下看。

  • 深度克隆

深度克隆就是為了解決淺度克隆的問題,深度克隆後的對象不會影響到被克隆對象的屬性,與被克隆對象完全獨立。

考慮到數組和對象的情況,我們需要對傳入的數據類型進行判斷,通過如下的方法。

這兩道常見的Javascript面試題,看看你都會做嗎?

判斷傳入數據類型

在確定傳入的數據類型後,用遞歸的寫法進行值的複製,通過如下方式。

這裡用到了arguments.callee()方法,它表示的是在哪個函數中執行,就代表哪個函數。在如下的代碼中實際指向的是deepClone函數,也就是另一種遞歸調用的方式。

這兩道常見的Javascript面試題,看看你都會做嗎?

深度克隆

在方法寫完之後,我們同樣通過上述的例子來進行測試,測試代碼如下。

這兩道常見的Javascript面試題,看看你都會做嗎?

測試代碼

通過最後的測試代碼輸出,我們發現克隆得到的oNew對象與被克隆的oPerson對象屬性值不會相互影響,達到了我們需要的深度克隆的目的。

結束語

今天這篇文章主要講了兩個常見的Javascript面試題,大家掌握了嗎?

相關推薦

推薦中...