成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

javascript練習(xí)題

lauren_liuling / 2965人閱讀

摘要:原因是在循環(huán)完成后,變量的值等于節(jié)點(diǎn)列表的長(zhǎng)度。嚴(yán)格上說(shuō),應(yīng)該對(duì)函數(shù)的輸入進(jìn)行檢查。此外,是質(zhì)數(shù)中唯一的偶數(shù)。

1、作用域
(function() {
   var a = b = 5;
})();
 
console.log(b);  //5

這個(gè)問(wèn)題的陷阱就是,在立即執(zhí)行函數(shù)表達(dá)式(IIFE)中,有兩個(gè)賦值,但是其中變量a使用關(guān)鍵詞var來(lái)聲明。這就意味著a是這個(gè)函數(shù)的局部變量。與此相反,b被分配給了全局作用域(譯注:也就是全局變量)。

這個(gè)問(wèn)題另一個(gè)陷阱就是,在函數(shù)中沒(méi)有使用”嚴(yán)格模式” ("use strict")。如果 嚴(yán)格模式開(kāi)啟,那么代碼就會(huì)報(bào)錯(cuò) ” Uncaught ReferenceError: b is not defined” 。請(qǐng)記住,如果這是預(yù)期的行為,嚴(yán)格模式要求你顯式地引用全局作用域。所以,你需要像下面這么寫(xiě):

(function() {
   "use strict";
   var a = window.b = 5;
})();
 
console.log(b);

答案:
5

2、創(chuàng)建"原生("native")方法"
在 String 對(duì)象上定義一個(gè) repeatify 函數(shù)。這個(gè)函數(shù)接受一個(gè)整數(shù)參數(shù),來(lái)明確字符串需要重復(fù)幾次。這個(gè)函數(shù)要求字符串重復(fù)指定的次數(shù)。舉個(gè)例子:
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;
}

這個(gè)問(wèn)題測(cè)試了開(kāi)發(fā)人員對(duì) javascript 中繼承及原型(prototype)屬性的知識(shí)。這也驗(yàn)證了開(kāi)發(fā)人員是否有能力擴(kuò)展原生數(shù)據(jù)類(lèi)型功能(雖然不應(yīng)該這么做)。

在這里,另一個(gè)關(guān)鍵點(diǎn)是,看你怎樣避免重寫(xiě)可能已經(jīng)定義了的方法。這可以通過(guò)在定義自己的方法之前,檢測(cè)方法是否已經(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

這個(gè)結(jié)果的原因是,變量和函數(shù)都被提升(hoisted) 到了函數(shù)體的頂部。因此,當(dāng)打印變量a時(shí),它雖存在于函數(shù)體(因?yàn)閍已經(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 RosaJohn Doe 。原因是,JavaScript中關(guān)鍵字this所引用的是函數(shù)上下文,取決于函數(shù)是如何調(diào)用的,而不是怎么被定義的。

在第一個(gè)console.log(),getFullname()是作為obj.prop對(duì)象的函數(shù)被調(diào)用。因此,當(dāng)前的上下文指代后者,并且函數(shù)返回這個(gè)對(duì)象的fullname屬性。相反,當(dāng)getFullname()被賦值給test變量時(shí),當(dāng)前的上下文是全局對(duì)象window,這是因?yàn)閠est被隱式地作為全局對(duì)象的屬性。基于這一點(diǎn),函數(shù)返回windowfullname,在本例中即為第一行代碼設(shè)置的。

5、call()和apply()
修復(fù)前一個(gè)問(wèn)題,讓最后一個(gè)console.log() 打印輸出Aurelio De Rosa.

答案:
這個(gè)問(wèn)題可以通過(guò)運(yùn)用call()或者apply()方法強(qiáng)制轉(zhuǎn)換上下文環(huán)境。如果你不了解這兩個(gè)方法及它們的區(qū)別,我建議你看看這篇文章 function.callfunction.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);
   });
}
請(qǐng)問(wèn),如果用戶(hù)點(diǎn)擊第一個(gè)和第四個(gè)按鈕的時(shí)候,控制臺(tái)分別打印的結(jié)果是什么?為什么?

答案:

概念:閉包(Closures)。對(duì)于每一個(gè)JavaScript開(kāi)發(fā)者來(lái)說(shuō),如果你想在網(wǎng)頁(yè)中編寫(xiě)5行以上的代碼,那么準(zhǔn)確理解和恰當(dāng)使用閉包是非常重要的。如果你想開(kāi)始學(xué)習(xí)或者只是想簡(jiǎn)單地溫習(xí)一下閉包,那么我強(qiáng)烈建議你去閱讀 Colin Ihrig 這個(gè)教程:JavaScript Closures Demystified

