[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
~~~