JavaScript 學(xué)習(xí)之路- JS 小測驗(yàn)

在學(xué)習(xí) JS 的過程中,很多知識(shí)往往看一遍就過去了,然后自以為掌握了,其實(shí)再次碰到不一定能答得出來,看到一些有趣的東西還是要?jiǎng)邮謱?shí)踐一下,而且時(shí)不時(shí)復(fù)習(xí)一下,非常有利于加深記憶。今天是五一,假日期間,好好休息玩耍,也別學(xué)什么新東西了,你可以看看以下這些問題以及相關(guān)知識(shí)點(diǎn)來看看自己掌握了多少,溫故知新。

問題不多,耐心看完。最下方有答案,先別急著翻,自己先想想。

問題

  1. JS 格式化,用逗號(hào)分隔千分位數(shù)字
  2. 運(yùn)行 [1, 2, 2].fill(3, 1, 3) 會(huì)輸出什么
  3. ~~3.5 的結(jié)果是什么
  4. 如何判斷一個(gè)數(shù)組的長度是奇數(shù)還是偶數(shù)
  5. JSON.parse 和 JSON.stringify 的作用
  6. typeof null為什么等于 "object",它的判斷原理是什么
  7. 如何判斷一個(gè)元素是否為數(shù)組
  8. <<>> 運(yùn)算符
  9. function add(){} 和 var add = function(){} 解析時(shí)的區(qū)別
  10. 執(zhí)行以下代碼,輸出是什么?為什么?
var arr=[1,2,3,4,5];
for(var i=0;i<arr.length;i++) {
    arr[i]=function(){
      alert(i)
    }
}
arr[3]();

參考答案

如有錯(cuò)誤,請幫忙指正。

  1. JS 格式化,用逗號(hào)分隔千分位數(shù)字

兩種方法,一種是使用 tolocaleString()

var a = 1999;
a.toLocaleString();     // "1,999"

另外一種是正則表達(dá)式

var re = /(?!^)(?=(\d{3})+$)/g;
var a = "12345678";
a.replace(re, ',');   // "12,345,678"
  1. 運(yùn)行 [1, 2, 2].fill(3, 1, 3) 會(huì)輸出什么? 答案是 [1,3,3]

fill 方法接受三個(gè)參數(shù):num,start,end 。num 是你要填充的數(shù)字,start 是填充的起始位置,end 是終止位置。fill(3,1,3) 表示從索引 1 開始到索引 3 之間的元素填充為 3

  1. ~~3.5 的結(jié)果是什么?答案是 3

對于非數(shù)字,~~ 的結(jié)果為0,有個(gè)例外是 ~~ true 結(jié)果為 1
對于大于 0 的數(shù),~~ 相當(dāng)于是Math.floor
對于小于 0 的數(shù),~~ 相當(dāng)于是Math.ceil

  1. 如何判斷一個(gè)數(shù)組的長度是奇數(shù)還是偶數(shù)?答案是len & 1,len 為數(shù)組長度,奇數(shù)結(jié)果為true

只要 “&&” 前面是false,無論 “&&” 后面是 true 還是 false,結(jié)果都將返 “&&” 前面的值;
只要 “||” 前面為 false,不管 “||” 后面是 true 還是 false,都返回 “||” 后面的值。

  1. JSON.parse 和 JSON.stringify 的作用?

JSON.parse 將一個(gè) json 轉(zhuǎn)化為 JavaScript Object string 類型
JSON.stringify 將一個(gè) string 轉(zhuǎn)化為 json 類型

  1. typeof null為什么等于 "object",它的判斷原理是什么

js 底層存儲(chǔ)變量采用二進(jìn)制,會(huì)在變量的機(jī)器碼的低位 1-3 位存儲(chǔ)其類型信息
000:對象
010:浮點(diǎn)數(shù)
100:字符串
110:布爾
1:整數(shù)
null:全0
undefined:-2^30
所以 typeof null 為顯示為 object 對象。

  1. 如何判斷一個(gè)元素是否為數(shù)組?

假設(shè)待判斷對象為 arr ,有四種方法,一是

Object.prototype.toString.call(arr) == '[object Array]'

或者是

arr instanceof Array

又或是

Array.isArray(arr)

第四種方法可以用

arr.__proto__.constructor == Array
  1. <<>> 運(yùn)算符相關(guān)操作?

左移 << 將一個(gè)數(shù)的二進(jìn)制表示向左移動(dòng) n 位,右邊用0填充。
右移 >> 將一個(gè)數(shù)的二進(jìn)制表示向右移 n 位,舍棄被移出的位。
簡單點(diǎn)說,a >> n 相當(dāng)于用 a 去除以 2 的 n 次方,所以 8 >> 1 結(jié)果為 4;
而 a << n 相當(dāng)于用 a 去乘以 2 的 n 次方,所以 2 << 5 結(jié)果為 64

  1. function add() {} 和 var add = function (){} 解析時(shí)的區(qū)別

前者是執(zhí)行前就會(huì)被解析(執(zhí)行前就會(huì)讀取函數(shù)名),而后者是執(zhí)行過程中解析。所以 function add() {} 在執(zhí)行里面的代碼前就會(huì)讀取函數(shù)名 add , 而 var add = function (){} 則是執(zhí)行時(shí)逐步解析。

  1. 執(zhí)行以下代碼,輸出是什么?為什么?
var arr=[1,2,3,4,5];
for(var i=0;i<arr.length;i++) {
    arr[i]=function(){
      alert(i)
    } 
}
arr[3]();

答案是輸出 i 的值為 5 。這個(gè)是與閉包有關(guān)的經(jīng)??吹降膯栴},不管運(yùn)行函數(shù)時(shí)傳入的 i 是什么,最終輸出的都是 for 循環(huán)結(jié)束時(shí)的 i 的值,也就是數(shù)組的長度,因?yàn)槟涿瘮?shù)里的這句 alert(i) 執(zhí)行的時(shí)候需要找到 i 變量,里面沒有,那就只好去父級(jí)里找,而父級(jí)里的 i 在 for 循環(huán),所以最終給到它的是循環(huán)的終止條件,也就是 i = 5 。

解決方法也很簡單,要么把 for() 里面的 var 換成 let ,形成塊級(jí)作用域;要么使用閉包,匿名函數(shù)里在返回一個(gè)匿名函數(shù),并且傳入 i 立刻執(zhí)行。

(完)
謝謝您的閱讀,記得點(diǎn)個(gè)贊和關(guān)注。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容