目錄
2.如果知道View層 /Model層 的數據發生改變了,怎麼通知變化呢?
1.vue 的數據雙向綁定原理
看完大佬的分析一下明白了(有源碼的):https://blog.csdn.net/tcy83/article/details/80959725
這裏我就做簡寫了;
vue數據雙向綁定來源與框架MVVM 數據雙向綁定就是通過VM(ViewModel) 實現了View層 與Model層 的數據雙向綁定的。
理解雙向綁定要知道下面兩個重要的過程。
1.怎麼知道View層 /Model層 的數據發生改變了?
View層:我們可以通過onchange事件監聽,對相應的input texteare等組件,進行數據改變的監聽。
Module層:我們首先對當前實例對象的屬性進行遍歷,對每一個對象的屬性添加一個監聽器(observe),監聽器中有set get方法,對我們的操作進行劫持,當我們修改實例對象的屬性時,會執行set方法,監聽到相應的數據發生改變了。
2.如果知道View層 /Model層 的數據發生改變了,怎麼通知變化呢?
當observe監聽到數據發生改變時,會通知相應的訂閱者(watcher),那是怎麼通知的呢?每個屬性的監聽器都會有一個發佈者(Dep),dep有一個內置數組,保存了與當前observe相對應的watcher。watcher會對對象元素的和改變前進行比較,如果元素的值發生改變,就會執行回調函數,渲染view層。
2.es6新增的let 與 var 有優點
1.let的新增使js擁有了塊級作用域
2.let不會向var一樣存在變量提升和暫時性死區
3.let不可以重複定義
3.es6都新增了哪些東西?
(說的越多越好,最好有條理,還能講清楚裏面的東西)
需要詳細的資料那就阮大哥寫的es6:http://es6.ruanyifeng.com/#README
1.let const
let:
let的新增,爲js提供了塊級作用域,彌補了var的一些不足。
const:
const的新增,爲js提供了常量,被const定義的變量不允許被修改,也爲代碼中誤改變量出錯,帶來了方便。
2.解構賦值
數組的解構賦值 :
1.如果解構,不成功,變量的值爲undefined ;
let [foo] = [];
let [bar, foo] = [1];
例子中的foo均爲undefined
2.可以進行不完全解構也可以嵌套:
let [x, y] = [1, 2, 3];
x // 1
y // 2
let [a, [b], d] = [1, [2, 3], 4];
a // 1
b // 2
d // 4
3.只有等號右邊具有Iterator 接口或者轉化爲對象具有Iterator 接口才能被解構賦值。
// 報錯
let [a] = 1;
let [a] = false;
let [a] = NaN;
let [a] = undefined;
let [a] = null;
let [a] = {};
4.默認值:只有一個數組嚴格等於undefined時,纔會使用默認值
let [foo = true] = [];
foo // true
let [x, y = 'b'] = ['a']; // x='a', y='b'
let [x, y = 'b'] = ['a', undefined]; // x='a', y='b'
默認值可以是變量(變量需要先聲明),也可以是表達式(但表達式是惰性求值的)
對象的解構賦值:
1.對象的解構與數組的解構不同的是,數組的解構,是有順序的,而對象的解構是無順序的,而是匹配模式。
let { foo: baz } = { foo: 'aaa', bar: 'bbb' };
baz // "aaa"
let obj = { first: 'hello', last: 'world' };
let { first: f, last: l } = obj;
f // 'hello'
l // 'world'
2.如果匹配值與變量名一樣,可以簡寫:
let { foo: foo,bar: bar } = { foo: 'aaa', bar: 'bbb' };
foo// "aaa"
bar// "bbb"
//簡寫
let { foo,bar } = { foo: 'aaa', bar: 'bbb' };
foo// "aaa"
bar// "bbb"
字符串的解構賦值:
字符串也可以解構賦值。這是因爲此時,字符串被轉換成了一個類似數組的對象。
const [a, b, c, d, e] = 'hello';
a // "h"
b // "e"
c // "l"
d // "l"
e // "o"
let {length : len} = 'hello';
len // 5
數值和布爾值的解構賦值:
解構賦值時,如果等號右邊是數值和布爾值,則會先轉爲對象。變爲對象的解構賦值。
函數參數的解構賦值:
函數參數在使用默認值時的兩種形式。
1.對變量x
和y
指定默認值。
function move({x = 0, y = 0} = {}) {
return [x, y];
}
move({x: 3, y: 8}); // [3, 8]
move({x: 3}); // [3, 0]
move({}); // [0, 0]
move(); // [0, 0]
2.對 函數的參數使用默認值。
此時的解構,爲先進行{ x , y} = { x:3 },再進行{x:3} = { x: 0, y: 0 }。
function move({x, y} = { x: 0, y: 0 }) {
return [x, y];
}
move({x: 3, y: 8}); // [3, 8]
move({x: 3}); // [3, undefined]
move({}); // [undefined, undefined]
move(); // [0, 0]
圓括號問題:
因爲編譯器沒法知道一個式子到底是模式,還是表達式。只要有可能,就不要在模式中放置圓括號。
用途:
1.交換變量
2.從函數返回多個值。
3.函數參數的定義
4.提取JSON數據。
5.函數參數的默認值
6.遍歷map
7.對於加載模塊時,需要哪些方法,進行輸入模塊的指定。
3.字符串的擴展。
1.字符串的遍歷器接口
ES6 爲字符串添加了遍歷器接口,使得字符串可以被for...of
循環遍歷。
for (let codePoint of 'foo') {
console.log(codePoint)
}
// "f"
// "o"
// "o"
2.模板字符串
1.模板字符串可以嵌套在模板中的變量裏。
2.如果想執行模板字符串,可以把模板字符串作爲函數的返回值,來執行函數。
4.字符串的新增方法
1.String.raw()
用於模板字符串的標籤模板
2.實例方法:includes(),
判斷字符串中是否包含字符串參數
3.startsWith(), endsWith()
字符串匹配,以什麼開始,以什麼結束
4.repeat()
將原字符串進行重複n次。
5.實例方法:padStart(),padEnd()
字符串補全功能,從開始補全,從結尾補全
6.實例方法:trimStart(),trimEnd()
字符串去空格。
7.實例方法:matchAll()
方法返回一個正則表達式在當前字符串的所有匹配
5.正則的擴展