javascript專業八級測試答案整理

來源:互聯網
上載者:User

標籤:

前幾天社區的群裡森破發了一個這樣的連結:

http://ourjs.com/detail/52fb82e13bd19c4814000001

做了一遍後突然對人生感到了迷茫,本著不能只有我一個人傷心的原則,只要是程式員的好友我都發了一遍給他們答。

最近亞馬遜書滿減,湊單買了本javascript實用程式碼片段的書,結果發現原來那個所謂八級測試的始作俑者就是這本··· 結果竟然沒有答案···

遂覺得還是整理一遍的好,加上之前自己的一些筆記,和一些擴充,寫個總結髮出來記錄一下。

1,

  1. ["1", "2", "3"].map(parseInt)
 

 這東西無非是函數參數問題,記得住就答得出來,真沒什麼卵用。

主要是parseInt的第二個參數,是解析數位基數,也就是進位,範圍為2~36。

比如這道題的第二個運行結果 就是 parseInt(‘2‘,1);  參數不符 故是NAN。

第二個運行結果 parseInt(‘3‘,2); 二進位裡沒有3,所以也是NAN。

2

  1. [typeof null, null instanceof Object]

 null,array的 typeof 都是object。

但是instanceof還是很嚴謹的。

不過以下需要注意:

1. instanceof 是判斷前者是否為後者的一個執行個體,所以

2.判斷一個變數的類型上面兩種都不好要用這個:

Object.prototype.toString.call(XXX).slice(8,-1);

3

  1. [ [3,2,1].reduce(Math.pow), [].reduce(Math.pow)] ]
 

 這個就是新array api的熟悉啦,

reduce也支援兩個參數,arr.reduce(callback[, initialValue])   第二個參數··· 就叫他迭代開始吧, arr和initialValue兩個參數不能同時為空白,上一道題就是同時為空白了。

連結裡給的答案解析是有一些小問題的。

4是操作符優先順序問題,就不說了。

5

這道題涉及的東西是範圍和變數聲明。

javaScript是沒有塊級範圍的,只有函數範圍。所以

if(true){var hehe = ‘hehe‘}這樣寫是沒錯誤的。

因為範圍是一樣的,當然還有最關鍵的一點,就是js的提前聲明。

代碼等同於:

  1. var name = ‘World!‘;
  2. (function () {
  3. var name;
  4. if (typeof name === ‘undefined‘) {
  5. name = ‘Jack‘;
  6. console.log(‘Goodbye ‘ + name);
  7. } else {
  8. console.log(‘Hello ‘ + name);
  9. }
  10. })();
 

 所以name是undefined;

6 js最大的數是2^53。

7 pass

8

js沒有精確的數值,是因為十進位在轉換為電腦用二進位時候的丟失導致的。該死的js並沒有對這個誤差進行處理。

9,10

switch 用 === 進行枚舉,記住即可。

另外周同學上次在社區 群裡提到的:

=== 是不觸發toString的。

11 pass

12 同1

13 pass

14 

  1. var a = [0];
  2. if ([0]) {
  3. console.log(a == true);
  4. } else {
  5. console.log("wut");
  6. }

 if的判斷 

==和if的判斷是不一樣的

比如 if(2) 是true,但是 2 == true 是false,因為在==時,是把布爾值轉換為數字類型在進行比較,這個時候 true是1,所以在==時,只有1==true是 ture。

同樣的在if裡,數字類型只有0是false,因為其餘的轉為布爾類型是,都是true。

引用對象都為true

小tips

1: 條件陳述式可以用 && 代替 比如  a&& b  就是if(a) && b

2:別的語言喜歡把-1當做false,放在js裡,你可以用 if(~flag) 來使-1返回false。

~是按位取反,按照取反再減一來運算,

比如你要判斷indexof 

那麼 if(~xxx.indexof(‘x‘) ) 比 if(xxx.indexof(‘x‘) > -1) 漂亮的多。

15

  1. []==[]

 無論是== 還是=== 判斷的都是索引值。

=賦予的也是對象的索引,所以千萬不要 a=b=[] 這樣子賦值,會是噩夢的。

16

  1. ‘5‘ + 3
  2. ‘5‘ - 3

 53和2,因為在遇到減號時,會先轉換為數實值型別。

那麼 3 + ‘5’ - 3是多少呢? 是32。

那如果我們要字串類型轉換為數字類型呢?

+str  或者 str*1。

像上面那樣 str在中間,就盡量用*1吧 、

17

我不明白,也沒找到··· 試了好多組數字,找到了點規律··· 但是依舊不明白為什麼···

18 pass

19 arguments,strict 模式下就不會被更改了。

相應的,還有一個全域變數undefined,在strict 模式下也不會可以被修改。

但是你依舊可以用function undefined來修改。

有的閉包會傳一個undefined的參數,就是怕在全域被複寫了。

20,21,22,23,

pass

24

2.toString() 報錯是因為解析器把‘.‘解析為了浮點數的‘.‘。所以如果你要用寫符合這種語義的代碼就要:

25

  1. (function(){
  2. var x = y = 1;
  3. })();
  4. console.log(y);
  5. console.log(x);

 y是全域。

來點複雜的,還記得那三道面試題嗎?

  1. var a = 10;
  2. function test() {
  3. a = 100;
  4. alert(a);
  5. alert(this.a);
  6. var a;
  7. alert(a);
  8. }
  9. test();
 

 答案是 100 10 100

因為

  1. var a = 10;
  2. function test() {
  3. var a;
  4. a = 100;
  5. alert(a);
  6. alert(this.a);
  7. //var a; 聲明提前
  8. alert(a);
  9. }
  10. test();

 這裡還涉及到了一個範圍問題。

最後統一說一下吧。

  1. var a = 100;
  2. function test(){
  3. alert(a);
  4. var a = 10;
  5. alert(a);
  6. }
  7. test();
 

 同樣是聲明提前 所以 第一個alert是undefined。

  1. var a = 100;
  2. function test(){
  3. alert(a);
  4. a = 10; //去掉了var 就變成定義了全域變數了
  5. alert(a);
  6. }
  7. test();
  8. alert(a);

 這個最簡單其實,別被前兩個弄蒙就ok了。

26

記住即可

27同15

28,29, pass

30

  1. function foo() { }
  2. var oldName = foo.name;
  3. foo.name = "bar";
  4. [oldName, foo.name]
 

 function的name問題。

  1. function foo() {}
  2. alert(foo.name)
  3. var foo2 = function (){}
  4. alert(foo2.name)

 那這道題呢?

答案是 foo,undefined。

因為第二個是吧匿名函數複製給了foo2,所以沒有name。

謝謝周同學為我解惑。

31 同1

32 同30

33 pass

34

  1. [,,,].join(", ")

 arr允許最後一個為逗號。

還記得那個最簡單的驗證ie瀏覽器的代碼嗎?

!+[1,]

就是因為低版本(9以前?忘記了)的bug,[1,]在ie下toString是1,而不是1。

35

別用關鍵字,總不會出問題。

 

ok,大概就這些。在說一下這裡面很少涉及的this問題。

建構函式是有範圍的

所以

a,b() 這種類型的範圍就是a。

但是····要記住this只在執行時才會綁定,所以

當你把a.b 付給了c時候,this有指向了全域了···

那麼如果這樣呢?

裡面外面都是一樣的,當你執行的是 func() 的時候,都會指向全域。

好啦,噁心人的東西解決完了,如果有錯誤或者補充,希望下面留言。

javascript專業八級測試答案整理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.