在學(xué)習(xí) JS 的過程中,很多知識(shí)往往看一遍就過去了,然后自以為掌握了,其實(shí)再次碰到不一定能答得出來,看到一些有趣的東西還是要?jiǎng)邮謱?shí)踐一下,而且時(shí)不時(shí)復(fù)習(xí)一下,非常有利于加深記憶。今天是五一,假日期間,好好休息玩耍,也別學(xué)什么新東西了,你可以看看以下這些問題以及相關(guān)知識(shí)點(diǎn)來看看自己掌握了多少,溫故知新。
問題不多,耐心看完。最下方有答案,先別急著翻,自己先想想。
問題
- JS 格式化,用逗號(hào)分隔千分位數(shù)字
- 運(yùn)行
[1, 2, 2].fill(3, 1, 3)會(huì)輸出什么 -
~~3.5的結(jié)果是什么 - 如何判斷一個(gè)數(shù)組的長度是奇數(shù)還是偶數(shù)
- JSON.parse 和 JSON.stringify 的作用
-
typeof null為什么等于"object",它的判斷原理是什么 - 如何判斷一個(gè)元素是否為數(shù)組
-
<<和>>運(yùn)算符 - function add(){} 和 var add = function(){} 解析時(shí)的區(qū)別
- 執(zhí)行以下代碼,輸出是什么?為什么?
var arr=[1,2,3,4,5];
for(var i=0;i<arr.length;i++) {
arr[i]=function(){
alert(i)
}
}
arr[3]();
參考答案
如有錯(cuò)誤,請幫忙指正。
- 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"
- 運(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
-
~~3.5的結(jié)果是什么?答案是3
對于非數(shù)字,~~ 的結(jié)果為0,有個(gè)例外是 ~~ true 結(jié)果為 1
對于大于 0 的數(shù),~~ 相當(dāng)于是Math.floor
對于小于 0 的數(shù),~~ 相當(dāng)于是Math.ceil
- 如何判斷一個(gè)數(shù)組的長度是奇數(shù)還是偶數(shù)?答案是
len & 1,len 為數(shù)組長度,奇數(shù)結(jié)果為true
只要 “&&” 前面是false,無論 “&&” 后面是 true 還是 false,結(jié)果都將返 “&&” 前面的值;
只要 “||” 前面為 false,不管 “||” 后面是 true 還是 false,都返回 “||” 后面的值。
- JSON.parse 和 JSON.stringify 的作用?
JSON.parse 將一個(gè) json 轉(zhuǎn)化為 JavaScript Object string 類型
JSON.stringify 將一個(gè) string 轉(zhuǎn)化為 json 類型
-
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 對象。
- 如何判斷一個(gè)元素是否為數(shù)組?
假設(shè)待判斷對象為 arr ,有四種方法,一是
Object.prototype.toString.call(arr) == '[object Array]'
或者是
arr instanceof Array
又或是
Array.isArray(arr)
第四種方法可以用
arr.__proto__.constructor == Array
-
<<和>>運(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
- function add() {} 和 var add = function (){} 解析時(shí)的區(qū)別
前者是執(zhí)行前就會(huì)被解析(執(zhí)行前就會(huì)讀取函數(shù)名),而后者是執(zhí)行過程中解析。所以 function add() {} 在執(zhí)行里面的代碼前就會(huì)讀取函數(shù)名 add , 而 var add = function (){} 則是執(zhí)行時(shí)逐步解析。
- 執(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)注。