也就是說(shuō),代碼打印兩次You clicked element
#NODES_LENGTH,其中NODES_LENGTHnodes的結(jié)點(diǎn)個(gè)數(shù)。原因是在for循環(huán)完成后,變量i的值等于節(jié)點(diǎn)列表的長(zhǎng)度。此外,因?yàn)閕在代碼添加處理程序的作用域中,該變量屬于處理程序的閉包。你會(huì)記得,閉包中的變量的值不是靜態(tài)的,因此i的值不是添加處理程序時(shí)的值(對(duì)于列表來(lái)說(shuō),第一個(gè)按鈕為0,對(duì)于第二個(gè)按鈕為1,依此類(lèi)推)。在處理程序?qū)⒈粓?zhí)行的時(shí)候,在控制臺(tái)上將打印變量i的當(dāng)前值,等于節(jié)點(diǎn)列表的長(zhǎng)度。

7、 閉包
修復(fù)上題的問(wèn)題,使得點(diǎn)擊第一個(gè)按鈕時(shí)輸出0,點(diǎn)擊第二個(gè)按鈕時(shí)輸出1,依此類(lèi)推。

有多種辦法可以解決這個(gè)問(wèn)題,下面主要使用兩種方法解決這個(gè)問(wèn)題。

第一個(gè)解決方案使用立即執(zhí)行函數(shù)表達(dá)式(IIFE)再創(chuàng)建一個(gè)閉包,從而得到所期望的i的值。實(shí)現(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));
}

另一個(gè)解決方案不使用IIFE,而是將函數(shù)移到循環(huán)的外面。這種方法由下面的代碼實(shí)現(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ù)
寫(xiě)一個(gè)isPrime()函數(shù),當(dāng)其為質(zhì)數(shù)時(shí)返回true,否則返回false。

答案:

我認(rèn)為這是面試中最常見(jiàn)的問(wèn)題之一。然而,盡管這個(gè)問(wèn)題經(jīng)常出現(xiàn)并且也很簡(jiǎn)單,但是從被面試人提供的答案中能很好地看出被面試人的數(shù)學(xué)和算法水平。

首先, 因?yàn)镴avaScript不同于C或者Java,因此你不能信任傳遞來(lái)的數(shù)據(jù)類(lèi)型。如果面試官?zèng)]有明確地告訴你,你應(yīng)該詢(xún)問(wèn)他是否需要做輸入檢查,還是不進(jìn)行檢查直接寫(xiě)函數(shù)。嚴(yán)格上說(shuō),應(yīng)該對(duì)函數(shù)的輸入進(jìn)行檢查。

第二點(diǎn)要記住:負(fù)數(shù)不是質(zhì)數(shù)。同樣的,1和0也不是,因此,首先測(cè)試這些數(shù)字。此外,2是質(zhì)數(shù)中唯一的偶數(shù)。沒(méi)有必要用一個(gè)循環(huán)來(lái)驗(yàn)證4,6,8。再則,如果一個(gè)數(shù)字不能被2整除,那么它不能被4,6,8等整除。因此,你的循環(huán)必須跳過(guò)這些數(shù)字。如果你測(cè)試輸入偶數(shù),你的算法將慢2倍(你測(cè)試雙倍數(shù)字)。可以采取其他一些更明智的優(yōu)化手段,我這里采用的是適用于大多數(shù)情況的。例如,如果一個(gè)數(shù)字不能被5整除,它也不會(huì)被5的倍數(shù)整除。所以,沒(méi)有必要檢測(cè)10,15,20等等。如果你深入了解這個(gè)問(wèn)題的解決方案,我建議你去看相關(guān)的Wikipedia介紹。

最后一點(diǎn),你不需要檢查比輸入數(shù)字的開(kāi)方還要大的數(shù)字。我感覺(jué)人們會(huì)遺漏掉這一點(diǎn),并且也不會(huì)因?yàn)榇硕@得消極的反饋。但是,展示出這一方面的知識(shí)會(huì)給你額外加分。

