当前位置: 首页 > news >正文

【JS】一道解构面试题

文章目录

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

一道解构面试题

题目

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

运行结果

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

var [a, b] = { a:1, b: 2 };^TypeError: {(intermediate value)(intermediate value)} is not iterableat 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等,都是可迭代对象。此外,自定义对象也可以实现可迭代接口,使其成为可迭代对象。

{[Symbol.iterator]:function(){return 迭代器}
}

数组迭代器

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

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

运行结果

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

运行结果

Object [Array Iterator] {}

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

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

运行结果

[Function: next]

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

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

运行结果

{ value: 1, done: false }

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

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

运行结果

{ 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 }
代码

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

运行结果

{ 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 }表示迭代器对象已经完成了所有的迭代操作。
代码

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());

运行结果

{ 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];的解构。
代码

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

运行结果

1 2

答案

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

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

代码

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

运行结果

1 2

2. 对象值输出结果

代码

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

运行结果

1 2

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

代码

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);

运行结果

3 4

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

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

代码

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);

运行结果

1 2

2. 简化步骤

代码

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

运行结果

1 2

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

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

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

运行结果

1 2

相关文章:

【JS】一道解构面试题

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

24v转3.3v输出3A用什么芯片

问&#xff1a;客户需要一个能够将24V输入电压转换为3.3V输出电压&#xff0c;并且能够提供1-3A的电流输出的芯片。还希望它能够内置MOS管。有什么推荐的型号吗&#xff1f;&#xff08;vin24v、5v&#xff0c;vout3.3v&#xff0c;Io1-3A&#xff09; 答&#xff1a;推荐使用…...

在Linux中安装lrzsz(yum命令使用)

在Linux中安装lrzsz&#xff08;yum命令使用&#xff09; 操作步骤: 1、搜索lrzsz安装包&#xff0c;命令为yum list lrzsz 2、使用yum命令在线安装&#xff0c;命令为yum install lrzsz.x86_64 注意事项&#xff1a; Yum(全称为 Yellow dog Updater, Modified)是一个在Fedor…...

机器学习基础08-回归算法矩阵分析(基于波士顿房价(Boston House Price)数据集)

回归算法通常涉及到使用矩阵来表示数据和模型参数。线性回归是最常见的回归算法之一&#xff0c;它可以用矩阵形式来表示。 考虑一个简单的线性回归模型&#xff1a; y m x b y mx b ymxb&#xff0c;其中 y y y 是因变量&#xff0c; x x x 是自变量&#xff0c; m m m 是…...

[英语单词] password, passphrase, passport.... paraphrase

password 是密码&#xff0c;大多可能就是一个单词的量&#xff0c;10多个字母&#xff0c;或者更少&#xff1b;而且就是一个单词&#xff1b; 后来发现密码这么设置不安全&#xff0c;怎么办&#xff1f; 就出现了passphrase&#xff0c;使用词组的组合来做为密码&#xff0c…...

windows(iis)服务器部署安装wordpress(php)网站教程

该教程包含iis安装,php安装,mysql安装,php网站部署上线,windows服务部署php网站,只需要这一篇文章就够了。 该教程为iis服务器部署安装wordpress(php)网站教程,同样适用wordpress网站迁移。 配置要求 1、windows服务器安装iis windows服务器安装iis管理器 打开控制面…...

ETCD备份还原

备份只需要在一个节点上备就可以了&#xff0c;每个节点上的数据是同步的&#xff1b;但是数据恢复是需要在每个主节点上进行 1.查看证书位置 #查看etcd证书 [rootk8s-master01 manifests]# cat /etc/kubernetes/manifests/kube-apiserver.yaml |grep etcd- --etcd-cafile/et…...

探索CSS计数器:优雅管理网页元素的计数与序号

113. 探索CSS计数器&#xff1a;优雅管理网页元素的计数与序号 在前端开发中&#xff0c;我们经常需要对网页元素进行计数与序号&#xff0c;如有序列表、表格行号、步骤指示等。为了优雅地管理这些计数与序号&#xff0c;CSS提供了一种强大的功能&#xff1a;CSS计数器&#…...

这次一次性通关channel!

