# ES6 Js 面試詳解
###### tags: `interview`
==========================================================================
Q1. ES6 中 for…of 與 for…in 的區別?
==========================================================================
A.
1、在循環對象屬性的時候,使用for…in,在遍歷數組的時候的時候使用for…of。
2、for…in循環出的是key,for…of循環出的是value
3、for…of是ES6新引入的特性。修復了ES5引入的for…in的不足
4、for…of不能循環普通的對象,需要通過和Object.keys()搭配使用
var student = {
name: 'Jack',
age: 27,
sex: 'female'
};
var arr = [1, 4, 'small'];
arr.school = 'zheda';
// 1、for...in 遍歷對象,得到key
for (let key in student) {
console.log(key); // name,age,sex
}
//for (let i of student) { // 報錯:student is not iterable(可迭代的)
// console.log(i);
//}
// 2、直接使用for...of報錯,可以用Object.keys(obj);
for (let key of Object.keys(student)) {
// 用Object.keys()獲取對象key的數組
console.log(key); // name,age,sex
}
// 3、for...in遍歷數組,得到index + key
for (let i in arr) {
console.log(i); // 0,1,2,school
}
// 4、for...of遍歷數組,得到value
for (let key of arr) {
console.log(key); // 1,4,small
}
==========================================================================
Q2 e.target and e.currentTarget 的區別?
==========================================================================
A.
e.currentTarget : 指的是註冊事件物件
e.target : 指的是實際觸發事件的物件
==========================================================================
Q3 e.stopPropagation() and e.preventDefault() 的區別?
==========================================================================
A.
e.stopPropagation() : 阻止事件傳播(冒泡)
e.preventDefault() : 是停止事件的默認動作
==========================================================================
Q4 請判斷以下等式左右是否相同
==========================================================================
1. 100 === "100"
2. 'abc' === "abc"
3. NaN === NaN
4. NaN == NaN
5. 100 == "100"
6. "1" == "01"
A.
1. return false
2. return true
3. return false
4. return false,NaN和所有值包括自己都不相等
5. return true
6. return false
==========================================================================
Q5 請寫出下列程式印出的值
==========================================================================
1.
let APP_NAME = "ES6_let";
const getAppName = function () {
APP_NAME = "ES6_APP_NAME";
return APP_NAME;
};
console.log(getAppName());
2.
const APP_NAME = "ES6_const";
const getAppName = function () {
APP_NAME = "ES6_APP_NAME";
return APP_NAME;
};
console.log(getAppName());
3.
const numbers = ['one', 'two'];
numbers.push('three');
console.log(numbers);
4.
let constants = Object.freeze({
APP_NAME: "ES6_let"
})
constants.APP_NAME = "ES6_APP_NAME";
console.log(constants.APP_NAME);
5.
let constants = Object.freeze({
APP_NAME: "ES6_let"
})
constants = {
APP_NAME: "ES6_APP_NAME"
}
console.log(constants.APP_NAME);
A.
1. ES6_APP_NAME
2. throw TypeError
3. ['one', 'two', 'three']
4. ES6_let
5. ES6_APP_NAME
==========================================================================
Q6 請寫出var, let, const 差異
==========================================================================
A.
var 全域變數
let 區塊域變數,一般使用在變數(variable)可能會被重新指定值。例如:在迴圈(for loop)中
const 常數,一般使用在識別值(identifier)不會被重新指定值。例如:宣告
==========================================================================
Q7 請寫出JavaScript 陣列處理方法 filter(), find(), forEach(), map(), every(), some(), reduce() 用途
==========================================================================
A.
1. filter() : filter() 會回傳一個陣列,其條件是 return 後方為 true 的物件,很適合用在搜尋符合條件的資料。
2. find() : find() 只會回傳一次值,且是第一次為 true 的值。當有2個相同時,只會回傳第一個。
3. forEach() : 不會額外回傳值,只單純執行每個陣列內的物件或值。
4. map() : 使用 map() 時他需要回傳一個值,他會透過函式內所回傳的值組合成一個陣列。
如果不回傳則是 undefined,回傳數量等於原始陣列的長度,很適合將原始的變數運算後重新組合一個新的陣列。
5. every() : 可以檢查所有的陣列是否符合條件,這僅會回傳一個值 true or false,可以用來檢查陣列中的內容是否符合特定條件。
6. some() : some() 與 every() 非常接近,都是回傳 true or false,差異僅在 every() 需完全符合,some() 僅需要部分符合。
7. reduce() : reduce() 和其他幾個差異就很大了,他可以與前一個回傳的值再次作運算。