現(xiàn)在你具備了這個(gè)問(wèn)題的背景知識(shí),下面是總結(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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/99632.html

相關(guān)文章

  • 5道 JavaScript 習(xí)題

    摘要:在深入理解系列你真懂嗎答案詳解中最后的看到的一些練習(xí)題,并嘗試自己做且記錄下來(lái)。接著在對(duì)變量進(jìn)行大小判斷。很適合進(jìn)階的來(lái)做練習(xí)。 在深入理解JavaScript系列(20):《你真懂JavaScript嗎?》答案詳解中最后的看到的一些練習(xí)題,并嘗試自己做且記錄下來(lái)。 找出數(shù)字?jǐn)?shù)組中最大的元素(使用Math.max函數(shù)) var arr = [61, 22, 31, 4, 5]; // ...

    newtrek 評(píng)論0 收藏0
  • javascript打怪升級(jí)--把業(yè)務(wù)邏輯當(dāng)習(xí)題

    摘要:前言開(kāi)發(fā)項(xiàng)目和出沒(méi)社區(qū)有一段時(shí)間了,會(huì)遇上一些比較有印象業(yè)務(wù)需求。因?yàn)檫@些業(yè)務(wù)邏輯可以當(dāng)做練習(xí)題一樣,可以給大家練手。測(cè)試學(xué)院獲獎(jiǎng)統(tǒng)計(jì)學(xué)生申請(qǐng)優(yōu)秀畢業(yè)生,并且符合條件的成績(jī)優(yōu)秀,拿過(guò)獎(jiǎng)學(xué)金,獲得過(guò)三好學(xué)生。 1.前言 開(kāi)發(fā)項(xiàng)目和出沒(méi)社區(qū)有一段時(shí)間了,會(huì)遇上一些比較有印象業(yè)務(wù)需求。這些業(yè)務(wù)需求,可能是自己開(kāi)發(fā)項(xiàng)目遇上的,可能是在社區(qū)看到的業(yè)務(wù)需求,或者其他情況接觸到的需求,但是這些業(yè)務(wù)需...

    heartFollower 評(píng)論0 收藏0
  • 在線(xiàn)編程練習(xí)實(shí)踐網(wǎng)站

    摘要:在此收集一些自己遇到的一些在線(xiàn)練習(xí)的網(wǎng)站,當(dāng)然大部分是。建議邊學(xué)習(xí)邊編程,學(xué)習(xí)編程是不能光看不實(shí)踐的。國(guó)外的一個(gè)練習(xí)網(wǎng)站,有,也有,每種語(yǔ)言都有自己的道場(chǎng),每個(gè)用戶(hù)都有不同的等級(jí),刷題提高等級(jí),也可以插卡別人優(yōu)秀的解決方案。 在學(xué)習(xí)的過(guò)程中會(huì)發(fā)現(xiàn)很多知識(shí)點(diǎn)如果不在工作中運(yùn)用或者手寫(xiě)帶驗(yàn)證的話(huà),很容易忘記。任何技能的掌握都是需要不斷練習(xí)的。在此收集一些自己遇到的一些在線(xiàn)練習(xí)的網(wǎng)站,當(dāng)然大...

    huhud 評(píng)論0 收藏0
  • 在線(xiàn)編程練習(xí)實(shí)踐網(wǎng)站

    摘要:在此收集一些自己遇到的一些在線(xiàn)練習(xí)的網(wǎng)站,當(dāng)然大部分是。建議邊學(xué)習(xí)邊編程,學(xué)習(xí)編程是不能光看不實(shí)踐的。國(guó)外的一個(gè)練習(xí)網(wǎng)站,有,也有,每種語(yǔ)言都有自己的道場(chǎng),每個(gè)用戶(hù)都有不同的等級(jí),刷題提高等級(jí),也可以插卡別人優(yōu)秀的解決方案。 在學(xué)習(xí)的過(guò)程中會(huì)發(fā)現(xiàn)很多知識(shí)點(diǎn)如果不在工作中運(yùn)用或者手寫(xiě)帶驗(yàn)證的話(huà),很容易忘記。任何技能的掌握都是需要不斷練習(xí)的。在此收集一些自己遇到的一些在線(xiàn)練習(xí)的網(wǎng)站,當(dāng)然大...

    xiaotianyi 評(píng)論0 收藏0
  • 記一次JavaScript API習(xí)題

    摘要:當(dāng)我完成這個(gè)題目并且看到其他大神的答案時(shí),我就覺(jué)得我真的很有必要記錄一下這道題,并且思考它在中的實(shí)現(xiàn)。表示被查找的值方法返回一個(gè)由替換值替換一些或所有匹配的模式后的新字符串。舉一反三,多多思考,多多實(shí)踐才是學(xué)習(xí)前端的最佳實(shí)踐。 之前,我在Codewars上看到一道名為Recover a secret string from random triplets的題,這道題使我沉思了很久,最終...

    scq000 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<