一 前言 前几天面试某大厂的云原生岗位&#xff0c;原本是一个轻松愉快的过程&#xff0c;当问到第二个问题&#xff0c;我就发现事情的不对劲&#xff0c;先复盘一下面试官有关Channel的问题&#xff0c;然后再逐一解决&#xff0c;最后进行扩展&#xff0c;这次一定要一次性…...

线程数控制

项目需求&#xff1a;javaMATLAB并行开发 在java中调用由MATLAB转成的jar包的代码&#xff0c;需要调用到底层的MATLAB服务。每次只能一个线程调用&#xff0c;当多个线程同时调用MATLAB时&#xff0c;MATLAB会报错。导致整个java服务挂掉。 现在增加线程控制&#xff0c;每…...

DC-6靶机

先去看看DC-6的官网描述&#xff0c;看看有没有给出提示信息 把这个线索信息先复制下来 cat /usr/share/wordlists/rockyou.txt | grep k01 > passwords.txt开始前先要吧 kali和DC-6靶机放在统一网段&#xff0c;都换成NAT模式 然后看一下DC-6的MAC地址 靶机的MAC地址00…...

SpringCloud入门Day01-服务注册与发现、服务通信、负载均衡与算法

SpringCloudNetflix入门 一、应用架构的演变 伴随互联网的发展&#xff0c;使用互联网的人群越来越多&#xff0c;软件应用的体量越来越大和复杂。而传统单体应用 可能不足以支撑大数据量以及发哦并发场景应用的框架也随之进行演变从最开始的单体应用架构到分布式&#xff08…...

java-IDEA MAVEN查看依赖树,解决jar包重复和冲突

如果这里面的依赖关系有红线,就说明有包冲突,一般都是版本不一致,可以在idea里下一个插件Maven Helper,点击install并重启IDEA 打开pom.xml文件&#xff0c;在下方会出现Dependency Analyzer&#xff0c;选择它会出现重复依赖列表&#xff0c;选择对应的依赖&#xff0c;右键红…...

参考RabbitMQ实现一个消息队列

文章目录 前言小小消息管家1.项目介绍2. 需求分析2.1 API2.2 消息应答2.3 网络通信协议设计 3. 开发环境4. 项目结构介绍4.1 配置信息 5. 项目演示 前言 消息队列的本质就是阻塞队列&#xff0c;它的最大用途就是用来实现生产者消费者模型&#xff0c;从而实现解耦合以及削峰填…...

SpringBoot+JWT

一、maven坐标 <!-- JWT依赖 --><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency><dependency><groupId>com.auth0</groupId>&…...

Cad二次开发EqualPoint

在 CAD 软件的二次开发中&#xff0c;Tolerance.Global.EqualPoint 是一个特定的属性或方法&#xff0c;用于表示全局的相等性公差值。这个属性或方法通常是由 CAD 软件的开发平台或 API 提供的&#xff0c;用于处理浮点数的相等性比较。 具体来说&#xff0c;Tolerance.Globa…...

20230806将ASF格式的视频转换为MP4

20230806将ASF格式的视频转换为MP4 2023/8/6 18:47 缘起&#xff0c;自考中山大学的《计算机网络》&#xff0c;考试《数据库系统原理》的时候找到视频&#xff0c;由于个人的原因&#xff0c;使用字幕更加有学习效率&#xff01; 由于【重型】的PR2023占用资源较多&#xff0c…...

【MySQL】——常用接口API即相关函数说明

目录 1、MySQL结构体的说明 1、MYSQL结构体 2.MYSQL_RES结构体 3. MYSQL_FIELD 2. 接口的使用步骤 3、mysql_init()——MYSQL对象初始化 4、mysql_real_connect()——数据库引擎建立连接 5. mysql_query()——查询数据库某表内容 6、mysql_real_query——执行SQL语句 …...

ts + axios + useRequest (ahooks)—— 实现请求封装

现在越来越多的项目开始ts化&#xff0c;我们今天就一块学习一下&#xff0c;关于ts的请求封装。 首先要安装两个依赖&#xff1a; npm i axios -S npm i ahooks -S 引入&#xff1a; import { useRequest } from ahooks; import axios, { AxiosRequestConfig, AxiosRespo…...

Springboot @Validated注解详细说明

在Spring Boot中&#xff0c;Validated注解用于验证请求参数。它可以应用在Controller类或方法上 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </depen…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...