javascript專業八級測試答案整理

前幾天社區的羣裏森破發了一個這樣的連接:javascript

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

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

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

遂以爲仍是整理一遍的好,加上以前本身的一些筆記,和一些擴展,寫個總結髮出來記錄一下。api

1,瀏覽器

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

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

主要是parseInt的第二個參數,是解析數字的基數,也就是進制,範圍爲2~36。jsp

好比這道題的第二個運行結果 就是 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,嚴格模式下就不會被更改了。

相應的,還有一個全局變量undefined,在嚴格模式下也不會能夠被修改。

可是你依舊能夠用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() 的時候,都會指向全局。

好啦,噁心人的東西解決完了,若是有錯誤或者補充,但願下面留言。

相關文章
相關標籤/搜索