前幾天社區的羣裏森破發了一個這樣的連接:javascript
http://ourjs.com/detail/52fb82e13bd19c4814000001java
作了一遍後忽然對人生感到了迷茫,本着不能只有我一我的傷心的原則,只要是程序員的好友我都發了一遍給他們答。程序員
最近亞馬遜書滿減,湊單買了本javascript實用代碼段的書,結果發現原來那個所謂八級測試的始做俑者就是這本··· 結果居然沒有答案···面試
遂以爲仍是整理一遍的好,加上以前本身的一些筆記,和一些擴展,寫個總結髮出來記錄一下。api
1,瀏覽器
這東西無非是函數參數問題,記得住就答得出來,真沒什麼卵用。閉包
主要是parseInt的第二個參數,是解析數字的基數,也就是進制,範圍爲2~36。jsp
好比這道題的第二個運行結果 就是 parseInt('2',1); 參數不符 故是NAN。函數
第二個運行結果 parseInt('3',2); 二進制裏沒有3,因此也是NAN。測試
2
null,array的 typeof 都是object。
可是instanceof仍是很嚴謹的。
不過如下須要注意:
1. instanceof 是判斷前者是否爲後者的一個實例,因此
2.判斷一個變量的類型上面兩種都很差要用這個:
Object.prototype.toString.call(XXX).slice(8,-1);
3
這個就是新array api的熟悉啦,
reduce也支持兩個參數,arr.reduce(callback[, initialValue]) 第二個參數··· 就叫他迭代開始吧, arr和initialValue兩個參數不能同時爲空,上一道題就是同時爲空了。
連接裏給的答案解析是有一些小問題的。
4是操做符優先級問題,就不說了。
5
這道題涉及的東西是做用域和變量聲明。
javaScript是沒有塊級做用域的,只有函數做用域。因此
if(true){var hehe = 'hehe'}這樣寫是沒錯誤的。
由於做用域是同樣的,固然還有最關鍵的一點,就是js的提早聲明。
代碼等同於:
因此name是undefined;
6 js最大的數是2^53。
7 pass
8
js沒有精確的數值,是由於十進制在轉換爲計算機用二進制時候的丟失致使的。該死的js並無對這個偏差進行處理。
9,10
switch 用 === 進行枚舉,記住便可。
另外周同窗上次在社區 羣裏提到的:
=== 是不觸發toString的。
11 pass
12 同1
13 pass
14
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
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
y是全局。
來點複雜的,還記得那三道面試題嗎?
答案是 100 10 100
由於
這裏還涉及到了一個做用域問題。
最後統一說一下吧。
一樣是聲明提早 因此 第一個alert是undefined。
這個最簡單其實,別被前兩個弄蒙就ok了。
26
記住便可
27同15
28,29, pass
30
function的name問題。
那這道題呢?
答案是 foo,undefined。
由於第二個是吧匿名函數複製給了foo2,因此沒有name。
謝謝周同窗爲我解惑。
31 同1
32 同30
33 pass
34
arr容許最後一個爲逗號。
還記得那個最簡單的驗證ie瀏覽器的代碼嗎?
!+[1,]
就是由於低版本(9之前?忘記了)的bug,[1,]在ie下toString是1,而不是1。
35
別用關鍵字,總不會出問題。
ok,大概就這些。在說一下這裏面不多涉及的this問題。
構造函數是有做用域的
因此
而
a,b() 這種類型的做用域就是a。
可是····要記住this只在執行時纔會綁定,因此
當你把a.b 付給了c時候,this有指向了全局了···
那麼若是這樣呢?
裏面外面都是同樣的,當你執行的是 func() 的時候,都會指向全局。
好啦,噁心人的東西解決完了,若是有錯誤或者補充,但願下面留言。