標籤:
前幾天社區的群裡森破發了一個這樣的連結:
http://ourjs.com/detail/52fb82e13bd19c4814000001
做了一遍後突然對人生感到了迷茫,本著不能只有我一個人傷心的原則,只要是程式員的好友我都發了一遍給他們答。
最近亞馬遜書滿減,湊單買了本javascript實用程式碼片段的書,結果發現原來那個所謂八級測試的始作俑者就是這本··· 結果竟然沒有答案···
遂覺得還是整理一遍的好,加上之前自己的一些筆記,和一些擴充,寫個總結髮出來記錄一下。
1,
- ["1", "2", "3"].map(parseInt)
這東西無非是函數參數問題,記得住就答得出來,真沒什麼卵用。
主要是parseInt的第二個參數,是解析數位基數,也就是進位,範圍為2~36。
比如這道題的第二個運行結果 就是 parseInt(‘2‘,1); 參數不符 故是NAN。
第二個運行結果 parseInt(‘3‘,2); 二進位裡沒有3,所以也是NAN。
2
- [typeof null, null instanceof Object]
null,array的 typeof 都是object。
但是instanceof還是很嚴謹的。
不過以下需要注意:
1. instanceof 是判斷前者是否為後者的一個執行個體,所以
2.判斷一個變數的類型上面兩種都不好要用這個:
Object.prototype.toString.call(XXX).slice(8,-1);
3
- [ [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的提前聲明。
代碼等同於:
- var name = ‘World!‘;
- (function () {
- var name;
- if (typeof name === ‘undefined‘) {
- name = ‘Jack‘;
- console.log(‘Goodbye ‘ + name);
- } else {
- console.log(‘Hello ‘ + name);
- }
- })();
所以name是undefined;
6 js最大的數是2^53。
7 pass
8
js沒有精確的數值,是因為十進位在轉換為電腦用二進位時候的丟失導致的。該死的js並沒有對這個誤差進行處理。
9,10
switch 用 === 進行枚舉,記住即可。
另外周同學上次在社區 群裡提到的:
=== 是不觸發toString的。
11 pass
12 同1
13 pass
14
- var a = [0];
- if ([0]) {
- console.log(a == true);
- } else {
- console.log("wut");
- }
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
- []==[]
無論是== 還是=== 判斷的都是索引值。
=賦予的也是對象的索引,所以千萬不要 a=b=[] 這樣子賦值,會是噩夢的。
16
- ‘5‘ + 3
- ‘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
- (function(){
- var x = y = 1;
- })();
- console.log(y);
- console.log(x);
y是全域。
來點複雜的,還記得那三道面試題嗎?
- var a = 10;
- function test() {
- a = 100;
- alert(a);
- alert(this.a);
- var a;
- alert(a);
- }
- test();
答案是 100 10 100
因為
- var a = 10;
- function test() {
- var a;
- a = 100;
- alert(a);
- alert(this.a);
- //var a; 聲明提前
- alert(a);
- }
- test();
這裡還涉及到了一個範圍問題。
最後統一說一下吧。
- var a = 100;
- function test(){
- alert(a);
- var a = 10;
- alert(a);
- }
- test();
同樣是聲明提前 所以 第一個alert是undefined。
- var a = 100;
- function test(){
- alert(a);
- a = 10; //去掉了var 就變成定義了全域變數了
- alert(a);
- }
- test();
- alert(a);
這個最簡單其實,別被前兩個弄蒙就ok了。
26
記住即可
27同15
28,29, pass
30
- function foo() { }
- var oldName = foo.name;
- foo.name = "bar";
- [oldName, foo.name]
function的name問題。
- function foo() {}
- alert(foo.name)
- var foo2 = function (){}
- alert(foo2.name)
那這道題呢?
答案是 foo,undefined。
因為第二個是吧匿名函數複製給了foo2,所以沒有name。
謝謝周同學為我解惑。
31 同1
32 同30
33 pass
34
- [,,,].join(", ")
arr允許最後一個為逗號。
還記得那個最簡單的驗證ie瀏覽器的代碼嗎?
!+[1,]
就是因為低版本(9以前?忘記了)的bug,[1,]在ie下toString是1,而不是1。
35
別用關鍵字,總不會出問題。
ok,大概就這些。在說一下這裡面很少涉及的this問題。
建構函式是有範圍的
所以
而
a,b() 這種類型的範圍就是a。
但是····要記住this只在執行時才會綁定,所以
當你把a.b 付給了c時候,this有指向了全域了···
那麼如果這樣呢?
裡面外面都是一樣的,當你執行的是 func() 的時候,都會指向全域。
好啦,噁心人的東西解決完了,如果有錯誤或者補充,希望下面留言。
javascript專業八級測試答案整理