問題來了!5個JavaScript問答測試你的技能熟練程度
今天,我們將繼續(xù)學(xué)習(xí)我們鐘愛的JavaScript語言,在此文章中,我們將通過回答一些JavaScript迷你挑戰(zhàn)來測試我們的技能。即使我在每個問題的末尾都給出了解釋并給出答案,也請嘗試自己先找出答案,然后再針對我的問題驗證你的答案。
問題1:數(shù)組排序比較
思考以下數(shù)組和條件,你認(rèn)為結(jié)果如何?

答案

現(xiàn)在我們知道了結(jié)果,讓我們解釋一下原因。對于前兩個輸出,說明非常簡單,該sort()方法對原始數(shù)組進(jìn)行排序并返回對相同對象arr1.sort()的引用,因此實際上是對相同對象的引用arr1。
對于第三個輸出,arr1.sort() === arr2.sort()即使每個數(shù)組上的元素相同,=== 也不會測試數(shù)組的元素,而是測試每個對象的引用(在這種情況下是不同的),因此返回false。
問題2:對象可變性
對于這種情況,我想模擬一個代表作者的對象以及有關(guān)他的網(wǎng)站的信息。然后,我們使用這個方法,Object.freeze()以便無法對其進(jìn)行更改,并將其進(jìn)行測試。你認(rèn)為結(jié)果如何?

答案

如果你做對了,恭喜!如果沒有,請不要擔(dān)心。讓我們解釋發(fā)生了什么。當(dāng)我們調(diào)用該方法時,Object.freeze()凍結(jié)了對象,這意味著不能再更改對象;凍結(jié)對象可以防止向其添加新屬性,也可以防止現(xiàn)有屬性被刪除或更改。
但是,為什么我們能夠更改對象?實際上我們沒有,這就是竅門。出于各種目的,可變author網(wǎng)站中是對對象的引用,并且該引用在整個代碼中保持不變。我們確實更改了website對象內(nèi)部的一個屬性,但這并沒有更改對對象本身的引用。
如果你想知道如果嘗試更改author對象的屬性會發(fā)生什么,那么有兩種可能的答案。讓我們從第一個開始:

在第一種情況下,即使我們更改屬性,name也沒有真正更改,也沒有錯誤,沒有警告,就像那行代碼永遠(yuǎn)不會執(zhí)行一樣。第二種答案是在嚴(yán)格模式下

在嚴(yán)格模式下,如果嘗試修改凍結(jié)的對象,則會得到TypeError。比以前好多了。
問題3:遞歸
給定以下遞歸函數(shù),當(dāng)我們使用“ blog”作為參數(shù)調(diào)用它時,你認(rèn)為結(jié)果是什么?

答案

對于這個問題,沒有技巧,只是遞歸函數(shù)的基本用法,它將繼續(xù)調(diào)用自身,直到字符串中只有一個元素為止str,在這種情況下,將打印原始字符串的最后一個字符g。遞歸函數(shù)很重要,并且可以通過非常有趣的方式解決問題,因此理解它們很重要。
問題4:范圍
你認(rèn)為控制臺的輸出是什么,為什么?

答案

但是,如何在封閉函數(shù)的范圍之外b進(jìn)行定義?訣竅是,最多是一個全局變量。但仍保留在功能的封閉之下。請注意,在嚴(yán)格模式下,這將生成一個ReferenceError: b is not defined。
問題5:有關(guān)閉包的更多信息
以下代碼段是一個實際的流行訪談問題,問題是,你認(rèn)為輸出結(jié)果是什么?

答案

答對了嗎?這樣做的原因是,在循環(huán)中執(zhí)行的每個函數(shù)都將在整個循環(huán)完成后執(zhí)行,因此所有函數(shù)都將引用存儲在中的最后一個值i,即5。閉包可以通過為每次迭代創(chuàng)建一個唯一的作用域,將變量的每個唯一值存儲在其作用域中來防止此問題,如下所示:

ES2015提供的另一個選項是使用let代替var:

最后
希望你能像我一樣開心并從中學(xué)到東西,這是一篇特別有趣的文章,將來我可能會做更多這樣的事情。

























