一道解构面试题

ES6推出了一种新的语法解构赋值,关于它的用法我们都已经很熟练了,但是解构的原理很多人还不了解。 本章我们通过一道题目,了解解构的本质,并学习灵活运用解构原理来处理一些算法。

// 让下面的代码成立
var [ a, b ] = { a: 1, b: 2}

运行结果:
TypeError: {(intermediate value)(intermediate value)} is not iterable

思路分析

报错信息

  • 报错信息表示,右侧结构并不是一个 可迭代对象
  • 思路:通过一些操作,让右侧的结构变为可迭代对象。

可迭代对象

  • 可迭代对象:满足可迭代协议
{
 [Symbol.interator]: function() {
   return 迭代器
 }
}
  • 迭代器示意, 通过迭代器中的next方法 (每执行一次,迭代出一个值)
 let arr = [1, 2, 3]
 const iter = arr[Symbol.iterator]()
 console.log('迭代结果:', iter.next())  // 迭代结果:{ value: 1, done: false }
 console.log('迭代结果:', iter.next())  // 迭代结果:{ value: 2, done: false }
 console.log('迭代结果:', iter.next())  // 迭代结果:{ value: 3, done: false }
 console.log('迭代结果:', iter.next())  // 迭代结果:{ value: undefined, done: true}

解构原理示意

  const arr = [1, 2, 3]
  var [a, b] = arr
  // 等同于执行了以下操作:
  const iter = arr[Symbol.iterator]()
  var a = iter.next().value
  var b = iter.next().value

解题

1. 初始版

var [ a, b ] = {
  a: 1,
  b: 2,
  [Symbol.iterator]: function() {
    var arr =[1, 2]
    const iter = arr[Symbol.iterator]()
    return iter
  }
}
console.log(a, b)  // 1, 2

2.封装优化

Object.prototype[Symbol.iterator] = function() {
  var arr = Object.values(this)
  const iter = arr[Symbol.iterator]()
  return iter
}

3.进阶

使用ES6函数生成器yield

Object.prototype[Symbol.iterator] = function*() {
  return yield Object.values(this)
}
var [ a, b] = { a: 1, b: 2}
console.log(a, b)  // 1, 2
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值