day2( 2019-2-12 周2)this指向,es6/es7新規 iterator迭代器

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屬性的對象

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章