摘要:原因是在循環(huán)完成后,變量的值等于節(jié)點列表的長度。嚴(yán)格上說,應(yīng)該對函數(shù)的輸入進行檢查。此外,是質(zhì)數(shù)中唯一的偶數(shù)。
1、作用域
(function() { var a = b = 5; })(); console.log(b); //5
這個問題的陷阱就是,在立即執(zhí)行函數(shù)表達式(IIFE)中,有兩個賦值,但是其中變量a使用關(guān)鍵詞var來聲明。這就意味著a是這個函數(shù)的局部變量。與此相反,b被分配給了全局作用域(譯注:也就是全局變量)。
這個問題另一個陷阱就是,在函數(shù)中沒有使用”嚴(yán)格模式” ("use strict")。如果 嚴(yán)格模式開啟,那么代碼就會報錯 ” Uncaught ReferenceError: b is not defined” 。請記住,如果這是預(yù)期的行為,嚴(yán)格模式要求你顯式地引用全局作用域。所以,你需要像下面這么寫:
(function() { "use strict"; var a = window.b = 5; })(); console.log(b);
答案:
5
在 String 對象上定義一個 repeatify 函數(shù)。這個函數(shù)接受一個整數(shù)參數(shù),來明確字符串需要重復(fù)幾次。這個函數(shù)要求字符串重復(fù)指定的次數(shù)。舉個例子:
console.log("hello".repeatify(3));
應(yīng)該打印出hellohellohello.
答案:
String.prototype.repeatify = String.prototype.repeatify || function(times){ var str = ""; for(var i = 0;i < times;i++){ str += this; } return str; }
這個問題測試了開發(fā)人員對 javascript 中繼承及原型(prototype)屬性的知識。這也驗證了開發(fā)人員是否有能力擴展原生數(shù)據(jù)類型功能(雖然不應(yīng)該這么做)。
在這里,另一個關(guān)鍵點是,看你怎樣避免重寫可能已經(jīng)定義了的方法。這可以通過在定義自己的方法之前,檢測方法是否已經(jīng)存在。
String.prototype.repeatify = String.prototype.repeatify || function(times) {/* code here */};3、變量提升
function test() { console.log(a); console.log(foo()); var a = 1; function foo() { return 2; } } test();
答案:
undefined
2
這個結(jié)果的原因是,變量和函數(shù)都被提升(hoisted) 到了函數(shù)體的頂部。因此,當(dāng)打印變量a時,它雖存在于函數(shù)體(因為a已經(jīng)被聲明),但仍然是undefined。換言之,上面的代碼等同于下面的代碼:
function test() { var a; function foo() { return 2; } console.log(a); console.log(foo()); a = 1; } test();4、javascript中this是怎么工作的
var fullname = "John Doe"; var obj = { fullname: "Colin Ihrig", prop: { fullname: "Aurelio De Rosa", getFullname: function() { return this.fullname; } } }; console.log(obj.prop.getFullname()); var test = obj.prop.getFullname; console.log(test());
答案:
這段代碼打印結(jié)果是:Aurelio De Rosa 和 John Doe 。原因是,JavaScript中關(guān)鍵字this所引用的是函數(shù)上下文,取決于函數(shù)是如何調(diào)用的,而不是怎么被定義的。
在第一個console.log(),getFullname()是作為obj.prop對象的函數(shù)被調(diào)用。因此,當(dāng)前的上下文指代后者,并且函數(shù)返回這個對象的fullname屬性。相反,當(dāng)getFullname()被賦值給test變量時,當(dāng)前的上下文是全局對象window,這是因為test被隱式地作為全局對象的屬性。基于這一點,函數(shù)返回window的fullname,在本例中即為第一行代碼設(shè)置的。
5、call()和apply()修復(fù)前一個問題,讓最后一個console.log() 打印輸出Aurelio De Rosa.
答案:
這個問題可以通過運用call()或者apply()方法強制轉(zhuǎn)換上下文環(huán)境。如果你不了解這兩個方法及它們的區(qū)別,我建議你看看這篇文章 function.call和function.apply之間有和區(qū)別。 下面的代碼中,我用了call(),但apply()也能產(chǎn)生同樣的結(jié)果:
console.log(test.call(obj.prop));6、閉包
var nodes = document.getElementsByTagName("button"); for (var i = 0; i < nodes.length; i++) { nodes[i].addEventListener("click", function() { console.log("You clicked element #" + i); }); }
請問,如果用戶點擊第一個和第四個按鈕的時候,控制臺分別打印的結(jié)果是什么?為什么?
答案:
概念:閉包(Closures)。對于每一個JavaScript開發(fā)者來說,如果你想在網(wǎng)頁中編寫5行以上的代碼,那么準(zhǔn)確理解和恰當(dāng)使用閉包是非常重要的。如果你想開始學(xué)習(xí)或者只是想簡單地溫習(xí)一下閉包,那么我強烈建議你去閱讀 Colin Ihrig 這個教程:JavaScript Closures Demystified
也就是說,代碼打印兩次You clicked element
#NODES_LENGTH,其中NODES_LENGTH是nodes的結(jié)點個數(shù)。原因是在for循環(huán)完成后,變量i的值等于節(jié)點列表的長度。此外,因為i在代碼添加處理程序的作用域中,該變量屬于處理程序的閉包。你會記得,閉包中的變量的值不是靜態(tài)的,因此i的值不是添加處理程序時的值(對于列表來說,第一個按鈕為0,對于第二個按鈕為1,依此類推)。在處理程序?qū)⒈粓?zhí)行的時候,在控制臺上將打印變量i的當(dāng)前值,等于節(jié)點列表的長度。
修復(fù)上題的問題,使得點擊第一個按鈕時輸出0,點擊第二個按鈕時輸出1,依此類推。
有多種辦法可以解決這個問題,下面主要使用兩種方法解決這個問題。
第一個解決方案使用立即執(zhí)行函數(shù)表達式(IIFE)再創(chuàng)建一個閉包,從而得到所期望的i的值。實現(xiàn)此方法的代碼如下:
var nodes = document.getElementsByTagName("button"); for (var i = 0; i < nodes.length; i++) { nodes[i].addEventListener("click", (function(i) { return function() { console.log("You clicked element #" + i); } })(i)); }
另一個解決方案不使用IIFE,而是將函數(shù)移到循環(huán)的外面。這種方法由下面的代碼實現(xiàn):
function handlerWrapper(i) { return function() { console.log("You clicked element #" + i); } } var nodes = document.getElementsByTagName("button"); for (var i = 0; i < nodes.length; i++) { nodes[i].addEventListener("click", handlerWrapper(i)); }8、算法 質(zhì)數(shù)
寫一個isPrime()函數(shù),當(dāng)其為質(zhì)數(shù)時返回true,否則返回false。
答案:
我認為這是面試中最常見的問題之一。然而,盡管這個問題經(jīng)常出現(xiàn)并且也很簡單,但是從被面試人提供的答案中能很好地看出被面試人的數(shù)學(xué)和算法水平。
首先, 因為JavaScript不同于C或者Java,因此你不能信任傳遞來的數(shù)據(jù)類型。如果面試官沒有明確地告訴你,你應(yīng)該詢問他是否需要做輸入檢查,還是不進行檢查直接寫函數(shù)。嚴(yán)格上說,應(yīng)該對函數(shù)的輸入進行檢查。
第二點要記住:負數(shù)不是質(zhì)數(shù)。同樣的,1和0也不是,因此,首先測試這些數(shù)字。此外,2是質(zhì)數(shù)中唯一的偶數(shù)。沒有必要用一個循環(huán)來驗證4,6,8。再則,如果一個數(shù)字不能被2整除,那么它不能被4,6,8等整除。因此,你的循環(huán)必須跳過這些數(shù)字。如果你測試輸入偶數(shù),你的算法將慢2倍(你測試雙倍數(shù)字)。可以采取其他一些更明智的優(yōu)化手段,我這里采用的是適用于大多數(shù)情況的。例如,如果一個數(shù)字不能被5整除,它也不會被5的倍數(shù)整除。所以,沒有必要檢測10,15,20等等。如果你深入了解這個問題的解決方案,我建議你去看相關(guān)的Wikipedia介紹。
最后一點,你不需要檢查比輸入數(shù)字的開方還要大的數(shù)字。我感覺人們會遺漏掉這一點,并且也不會因為此而獲得消極的反饋。但是,展示出這一方面的知識會給你額外加分。
現(xiàn)在你具備了這個問題的背景知識,下面是總結(jié)以上所有考慮的解決方案:
function isPrime(number) { // If your browser doesn"t support the method Number.isInteger of ECMAScript 6, // you can implement your own pretty easily if (typeof number !== "number" || !Number.isInteger(number)) { // Alternatively you can throw an error. return false; } if (number < 2) { return false; } if (number === 2) { return true; } else if (number % 2 === 0) { return false; } var squareRoot = Math.sqrt(number); for(var i = 3; i <= squareRoot; i += 2) { if (number % i === 0) { return false; } } return true; }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/99632.html
摘要:在深入理解系列你真懂嗎答案詳解中最后的看到的一些練習(xí)題,并嘗試自己做且記錄下來。接著在對變量進行大小判斷。很適合進階的來做練習(xí)。 在深入理解JavaScript系列(20):《你真懂JavaScript嗎?》答案詳解中最后的看到的一些練習(xí)題,并嘗試自己做且記錄下來。 找出數(shù)字數(shù)組中最大的元素(使用Math.max函數(shù)) var arr = [61, 22, 31, 4, 5]; // ...
摘要:前言開發(fā)項目和出沒社區(qū)有一段時間了,會遇上一些比較有印象業(yè)務(wù)需求。因為這些業(yè)務(wù)邏輯可以當(dāng)做練習(xí)題一樣,可以給大家練手。測試學(xué)院獲獎統(tǒng)計學(xué)生申請優(yōu)秀畢業(yè)生,并且符合條件的成績優(yōu)秀,拿過獎學(xué)金,獲得過三好學(xué)生。 1.前言 開發(fā)項目和出沒社區(qū)有一段時間了,會遇上一些比較有印象業(yè)務(wù)需求。這些業(yè)務(wù)需求,可能是自己開發(fā)項目遇上的,可能是在社區(qū)看到的業(yè)務(wù)需求,或者其他情況接觸到的需求,但是這些業(yè)務(wù)需...
摘要:在此收集一些自己遇到的一些在線練習(xí)的網(wǎng)站,當(dāng)然大部分是。建議邊學(xué)習(xí)邊編程,學(xué)習(xí)編程是不能光看不實踐的。國外的一個練習(xí)網(wǎng)站,有,也有,每種語言都有自己的道場,每個用戶都有不同的等級,刷題提高等級,也可以插卡別人優(yōu)秀的解決方案。 在學(xué)習(xí)的過程中會發(fā)現(xiàn)很多知識點如果不在工作中運用或者手寫帶驗證的話,很容易忘記。任何技能的掌握都是需要不斷練習(xí)的。在此收集一些自己遇到的一些在線練習(xí)的網(wǎng)站,當(dāng)然大...
摘要:在此收集一些自己遇到的一些在線練習(xí)的網(wǎng)站,當(dāng)然大部分是。建議邊學(xué)習(xí)邊編程,學(xué)習(xí)編程是不能光看不實踐的。國外的一個練習(xí)網(wǎng)站,有,也有,每種語言都有自己的道場,每個用戶都有不同的等級,刷題提高等級,也可以插卡別人優(yōu)秀的解決方案。 在學(xué)習(xí)的過程中會發(fā)現(xiàn)很多知識點如果不在工作中運用或者手寫帶驗證的話,很容易忘記。任何技能的掌握都是需要不斷練習(xí)的。在此收集一些自己遇到的一些在線練習(xí)的網(wǎng)站,當(dāng)然大...
摘要:當(dāng)我完成這個題目并且看到其他大神的答案時,我就覺得我真的很有必要記錄一下這道題,并且思考它在中的實現(xiàn)。表示被查找的值方法返回一個由替換值替換一些或所有匹配的模式后的新字符串。舉一反三,多多思考,多多實踐才是學(xué)習(xí)前端的最佳實踐。 之前,我在Codewars上看到一道名為Recover a secret string from random triplets的題,這道題使我沉思了很久,最終...
閱讀 3610·2021-11-23 09:51
閱讀 1482·2021-11-04 16:08
閱讀 3554·2021-09-02 09:54
閱讀 3620·2019-08-30 15:55
閱讀 2602·2019-08-30 15:54
閱讀 963·2019-08-29 16:30
閱讀 2051·2019-08-29 16:15
閱讀 2322·2019-08-29 14:05