成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官:如何讓 var [a, b] = {a: 1, b: 2} 解構賦值成功?

開發 前端
最近看到了一個面試題非常有意思,講得是:如何讓 var [a, b] = {a: 1, b: 2} 解構賦值成功?

最近看到了一個面試題非常有意思,講得是:如何讓 var [a, b] = {a: 1, b: 2} 解構賦值成功?。

我們知道在 js 中 []代表數組,{}代表對象 。但是在這個代碼中:

  • 解構賦值語法的左側是一個數組
  • 右側則應該是一個具有迭代器接口的對象(如數組、Map、Set等)。

因此,將對象 {a: 1, b: 2} 解構賦值給 [a, b] 會導致語法錯誤,那么怎么解決呢?我們來看一下!

思路

錯誤思路

既然將一個對象解構賦值給數組,是一個語法錯誤,那我們直接把這個解構語法變為對象的解構賦值語法不就好了。直接改成var { a, b } = { a: 1, b: 2 }; 如果這樣做的話,哈哈哈哈哈哈,恭喜你面試結束了。

所以我們得好好想清楚,這可是一個字節的面試題,它的考點可不是這么顯而易見的。

正確解題思路

我們首先來看看報錯是什么樣的:

var [a, b] = {a: 1, b: 2}
TypeError: {(intermediate value)(intermediate value)} is not iterable

這個錯誤是個類型錯誤,并且是對象有問題,因為對象是一個不具備迭代器屬性的數據結構。所以我們可以知道,這個面試題就是考驗我們對于迭代器屬性的認識,我們再來個場景加深下理解。

let arr = [1, 2, 3]
let obj = {
    a: 1,
    b: 2,
    c: 3
}
for(let item of arr){
    console.log(item)
}
for(let item of obj){
    console.log(item)
}

我們知道for of 只能遍歷具有迭代器屬性的,在遍歷數組的時候會打印出1 2 3,遍歷對象時會報這樣的一個錯誤TypeError: obj is not iterable,那么數組上的迭代器屬性究竟是什么樣的呢,我們來看一看。

我們可以在最下面發現,數組原型上有Symbol.iterator這樣一個屬性,這個屬性顯然是從Array身上繼承到的,并且這個屬性的值是一個函數體,如果我們調用一下這個函數體會怎么樣?我們打印來看看

console.log(arr.__proto__[Symbol.iterator]());
// Object [Array Iterator] {}

最重要的點來了

它返回的是一個對象類型,并且是一個迭代器對象!!!所以一個可迭代對象的基本結構是這樣的:

interable
{
    [Symbol.iterator]: function () {
        return 迭代器 (可通過next()就能讀取到值)
    }
}

我們可以得出只要一個數據結構身上,具有[Symbol.iterator]這樣一個屬性,且值是一個函數體,可以返回一個迭代器的話,我們就稱這個數據結構是可迭代的。

這時候我們回到面試題之中,面試官要我們讓 var [a, b] = {a: 1, b: 2} 這個等式成立,那么有了上面的鋪墊,我們可以知道,我們接下來的操作就是:人為的為對象打造一個迭代器出來,也就是讓對象的隱式原型可以繼承到迭代器屬性,我們可以先這樣做:

Object.prototype[Symbol.iterator] = function(){

}

var [a, b] = {a: 1, b: 2}
console.log(a,b);

這樣的話,報錯就改變了,變成:

TypeError: Result of the Symbol.iterator method is not an object

接下來,我們知道var [a, b] = [1, 2]這是肯定沒有問題的,所以我們可以將對象身上的迭代器,打造成和數組身上的迭代器(arr[Symbol.iterator])一樣,代碼如下:

Object.prototype[Symbol.iterator] = function(){
    // 使用 Object.values(this) 方法獲取對象的所有值,并返回這些值的迭代器對象
    return Object.values(this)[Symbol.iterator]()
}

這段代碼是將 Object.prototype 上的 [Symbol.iterator] 方法重新定義為一個新的函數。新的函數通過調用 Object.values(this) 方法獲取對象的所有值,并返回這些值的迭代器對象。

通過這個代碼,我們可以使得任何 JavaScript 對象都具有了迭代能力。例如,對于一個對象 obj,我們可以直接使用 for...of 循環或者 ... 操作符來遍歷它的所有值。

責任編輯:華軒 來源: 程序員Sunday
相關推薦

2019-09-19 14:03:32

B樹節點數據結構

2020-09-08 06:43:53

B+樹面試索引

2021-12-13 09:02:13

localStorag面試前端

2025-05-20 01:00:00

2015-08-13 10:29:12

面試面試官

2012-12-04 10:16:10

創業B2B

2021-05-31 11:43:19

B-樹MySQL索引

2021-06-02 10:23:06

索引B+樹數據

2023-02-16 08:10:40

死鎖線程

2022-10-08 08:00:00

JavaScript數組開發

2021-07-04 15:16:14

索引B+數據庫

2010-08-12 16:28:35

面試官

2024-04-03 00:00:00

Redis集群代碼

2024-09-11 22:51:19

線程通訊Object

2021-07-06 07:08:18

管控數據數倉

2025-03-17 00:00:00

2023-11-20 10:09:59

2024-02-20 14:10:55

系統緩存冗余

2024-03-18 14:06:00

停機Spring服務器

2019-07-23 09:30:17

HTTP 2.0HTTP協議傳輸
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久精品一区 | 国产黄色小视频 | 中文字幕成人 | 天堂中文资源在线 | 日韩在线一区二区三区 | 欧美一级二级三级视频 | 天天av天天好逼 | 亚洲精品自在在线观看 | 亚洲 欧美 另类 综合 偷拍 | 精品日韩 | 国产专区在线 | 免费在线播放黄色 | 精品99爱视频在线观看 | 欧美一区二区在线播放 | 欧美精品三区 | 99久久婷婷国产综合精品电影 | 在线视频成人 | 国产精品一区二区av | 日韩欧美一区二区三区四区 | 日韩一区二区在线免费观看 | av网站在线播放 | 亚洲色图插插插 | 一区二区三区不卡视频 | 日韩不卡三区 | 能看的av | 日本a视频 | 日韩一区二区在线视频 | 欧美在线播放一区 | 色综合色综合色综合 | 国产精品久久网 | a视频在线观看 | 91亚洲国产成人久久精品网站 | 成人一区在线观看 | 91在线一区二区三区 | 自拍 亚洲 欧美 老师 丝袜 | 在线观看成人精品 | 99精品一区二区 | 国产一极毛片 | 亚洲一区二区精品视频 | 色啪网| 日本一区二区高清不卡 |