前端面試題彙總

目錄

 

1.vue 的數據雙向綁定原理

理解雙向綁定要知道下面兩個重要的過程。

1.怎麼知道View層 /Model層 的數據發生改變了?

2.如果知道View層 /Model層 的數據發生改變了,怎麼通知變化呢?

2.es6新增的let 與 var 有優點

3.es6都新增了哪些東西?

1.let const

let:

const:

2.解構賦值

數組的解構賦值 : 

對象的解構賦值:

字符串的解構賦值:

數值和布爾值的解構賦值:

函數參數的解構賦值:

圓括號問題:

用途:


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.對變量xy指定默認值。

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.正則的擴展

 

 

 

 

 

 

 

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