7. this指向
確認this指向是在執行代碼的時候,而不是定義代碼的時候。因爲this是執行上下文的一部分。
Example1:
var a = { name: 'A', fn: function () { console.log(this.name) } } a.fn() // this === a a.fn.call({name: 'B'}) // this === {name: 'B'} var fn1 = a.fn fn1() // this === window
解析:
this執行會有不同,主要集中在這幾個場景中
- 作爲構造函數執行,構造函數中
- 作爲對象屬性執行,上述代碼中a.fn()
- 作爲普通函數執行,上述代碼中fn1()
- 用於call apply bind,上述代碼中a.fn.call({name: 'B'})
Example2:
var x = 0;
function test() {
console.log(this.x);
}
var obj = {};
obj.x = 1;
obj.m = test;
obj.m.apply({x: 2}) // 2 //apply()的參數爲空時,默認調用全局對象。
obj.m.apply() // 0 //apply()的參數爲空時,默認調用全局對象。
obj.m.apply(obj) // 1 //apply()的參數爲空時,默認調用全局對象。
8. 同步和異步
Example1: (異步)
console.log(100)
setTimeout(function(){
console.log(200)
},100)
console.log(300)
解析:
打印順序:100,300, 200.
原因:因爲js是單線程,會把3個打印任務存入隊列之中,會異步繼續往下執行。所以是先打印100, 300,最後第二個console是在100ms以後打印的
Example2: (單線程)
var test = true
setTimeout(function(){
test = false
})
while(test){
console.log(100)
}
解析:
while循環的判斷條件是,test爲true時執行,每執行完一遍時,繼續從頭重新執行。因爲js是單線程,而while的這個特性會將js的單線程佔滿,不會有時間(線程)去跑setTimeout了。所以,答案是死循環。
9. ES6 / ES7新標準的考察
class聲明構造函數:取代之前的構造函數,從語法更加符合面向對象的寫法。
基本格式:
class Name() {
constructor(a,b) {
...
}
say() {
...
}
}
const a = new Name(1,2)
a.say();
//es6的class實現繼承
class Animal{
constructor(name) {
this.name = name
// console.log(this.name, '--this.name--')
}
eat() {
console.log(`${this.name}` + '吃東西')
}
}
class Dog extends Animal {
constructor(name){
super(name)
this.name = name
}
say() {
console.log(`${this.name} say`)
}
}
var hashiqi = new Dog('哈士奇')
hashiqi.eat()
hashiqi.say()
注意:
1. 使用extends即可實現繼承,更符合面向對象的語言的寫法
2. 子類的constructor一定要使用super,以繼承父類的constructor.
10. es6新增的數據類型:set 和 map
set和map是對當前數組和對象的擴展。
set和map的重要特性:
1. set不允許數組存在重複的元素。
Example:
const set = new Set();
[1,2,3,3,1,2,3].forEach(item => set.add(item))
console.log(set, '--set--')//Set(3) {1, 2, 3}
Set 實例的屬性和方法有:
- size:獲取元素數量。
- add(value):添加元素,返回 Set 實例本身。
- delete(value):刪除元素,返回一個布爾值,表示刪除是否成功。
- has(value):返回一個布爾值,表示該值是否是 Set 實例的元素。
- clear():清除所有元素,沒有返回值。
Set 實例的遍歷,可使用如下方法
- keys():返回鍵名的遍歷器。
- values():返回鍵值的遍歷器。不過由於 Set 結構沒有鍵名,只有鍵值(或者說鍵名和鍵值是同一個值),所以keys()和values()返回結果一致。
- entries():返回鍵值對的遍歷器。
- forEach():使用回調函數遍歷每個成員
2. map允許key值是任何數據類型,普通對象只能是字符串或數組
Example:
const map = new Map();
const obj = {p: 'Hello World'};
map.set(obj, 'OK') //Map中可以將任何數據類型存爲key值(包括對象)
console.log(map.get(obj)) // "OK"
console.log(map.has(obj)) // true
console.log(map.delete(obj)) // true
console.log(map.has(obj)) // false
Map 實例的屬性和方法如下:
- size:獲取成員的數量
- set:設置成員 key 和 value
- get:獲取成員屬性值
- has:判斷成員是否存在
- delete:刪除成員
- clear:清空所有
Map 實例的遍歷方法有:
- keys():返回鍵名的遍歷器。
- values():返回鍵值的遍歷器。
- entries():返回所有成員的遍歷器。
- forEach():遍歷 Map 的所有成員。
10. iterator
Iterator接口(iterator對象,迭代器對象)
對於可迭代的數據解構,ES6在內部部署了一個[Symbol.iterator]屬性,它是一個函數,執行後會返回iterator對象(也叫迭代器對象,也叫iterator接口),擁有[Symbol.iterator]屬性的對象即被視爲可迭代的,比如一個空數組。
iterator是一個對象,具有一個next方法可以調用。
Example:
var arr = [1,2,3]
let iterator = arr[Symbol.iterator]() //需要使用鍵值對的形式訪問Symbol.iterator
console.log(iterator.next())
console.log(iterator.next())
console.log(iterator.next())
console.log(iterator.next())
解析:
next方法返回又會返回一個對象,有value和done兩個屬性,value即每次迭代之後返回的值,而done表示是否還需要再次循環,可以看到當value爲undefined時,done爲true表示循環終止。
梳理一下:
- 可迭代的數據結構會有一個[Symbol.iterator]方法
- [Symbol.iterator]執行後返回一個iterator對象
- iterator對象有一個next方法
- next方法執行後返回一個有value,done屬性的對象