【JS】一道解构面试题

### 文章目录

  • [@[TOC]](#文章目录 @[TOC] 一道解构面试题 题目 运行结果 原理 概念 数组迭代器 答案 答案(1)、在对象中添加一个数组迭代器 1.使用临时数组添加迭代器 2. 对象值输出结果 3.使用Object.values(this);拿到对象的值 答案(2)、在对象原型上添加数组迭代器 1.按步骤实现数组迭代器 2. 简化步骤 答案(3)、使用迭代器生成器)
  • [一道解构面试题](#文章目录 @[TOC] 一道解构面试题 题目 运行结果 原理 概念 数组迭代器 答案 答案(1)、在对象中添加一个数组迭代器 1.使用临时数组添加迭代器 2. 对象值输出结果 3.使用Object.values(this);拿到对象的值 答案(2)、在对象原型上添加数组迭代器 1.按步骤实现数组迭代器 2. 简化步骤 答案(3)、使用迭代器生成器)
  • [题目](#文章目录 @[TOC] 一道解构面试题 题目 运行结果 原理 概念 数组迭代器 答案 答案(1)、在对象中添加一个数组迭代器 1.使用临时数组添加迭代器 2. 对象值输出结果 3.使用Object.values(this);拿到对象的值 答案(2)、在对象原型上添加数组迭代器 1.按步骤实现数组迭代器 2. 简化步骤 答案(3)、使用迭代器生成器)
  • [运行结果](#文章目录 @[TOC] 一道解构面试题 题目 运行结果 原理 概念 数组迭代器 答案 答案(1)、在对象中添加一个数组迭代器 1.使用临时数组添加迭代器 2. 对象值输出结果 3.使用Object.values(this);拿到对象的值 答案(2)、在对象原型上添加数组迭代器 1.按步骤实现数组迭代器 2. 简化步骤 答案(3)、使用迭代器生成器)
  • [原理](#文章目录 @[TOC] 一道解构面试题 题目 运行结果 原理 概念 数组迭代器 答案 答案(1)、在对象中添加一个数组迭代器 1.使用临时数组添加迭代器 2. 对象值输出结果 3.使用Object.values(this);拿到对象的值 答案(2)、在对象原型上添加数组迭代器 1.按步骤实现数组迭代器 2. 简化步骤 答案(3)、使用迭代器生成器)
  • [概念](#文章目录 @[TOC] 一道解构面试题 题目 运行结果 原理 概念 数组迭代器 答案 答案(1)、在对象中添加一个数组迭代器 1.使用临时数组添加迭代器 2. 对象值输出结果 3.使用Object.values(this);拿到对象的值 答案(2)、在对象原型上添加数组迭代器 1.按步骤实现数组迭代器 2. 简化步骤 答案(3)、使用迭代器生成器)
  • [数组迭代器](#文章目录 @[TOC] 一道解构面试题 题目 运行结果 原理 概念 数组迭代器 答案 答案(1)、在对象中添加一个数组迭代器 1.使用临时数组添加迭代器 2. 对象值输出结果 3.使用Object.values(this);拿到对象的值 答案(2)、在对象原型上添加数组迭代器 1.按步骤实现数组迭代器 2. 简化步骤 答案(3)、使用迭代器生成器)
  • [答案](#文章目录 @[TOC] 一道解构面试题 题目 运行结果 原理 概念 数组迭代器 答案 答案(1)、在对象中添加一个数组迭代器 1.使用临时数组添加迭代器 2. 对象值输出结果 3.使用Object.values(this);拿到对象的值 答案(2)、在对象原型上添加数组迭代器 1.按步骤实现数组迭代器 2. 简化步骤 答案(3)、使用迭代器生成器)
  • [答案(1)、在对象中添加一个数组迭代器](#文章目录 @[TOC] 一道解构面试题 题目 运行结果 原理 概念 数组迭代器 答案 答案(1)、在对象中添加一个数组迭代器 1.使用临时数组添加迭代器 2. 对象值输出结果 3.使用Object.values(this);拿到对象的值 答案(2)、在对象原型上添加数组迭代器 1.按步骤实现数组迭代器 2. 简化步骤 答案(3)、使用迭代器生成器)
  • [1.使用临时数组添加迭代器](#文章目录 @[TOC] 一道解构面试题 题目 运行结果 原理 概念 数组迭代器 答案 答案(1)、在对象中添加一个数组迭代器 1.使用临时数组添加迭代器 2. 对象值输出结果 3.使用Object.values(this);拿到对象的值 答案(2)、在对象原型上添加数组迭代器 1.按步骤实现数组迭代器 2. 简化步骤 答案(3)、使用迭代器生成器)
  • [2. 对象值输出结果](#文章目录 @[TOC] 一道解构面试题 题目 运行结果 原理 概念 数组迭代器 答案 答案(1)、在对象中添加一个数组迭代器 1.使用临时数组添加迭代器 2. 对象值输出结果 3.使用Object.values(this);拿到对象的值 答案(2)、在对象原型上添加数组迭代器 1.按步骤实现数组迭代器 2. 简化步骤 答案(3)、使用迭代器生成器)
  • [3.使用Object.values(this);拿到对象的值](#文章目录 @[TOC] 一道解构面试题 题目 运行结果 原理 概念 数组迭代器 答案 答案(1)、在对象中添加一个数组迭代器 1.使用临时数组添加迭代器 2. 对象值输出结果 3.使用Object.values(this);拿到对象的值 答案(2)、在对象原型上添加数组迭代器 1.按步骤实现数组迭代器 2. 简化步骤 答案(3)、使用迭代器生成器)
  • [答案(2)、在对象原型上添加数组迭代器](#文章目录 @[TOC] 一道解构面试题 题目 运行结果 原理 概念 数组迭代器 答案 答案(1)、在对象中添加一个数组迭代器 1.使用临时数组添加迭代器 2. 对象值输出结果 3.使用Object.values(this);拿到对象的值 答案(2)、在对象原型上添加数组迭代器 1.按步骤实现数组迭代器 2. 简化步骤 答案(3)、使用迭代器生成器)
  • [1.按步骤实现数组迭代器](#文章目录 @[TOC] 一道解构面试题 题目 运行结果 原理 概念 数组迭代器 答案 答案(1)、在对象中添加一个数组迭代器 1.使用临时数组添加迭代器 2. 对象值输出结果 3.使用Object.values(this);拿到对象的值 答案(2)、在对象原型上添加数组迭代器 1.按步骤实现数组迭代器 2. 简化步骤 答案(3)、使用迭代器生成器)
  • [2. 简化步骤](#文章目录 @[TOC] 一道解构面试题 题目 运行结果 原理 概念 数组迭代器 答案 答案(1)、在对象中添加一个数组迭代器 1.使用临时数组添加迭代器 2. 对象值输出结果 3.使用Object.values(this);拿到对象的值 答案(2)、在对象原型上添加数组迭代器 1.按步骤实现数组迭代器 2. 简化步骤 答案(3)、使用迭代器生成器)
  • [答案(3)、使用迭代器生成器](#文章目录 @[TOC] 一道解构面试题 题目 运行结果 原理 概念 数组迭代器 答案 答案(1)、在对象中添加一个数组迭代器 1.使用临时数组添加迭代器 2. 对象值输出结果 3.使用Object.values(this);拿到对象的值 答案(2)、在对象原型上添加数组迭代器 1.按步骤实现数组迭代器 2. 简化步骤 答案(3)、使用迭代器生成器)

一道解构面试题

题目

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

运行结果

类型错误:{(intermediate value)(intermediate value)} is not iterable表示这个对象是不可迭代的。

RunCode 复制代码
var [a, b] = { a:1, b: 2 };
             ^

TypeError: {(intermediate value)(intermediate value)} is not iterable
    at Object.<anonymous> (e:\Study\Web前端\√061.一道解构的面试题js\tempCodeRunnerFile.js:1:14)
    at Module._compile (node:internal/modules/cjs/loader:1155:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1209:10)
    at Module.load (node:internal/modules/cjs/loader:1033:32)
    at Function.Module._load (node:internal/modules/cjs/loader:868:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
    at node:internal/main/run_main_module:22:47

原理

概念

解构的对象不一定是数组,只要这个对象是可迭代的对象。数组本身就是一个可以迭代的对象。所以我们只有将{ a:1, b: 2 }变成可以迭代的对象就能解决这个问题。

JavaScript 中,可迭代对象是指具有 Symbol.iterator 方法的对象。这个方法返回一个迭代器(Iterator)对象,它通过 next() 方法提供对可迭代对象中的每个元素的访问。

除了数组,还有一些其他的内置类型,例如字符串SetMap等,都是可迭代对象。此外,自定义对象也可以实现可迭代接口,使其成为可迭代对象。

js 复制代码
{
	[Symbol.iterator]:function(){
		return 迭代器
	}
}

数组迭代器

下面以数组[1,2,3]作为示例,了解可迭代的对象的规则:

  1. 查看数组的Symbol.iterator类型:[Function: values]表示是一个方法
    代码
js 复制代码
var arr = [1,2,3];
console.log(arr[Symbol.iterator]);

运行结果

RunCode 复制代码
[Function: values]
  1. 查看数组的Symbol.iterator方法的返回值:Object [Array Iterator] {}表示数组迭代器。
    代码
js 复制代码
var arr = [1,2,3];
const iter = arr[Symbol.iterator]();
console.log(iter);

运行结果

RunCode 复制代码
Object [Array Iterator] {}

3.查看数组迭代器中的next类型:[Function: next]表示方法。
代码

js 复制代码
var arr = [1,2,3];
const iter = arr[Symbol.iterator]();
console.log(iter.next);

运行结果

RunCode 复制代码
[Function: next]

4.使用迭代器的next()方法执行一次:获取第1个结果{ value: 1, done: false }
代码

js 复制代码
var arr = [1,2,3];
const iter = arr[Symbol.iterator]();
console.log(iter.next());

运行结果

RunCode 复制代码
{ value: 1, done: false }

5.使用迭代器的next()方法执行两次:获取第1、2个结果{ value: 1, done: false } { value: 2, done: false }
代码

js 复制代码
var arr = [1,2,3];
const iter = arr[Symbol.iterator]();
console.log(iter.next());
console.log(iter.next());

运行结果

RunCode 复制代码
{ value: 1, done: false }
{ value: 2, done: false }

6.使用迭代器的next()方法执行三次:获取第1、2、3个结果{ value: 1, done: false } { value: 2, done: false } { value: 3, done: false }
代码

js 复制代码
var arr = [1,2,3];
const iter = arr[Symbol.iterator]();
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());

运行结果

RunCode 复制代码
{ value: 1, done: false }
{ value: 2, done: false }
{ value: 3, done: false }

7.使用迭代器的next()方法执行四次:获取第1、2、3个结果及迭代完成标志{ value: 1, done: false } { value: 2, done: false } { value: 3, done: false } { value: undefined, done: true },其中{ value: undefined, done: true }表示迭代器对象已经完成了所有的迭代操作。
代码

js 复制代码
var arr = [1,2,3];
const iter = arr[Symbol.iterator]();
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());

运行结果

RunCode 复制代码
{ value: 1, done: false }
{ value: 2, done: false }
{ value: 3, done: false }
{ value: undefined, done: true }

8.使用迭代器的next().value方法模拟var [a,b] = [1,2,3];的解构。
代码

js 复制代码
var arr = [1,2,3];
const iter = arr[Symbol.iterator]();
var a = iter.next().value;
var b = iter.next().value;
console.log(a, b);

运行结果

RunCode 复制代码
1 2

答案

答案(1)、在对象中添加一个数组迭代器

1.使用临时数组添加迭代器

代码

js 复制代码
var [a, b] = { 
  a: 1, 
  b: 2,
  [Symbol.iterator](){
    var arr = [1,2];
    const iter = arr[Symbol.iterator]();
    return iter;
  },
};
console.log(a, b);

运行结果

RunCode 复制代码
1 2

2. 对象值输出结果

代码

js 复制代码
var [a, b] = { 
  a: 3, 
  b: 4,
  [Symbol.iterator](){
    var arr = [1,2];
    const iter = arr[Symbol.iterator]();
    return iter;
  },
};
console.log(a, b);

运行结果

RunCode 复制代码
1 2

3.使用Object.values(this);拿到对象的值

代码

js 复制代码
var [a, b] = { 
  a: 3, 
  b: 4,
  [Symbol.iterator](){
    var arr = Object.values(this);
    const iter = arr[Symbol.iterator]();
    return iter;
  },
};
console.log(a, b);

运行结果

RunCode 复制代码
3 4

答案(2)、在对象原型上添加数组迭代器

1.按步骤实现数组迭代器

代码

js 复制代码
Object.prototype [Symbol.iterator] = function () {
  var arr = Object.values(this);
  const iter = arr[Symbol.iterator]();
  return iter;
}
var [a, b] = { a:1, b: 2 };
console.log(a, b);

运行结果

RunCode 复制代码
1 2

2. 简化步骤

代码

js 复制代码
Object.prototype [Symbol.iterator] = function () {
  return Object.values(this)[Symbol.iterator]();
}
var [a, b] = { a:1, b: 2 };
console.log(a, b);

运行结果

RunCode 复制代码
1 2

答案(3)、使用迭代器生成器

下面所示代码中的生成器函数function* () {}定义了一个迭代器生成器。当该迭代器被调用时,它会返回一个可迭代对象,并且通过yield*语句将对象的值作为迭代器的值逐个产生出来。
代码

js 复制代码
Object.prototype [Symbol.iterator] = function* () {
  return yield* Object.values(this);
}
var [a, b] = { a:1, b: 2 };
console.log(a, b);

运行结果

RunCode 复制代码
1 2
相关推荐
ZJ_.3 分钟前
WPSJS:让 WPS 办公与 JavaScript 完美联动
开发语言·前端·javascript·vscode·ecmascript·wps
joan_8538 分钟前
layui表格templet图片渲染--模板字符串和字符串拼接
前端·javascript·layui
还是大剑师兰特1 小时前
什么是尾调用,使用尾调用有什么好处?
javascript·大剑师·尾调用
Watermelo6171 小时前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
一个处女座的程序猿O(∩_∩)O3 小时前
小型 Vue 项目,该不该用 Pinia 、Vuex呢?
前端·javascript·vue.js
燃先生._.10 小时前
Day-03 Vue(生命周期、生命周期钩子八个函数、工程化开发和脚手架、组件化开发、根组件、局部注册和全局注册的步骤)
前端·javascript·vue.js
高山我梦口香糖11 小时前
[react]searchParams转普通对象
开发语言·前端·javascript
black^sugar11 小时前
纯前端实现更新检测
开发语言·前端·javascript
2401_8576009513 小时前
SSM 与 Vue 共筑电脑测评系统:精准洞察电脑世界
前端·javascript·vue.js