[TOC]
# 題1、什么是全局變量?什么是局部變量?
答:
局部變量: 定義在函數內的變量,只能在函數中使用,并且只有在調用函數時存在,函數執行完之后變量就銷毀了(流星一樣,一劃就沒了)。
全局變量: 定義在函數外的變量,在所有地方都可以使用,并且變量的值一直存在(像恒星一樣,一直存在)。
# 題2、定義變量可以使用 let 和 var ,那它們有什么區別?
答:
var
1. 能定義全局變量和局部變量
2. 可以重復定義變量
3. 變量提升(先使用變量,后定義)
let
1. 能定義全局變量、局部變量、塊級變量(大括號之內的變量)
2. 不能重復定義一個變量
3. 不能變量提升(必須先定義,再使用)
~~~
var name = 'tom'
var name = 'jack' ? // 可以
?
let age = 10
let age = 20 ? ? // 報錯!!重復定義了
?
// let 定義塊級作用域:只能在 for 循環中使用
for(let i=0; i<10; i++) {
?
}
console.log( i ) ?// 報錯!!
?
// var 定義的是全局變量(函數外)
for(var i=0; i<10; i++) {
?
}
console.log( i ) ?// 11
~~~
# 題3、break 是干什么用的?continue 是干什么用的?
答:
break: 退出循環(出循環)
continue: 結束本次循環,進入下一次循環(還在循環內)
~~~
// break 的用法
for (let i = 0; i < 3; i++) {
? ?if (i == 1) break ? // 退出循環
? ?console.log(i); // 輸出結果: 0
}
?
// continue 的用別
for (let i = 0; i < 3; i++) {
? ?if (i == 1) continue ? // 結束本次循環,進入下一次循環
? ?console.log(i); // 輸出結果: 0 2
}
~~~
# 題4、 switch ... case 是干什么用的?
答: 多向分支,當分支多的時候性能比if ... else更好,類似于 if ...else if ... else if ... else if...
~~~
// switch ... case 的用法
var day;
// getDay() 方法返回 0 至 6 的數字周名
switch (new Date().getDay()) {
? ?case 0:
? ? ? ?day = "星期天";
? ? ? ?break;
? ?case 1:
? ? ? ?day = "星期一";
? ? ? ?break;
? ?case 2:
? ? ? ?day = "星期二";
? ? ? ?break;
? ?case 3:
? ? ? ?day = "星期三";
? ? ? ?break;
? ?case 4:
? ? ? ?day = "星期四";
? ? ? ?break;
? ?case 5:
? ? ? ?day = "星期五";
? ? ? ?break;
? ?case 6:
? ? ? ?day = "星期六";
? ? ? ?break;
}
console.log(day); ? // 當前星期
?
~~~
注意:每個條件中需要添加 break 退出 switch,如果不添加 break 會直接執行下面的 case 直到遇到 break;
default 關鍵詞規定不存在 case 匹配時所運行的代碼;
~~~
let day ?= 1
switch(day) {
? ?case 1: ? ? // 匹配
? ? ? ?console.log('星期一') ? ?// <-- 這里沒加 break 所以會向下執行下一個 case
? ?case 2:
? ? ? ?console.log('星期二')
? ? ? ?break
?// .....
? ?case 7:
? ? ? ?console.log('星期日')
? ? ? ?break
? ?default: ?// 如果前面的條件都不滿足時執行
? ? ? ?console.log('數字不是1~7')
? ? ? ?break
}
?
//最終輸出結果是:星期一 星期二
~~~
# 題5、return 是干什么用的?
答: 只能用在函數中。
用途:
1. 退出函數
2. 在退出的時候可以把函數中的數據返回到調用它的地方
~~~
// return 的用法
function abc() {
? ?let a = 10
? ?let b = 20
? ?return a + b ? // 退出函數并返回 a+ b 的值
}
console.log(abc()) ? // 30
?
// 如果函數中沒有 return 那么函數的返回值是 undefined:
function abc() {
? ?let a = 10
? ?let b = 20
? ?a + b ? // 退出函數并返回 a+ b 的值
}
console.log(abc()) ? // undefined
~~~
# 題6、arguments 是干什么用的?
答:
1. 只能用在函數中
2. 它是一個數組
3. 代表調用函數時傳的參數
~~~
// arguments 用法
function abc() {
? ?console.log(typeof arguments); ?// object
? ?console.log(arguments) ?// [Arguments] { '0': 'tom', '1': 10, '2': 'hi' }
? ?console.log(arguments.length) ? // 3
? ?// 可以使用索引確定單個參數的類型
? ?console.log(typeof arguments[0]); ? // string
}
abc('tom', 10, 'hi')
~~~
# 題7、在函數中,如何知道調用這個函數時一共傳了幾個參數?
答: 在函數中使用 `arguments.length` 。
~~~
function abc() {
? ?console.log(arguments.length)
}
?
abc(1,2,3,4,6,7) ? // 6
abc('hello') ? ? ? ?// 1
~~~
# 題8、 JS 中如何獲取一個隨機數?
答: 使用 `Math.random` 可以得到一個\[0~1)之間的隨機數(包含0,不包含1)
# 題9、如何獲取當前時間?
答: 當前時間:`new Date()` 。
當前時間戳:`Date.now()` ;得到的是毫秒為單位的秒數。
時間戳: 從 1970年1月1日0時0分0秒 這個時間點到現在所經歷的秒數。
# 題10、如何把一個變量強制類型轉換成數字?
答: 使用 `Number` 或 `+` 。
parseInt:轉整數
parseFloat: 轉小數
~~~
// 把一個變量強制類型轉換成數字
let a = '013'
let b = Number(a) ? // 13
let c = +a; ? ? // 13
console.log(c);
~~~
# 題11、NaN 是什么?
答: Not a Number (不是一個數字) 。一些不合理的數學運算時會得到 NaN。
~~~
// NaN
let a = 'abc'
let b = Number(a) ? // NaN ? abc 轉完之后不是一個數字
console.log('abc' - 1234) ? // NaN
~~~
# 題12、當我們進行小數運算時,經常會得到不精確的值,這時怎么辦?
答: 使用 `toFixed` 指定要精確到的小數位。
~~~
// 做小數運算精確
console.log(0.34 + 0.48); ? // 0.8200000000000001
?
// 解決方法: 使用 toFixed 明確小數位
(0.34 + 0.48).toFixed(2) ? // 0.82
~~~