90% 的前端都会使用 ES6 来简化代码,你都用过哪些?

共 7274字,需浏览 15分钟

 ·

2021-11-29 17:05

点击上方 前端瓶子君,关注公众号

回复算法,加入前端编程面试算法每日一题群

前言 (介绍 ECMAScript)

最初 JavaScript 语言有 2 份标准:

ECMA-262:主标准,由 ECMA 国际组织(Ecma International)负责管理(为了让最初的JavaScript 与最初的 JScript 能遵循同一套标准发展而诞生的 ECMAScript ,正好排到了作为 Ecma262 号标准,所以得到 ECMA-262 编号。)

ISO/IEC 16262:第二标准,由国际标准化组织 ISOInternational Standard Organization)和国际电子技术委员会 IECInternational Electrotechnical Commission)负责管理

出于商标版权的原因,规范标准中将这门语言称为 ECMAScript ,所以原则上 JavaScriptECMAScript 指的是同一个东西,但有时也会加以区分:

  • JavaScript:指语言及其实现
  • ECMAScript:指语言标准及语言版本,比如 ES6 表示语言(标准)的第 6 版

ECMAScript 发展历史

  • ECMAScript 1(1997 年 6 月):规范第一版
  • ECMAScript 2(1998 年 6 月):为了同步 ISO 标准,引入了一些小更新
  • ECMAScript 3(1999 年 12 月):增加了正则表达式、字符串处理、控制语句(do-while、switch)、异常处理(try-catch)等众多核心特性
  • ECMAScript 4(2008 年 7 月废除):本来是一次大规模升级(静态类型、模块、命名空间等),但跨度过大,出现了分歧,最终没能推广使用
  • ECMAScript 5(2009 年 12 月):变化不大,加了一些标准库特性和严格模式
  • ECMAScript-5.1(2011 年 6 月):又一次小更新,为了同步 ISO 标准
  • ECMAScript 6(2015 年 6 月):一大波更新,实现了当年 ES4 的许多设想,并正式改为按年份命名规范版本
  • ECMAScript 2016(2016 年 6 月):第一个年度版本,与 ES6 相比,发布周期较短,新特性也相对少些
  • ECMAScript 2017(2017 年 6 月):第二个年度版本...

以后的 ECMAScript 版本(ES2018、ES2019、ES2020 等)都在 6 月正式获准生效

开始 (聚焦 ES6)

这里引用 阮一峰 老师的 ES6标准入门 一书中的总结:ES6 既是一个历史名词,也是一个泛指,含义是 5.1 版本以后的 JavaScript 的下一代标准,涵盖了 ES2015、ES2016、ES2017 等,而 ES2015 则是正式名称,特指当年发布的正式版本的语言标准 市面上提到的 ES6 一般是指 ES2015 标准,但有时也是泛指 下一代 JavaScript

本文主要讲解以下内容:

  • 块级作用域(Block scoping,ES2015)
  • 解构(Destructuring,ES2015)
  • 箭头函数(Arrow Functions,ES2015)
  • 模板字符串(template string,ES2015)
  • 剩余参数 / 展开语法(Rest and spread parameters,ES2015)
  • 对象字面量简写语法(Object shorthand,ES2015)
  • 数组实例的 includes() (ES2016)
  • Async/await 异步语法 (ES2017)

块级作用域

为什么需要块级作用域?

ES5 只有全局作用域和函数作用域,没有块级作用域,这导致很多场景不合理。

  • 第一种场景,内层变量可能会覆盖外层变量。
var tmp = new Date()
function fn() {
  console.log(tmp)
  if (false) {
    var tmp = 'hello world'
  }
}
fn() // undefined
复制代码

以上代码的原意是, if 代码块的外部使用外层的 tmp 变量,内部使用内层的 tmp 变量。但是,函数 fn 执行后,输出结果为 undefined ,原因在于变量提升导致内层的 tmp 变量覆盖了外层的 tmp 变量。

  • 第二种场景,用来计数的循环变量泄露为全局变量。
var s = 'hello'
for (var i = O; i < s.length; i++) {
  console.log(s[i])
}
console.log(i) // 5
复制代码

上面的代码中,变量 i 只用来控制循环,但是循环结束后,它并没有消失,而是泄露成了全局变量。

let 实际上为 JavaScript 新增了块级作用域。

function fl() {
  let n = 5
  if (true) {
    let n = 10
  }
  console.log(n) // 5
}
复制代码

上面的函数有两个代码块,都声明了变量 n,运行后输出 5 。这表示外层代码块不受内层代码块的影响。如果使用 var 定义变量 ,最后输出的值就是 10

那么我们能利用块级作用域做什么呢?

我们先来做道面试题

for (var i = 0; i < 5; i++) {
  setTimeout(() => {
    console.log(i)
  }, 1000)
}
// 5 5 5 5 5
复制代码

改成 ES6 中的 let

for (let i = 0; i < 5; i++) {
  setTimeout(() => {
    console.log(i)
  }, 1000)
}
// 0 1 2 3 4
复制代码

看到这,相信聪明的你已经理解块级作用域的好处了 O(∩_∩)O

那么 ES5 能不能实现 块级作用域 的效果呢? 可以的,我们可以利用闭包

for (var i = 0; i < 5; i++) {
  ;(function (index{
    setTimeout(() => {
      console.log(index)
    }, 1000)
  })(i)
}
// 0 1 2 3 4
复制代码

解构

解构 :是将一个数据结构分解为更小的部分的过程。ES6 中,从数组和对象中提取值,对变量进行赋值。

那么解构有什么用处呢?

  1. 可以大大的简化变量声明操作。
// ES5
var foo = 1
var bar = 2
var baz = 3

// ES6
let [foo, bar, baz] = [123]
复制代码
  1. 变量交换:看起来如同镜像。赋值语句的左侧的解构模式,右侧是临时创建的数组字面量。x 被赋值为数组中的 y,y 被赋值为数组中的 x。
let x = 1
let y = 2
;[x, y] = [y, x]
// x = 2, y = 1
复制代码
  1. 对象解构
var obj = { x1y2c1 }
let { x, y } = obj
// x = 1
// y = 2
复制代码
  1. 字符串解构
const [a, b, c, d, e] = 'hello'
// a => h
// b => e
// c => l
// d => l
// e => o
复制代码
  1. 函数参数解构
const xueyue = {
  name'雪月',
  age18,
}

function getAge({ name, age }{
  return `${name}今年${age}岁`
}

getAge(xueyue) // 雪月今年18岁
复制代码

箭头函数

ES6 允许使用箭头 => 定义函数

var f = v => v

// 等同于 ES5 的
var f = function (v{
  return v
}
复制代码

如果箭头函数不需要参数或需要多个参数,就使用圆括号代表参数部分。

var f = () => 5
// 等同于 ES5 的
var f = function () {
  return 5
}

var sum = (numl, num2) => numl + num2
// 等同于 ES5 的
var sum = function (numl, num2{
  return numl + num2
}
复制代码

箭头函数可以与解构结合使用。

const full = ({ first , last }) => first + ' ' + last;
// 等同于 ES5 的
function full(person{
  return person.first + ' ' + person.last;
}
复制代码

箭头函数使得表达更加简洁

const isEven = n => n % 2 === 0
const square = n => n * n

var result = values.sort((a, b) => a - b)
// 等同于 ES5 的
var result = values.sort(function (a, b{
  return a - b
})
复制代码

上面代码只用了两行,就定义了两个简单的工具函数。如果不用箭头函数,可能就要占用多行,而且还不如现在这样写醒目。

箭头函数使用注意点

  1. 函数体内的 this 对象,就是定义时所在的对象,而不是使用时所在的对象。
  2. 不可以当作构造函数,也就是说,不可以使用 new 命令,否则会抛出一个错误。
  3. 不可以使用 arguments 对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。
  4. 不可以使用 yield 命令,因此箭头函数不能用作 Generator 函数。

上面四点中,第一点尤其值得注意。this 对象的指向是可变的,但是在箭头函数中,它是固定的。

// ES6
function foo() {
  setTimeout(() => {
    console.log('id:'this.id)
  }, 100)
}

// 转换成ES5
function foo() {
  var _this = this

  setTimeout(function () {
    console.log('id:', _this.id)
  }, 100)
}
复制代码

上面代码中,转换后的 ES5 版本清楚地说明了,箭头函数里面根本没有自己的 this,而是引用外层的 this

模板字符串

模板字符串( template string )是增强版的字符串 ,用反引号 (``) 标识 。它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。

const { log } = console
const name = '雪月'
const age = 18

// 普通字符串拼接
const result = name + '今年' + age + '岁'
// 使用模板字符串
const result2 = `${name}今年${age}岁`
log(result) // 雪月今年18岁
log(result2) // 雪月今年18岁

// ${} 大括号可以放入任意的 JavaScript 表达式,可以进行运算
const result3 = `${name}今年${age * 2}岁`
log(result3) // 雪月今年36岁
复制代码

剩余参数 / 展开语法

ES6 引入了 rest 参数(形式为...变量名),用于获取函数的多余参数,这样就不需要使用 arguments 对象了。rest 参数搭配的变量是一个数组,该变量将多余的参数放入其中。

function sortNumbers() {
  return Array.prototype.slice.call(arguments).sort()
}
// 使用 rest
const sortNumbers = (...numbers) => numbers.sort()
复制代码

比较上面的两种写法可以发现, rest 参数的写法更自然也更简洁。

扩展运算符( spread )是三个点(...) 如同 rest 参数的逆运算 将一个数组转为用逗号分隔的参数序列

console.log(...[123])
// 1 2 3

console.log(1, ...[234], 5)
// 1 2 3 4 5
复制代码

下面是扩展运算符取代 apply 方法的一个实际例子 应用 Math.max 方法简化求出数组中的最大元素。

// ESS 的写法
Math.max.apply(null, [14377])
// ES6 的写法
Math.max(...[14377])
// 等同于
Math.max(14377)
复制代码

扩展运算符提供了数组合并的新写法。

//  ESS
;[12].concat(more)
// ES6
;[12, ...more]
复制代码

对象的扩展运算符(...)用于取出参数对象的所有可遍历属性,拷贝到当前对象之中。

let z = { a3b'bb' }
let n = { ...z }
// { a: 3, b: 'bb' }
n === z // false
复制代码

特别注意: ...扩展对象,只能做到当对象属性是 基本数据类型 才是 深拷贝,如果是 引用数据类型,那就是浅拷贝

let z = { a3b'bb'c: { name'ccc' } }
let n = { ...z }

// { a: 3, b: 'bb', c: { name: 'ccc' } }
n === z // false
n.c === z.c // true
// n.c 跟 z.c 是同一个引用地址
复制代码

对象字面量简写语法

const name = '雪月'

// ES5写法
const obj = {
  name: name,
  ffunction () {
    console.log(this.name)
  },
}

// ES6简写
const obj2 = {
  name,
  f() {
    console.log(this.name)
  },
}

obj.f() // 雪月
obj2.f() // 雪月
复制代码

使用 vue 的同学是不是感到很熟悉

new Vue({
  el'#app',
  data() {
    return {
      list: [],
    }
  },
})
复制代码

数组实例的 includes()

Array.prototype.includes 方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的 includes 方法类似。ES2016 引入了该方法。

;[123].includes(2// true
;[123].includes(4// false
;[12NaN].includes(NaN// true
复制代码

没有该方法之前,我们通常使用数组的 indexOf 方法,检查是否包含某个值。

// ES5
if (arr.indexOf(el) !== -1) {
  // ...
}

// ES6
if (arr.includes(el)) {
  // ...
}

// 那么 indexOf 能不能做到类似于 includes 的写法呢? 我们可以利用 ~ 位运算符
if (~arr.indexOf(el)) {
  // ...
}
复制代码

indexOf 方法有两个缺点,一是不够语义化,它的含义是找到参数值的第一个出现位置,所以要去比较是否不等于-1,表达起来不够直观。二是,它内部使用严格相等运算符(===)进行判断,这会导致对 NaN 的误判。

;[NaN].indexOf(NaN)
// -1
复制代码

includes 使用的是不一样的判断算法,就没有这个问题

;[NaN].includes(NaN)
// true
复制代码

Async/await 异步语法

ES2017 标准引入了 async 函数,使得异步操作变得更加方便。

async 函数是什么?一句话,它就是 Generator 函数的语法糖。

async function getTitle(url{
  let response = await fetch(url)
  let html = await response.text()
  return html.match(/([\s\S]+)<\/title>/i</span>)[<span style="color: #d19a66;line-height: 26px;">1</span>]<br>}<br><br>getTitle(<span style="color: #98c379;line-height: 26px;">'https://tc39.github.io/ecma262/'</span>).then(<span style="line-height: 26px;">(<span style="line-height: 26px;">res</span>) =></span> <span style="color: #e6c07b;line-height: 26px;">console</span>.log(res))<br>复制代码<br></code></pre><p data-tool="mdnice编辑器" style="margin-bottom: 20px;line-height: 1.8em;color: rgb(58, 58, 58);">上面代码中,函数 <code style="font-size: 14px;border-radius: 4px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(155, 110, 35);background-color: rgb(255, 245, 227);padding: 3px;margin: 3px;">getTitle</code> 内部有三个操作:<code style="font-size: 14px;border-radius: 4px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(155, 110, 35);background-color: rgb(255, 245, 227);padding: 3px;margin: 3px;">抓取网页</code>、<code style="font-size: 14px;border-radius: 4px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(155, 110, 35);background-color: rgb(255, 245, 227);padding: 3px;margin: 3px;">取出文本</code>、<code style="font-size: 14px;border-radius: 4px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(155, 110, 35);background-color: rgb(255, 245, 227);padding: 3px;margin: 3px;">匹配页面标题</code>。只有这三个操作全部完成,才会执行 <code style="font-size: 14px;border-radius: 4px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(155, 110, 35);background-color: rgb(255, 245, 227);padding: 3px;margin: 3px;">then</code> 方法里面的 <code style="font-size: 14px;border-radius: 4px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(155, 110, 35);background-color: rgb(255, 245, 227);padding: 3px;margin: 3px;">console.log</code></p><h2 data-tool="mdnice编辑器" style="font-weight: bold;font-size: 22px;line-height: 1.5em;margin-top: 2.2em;margin-bottom: 35px;"><span style="display: inline-block;background-image: linear-gradient(rgb(255, 255, 255) 60%, rgb(255, 177, 27) 40%);background-position: initial;background-size: initial;background-repeat: initial;background-attachment: initial;background-origin: initial;background-clip: initial;color: rgb(81, 81, 81);padding: 2px 13px;margin-right: 3px;height: 50%;">结束(意犹未尽)</span></h2><p data-tool="mdnice编辑器" style="margin-bottom: 20px;line-height: 1.8em;color: rgb(58, 58, 58);">文章介绍了 <code style="font-size: 14px;border-radius: 4px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(155, 110, 35);background-color: rgb(255, 245, 227);padding: 3px;margin: 3px;">ES6</code> 常用的一些语法以及使用场景; 但是 <code style="font-size: 14px;border-radius: 4px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(155, 110, 35);background-color: rgb(255, 245, 227);padding: 3px;margin: 3px;">ES6</code> 内容远不止于此,感兴趣的同学可以去 <code style="font-size: 14px;border-radius: 4px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(155, 110, 35);background-color: rgb(255, 245, 227);padding: 3px;margin: 3px;">阮一峰老师的</code> <span style="font-weight: bold;color: #ffb11b;padding: 3px;">ES6 入门教程</span><sup style="line-height: 0;font-weight: bold;color: #dda52d;margin: 2px;padding: 3px;">[1]</sup> 一书中查看详细内容。如果您认可这本书,也可以去正版渠道购买书籍。这样可以使出版社不因出版开源书籍而亏钱,进而鼓励更多的作者开源自己的书籍。</p><h2 data-tool="mdnice编辑器" style="font-weight: bold;font-size: 22px;line-height: 1.5em;margin-top: 2.2em;margin-bottom: 35px;"><span style="display: inline-block;background-image: linear-gradient(rgb(255, 255, 255) 60%, rgb(255, 177, 27) 40%);background-position: initial;background-size: initial;background-repeat: initial;background-attachment: initial;background-origin: initial;background-clip: initial;color: rgb(81, 81, 81);padding: 2px 13px;margin-right: 3px;height: 50%;">后记(列举API)</span></h2><p data-tool="mdnice编辑器" style="margin-bottom: 20px;line-height: 1.8em;color: rgb(58, 58, 58);">还有很多 <code style="font-size: 14px;border-radius: 4px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(155, 110, 35);background-color: rgb(255, 245, 227);padding: 3px;margin: 3px;">ES6</code> 实用的 <code style="font-size: 14px;border-radius: 4px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(155, 110, 35);background-color: rgb(255, 245, 227);padding: 3px;margin: 3px;">API</code> 我就简单提及一下,朋友们看看平时是否有用到</p><pre data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;"><code style="overflow-x: auto;padding: 16px;color: #abb2bf;display: -webkit-box;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;font-size: 12px;-webkit-overflow-scrolling: touch;padding-top: 15px;background: #282c34;border-radius: 5px;">;[<span style="color: #d19a66;line-height: 26px;">1</span>, <span style="color: #d19a66;line-height: 26px;">4</span>, <span style="color: #d19a66;line-height: 26px;">-5</span>, <span style="color: #d19a66;line-height: 26px;">10</span>].find(<span style="line-height: 26px;"><span style="line-height: 26px;">n</span> =></span> n < <span style="color: #d19a66;line-height: 26px;">0</span>)<br><span style="color: #5c6370;font-style: italic;line-height: 26px;">// -5</span><br><br>;[<span style="color: #d19a66;line-height: 26px;">1</span>, <span style="color: #d19a66;line-height: 26px;">5</span>, <span style="color: #d19a66;line-height: 26px;">10</span>, <span style="color: #d19a66;line-height: 26px;">15</span>].findIndex(<span style="line-height: 26px;">(<span style="line-height: 26px;">value, index, arr</span>) =></span> value > <span style="color: #d19a66;line-height: 26px;">9</span>) <br><span style="color: #5c6370;font-style: italic;line-height: 26px;">// 2</span><br><br>;[<span style="color: #d19a66;line-height: 26px;">1</span>, <span style="color: #d19a66;line-height: 26px;">2</span>, [<span style="color: #d19a66;line-height: 26px;">3</span>, [<span style="color: #d19a66;line-height: 26px;">4</span>, <span style="color: #d19a66;line-height: 26px;">5</span>]]].flat()<br><span style="color: #5c6370;font-style: italic;line-height: 26px;">// [1, 2, 3, [4, 5]]</span><br><br>;[<span style="color: #d19a66;line-height: 26px;">1</span>, <span style="color: #d19a66;line-height: 26px;">2</span>, [<span style="color: #d19a66;line-height: 26px;">3</span>, [<span style="color: #d19a66;line-height: 26px;">4</span>, <span style="color: #d19a66;line-height: 26px;">5</span>]]].flat(<span style="color: #d19a66;line-height: 26px;">2</span>)<br><span style="color: #5c6370;font-style: italic;line-height: 26px;">// [1, 2, 3, 4, 5]</span><br><br>;[<span style="color: #d19a66;line-height: 26px;">3</span>, <span style="color: #d19a66;line-height: 26px;">8</span>, <span style="color: #d19a66;line-height: 26px;">54</span>, <span style="color: #d19a66;line-height: 26px;">8</span>, <span style="color: #d19a66;line-height: 26px;">3</span>, <span style="color: #56b6c2;line-height: 26px;">NaN</span>, <span style="color: #56b6c2;line-height: 26px;">NaN</span>, <span style="color: #98c379;line-height: 26px;">'NaN'</span>, <span style="color: #98c379;line-height: 26px;">'NaN'</span>].filter(<span style="line-height: 26px;">(<span style="line-height: 26px;">number, index, arr</span>) =></span> arr.indexOf(number) === index)<br><span style="color: #5c6370;font-style: italic;line-height: 26px;">// [3, 8, 54, "NaN"] 利用filter过滤去重,注意会漏掉NaN</span><br><br>;[<span style="color: #d19a66;line-height: 26px;">1</span>, <span style="color: #d19a66;line-height: 26px;">2</span>, <span style="color: #d19a66;line-height: 26px;">3</span>, <span style="color: #d19a66;line-height: 26px;">4</span>].map(<span style="line-height: 26px;">(<span style="line-height: 26px;">item</span>) =></span> item * <span style="color: #d19a66;line-height: 26px;">2</span>)<br><span style="color: #5c6370;font-style: italic;line-height: 26px;">// [2, 4, 6, 8] 利用map返回一个新数组,不改变原数组</span><br><br><span style="color: #5c6370;font-style: italic;line-height: 26px;">// 使用 reduce 求和; reduce功能极其强大 ! yyds</span><br>;[<span style="color: #d19a66;line-height: 26px;">0</span>, <span style="color: #d19a66;line-height: 26px;">1</span>, <span style="color: #d19a66;line-height: 26px;">2</span>, <span style="color: #d19a66;line-height: 26px;">3</span>, <span style="color: #d19a66;line-height: 26px;">4</span>].reduce(<span style="line-height: 26px;"><span style="color: #c678dd;line-height: 26px;">function</span>(<span style="line-height: 26px;">accumulator, currentValue, currentIndex, array</span>)</span>{<br>  <span style="color: #c678dd;line-height: 26px;">return</span> accumulator + currentValue;<br>}); <br><span style="color: #5c6370;font-style: italic;line-height: 26px;">// 10</span><br><br><span style="color: #5c6370;font-style: italic;line-height: 26px;">// ES2017 引入了跟 Object.keys 配套的 Object.values 和 Object.entries,作为遍历一个对象的补充手段,</span><br><span style="color: #5c6370;font-style: italic;line-height: 26px;">// 供 for...of 循环使用。</span><br><span style="color: #c678dd;line-height: 26px;">let</span> { keys, values, entries } = <span style="color: #e6c07b;line-height: 26px;">Object</span>;<br><span style="color: #c678dd;line-height: 26px;">let</span> obj = { <span style="color: #d19a66;line-height: 26px;">a</span>: <span style="color: #d19a66;line-height: 26px;">1</span>, <span style="color: #d19a66;line-height: 26px;">b</span>: <span style="color: #d19a66;line-height: 26px;">2</span>, <span style="color: #d19a66;line-height: 26px;">c</span>: <span style="color: #d19a66;line-height: 26px;">3</span> };<br><br><span style="color: #c678dd;line-height: 26px;">for</span> (<span style="color: #c678dd;line-height: 26px;">let</span> key <span style="color: #c678dd;line-height: 26px;">of</span> keys(obj)) {<br>  <span style="color: #e6c07b;line-height: 26px;">console</span>.log(key); <span style="color: #5c6370;font-style: italic;line-height: 26px;">// 'a', 'b', 'c'</span><br>}<br><br><span style="color: #c678dd;line-height: 26px;">for</span> (<span style="color: #c678dd;line-height: 26px;">let</span> value <span style="color: #c678dd;line-height: 26px;">of</span> values(obj)) {<br>  <span style="color: #e6c07b;line-height: 26px;">console</span>.log(value); <span style="color: #5c6370;font-style: italic;line-height: 26px;">// 1, 2, 3</span><br>}<br><br><span style="color: #c678dd;line-height: 26px;">for</span> (<span style="color: #c678dd;line-height: 26px;">let</span> [key, value] <span style="color: #c678dd;line-height: 26px;">of</span> entries(obj)) {<br>  <span style="color: #e6c07b;line-height: 26px;">console</span>.log([key, value]); <span style="color: #5c6370;font-style: italic;line-height: 26px;">// ['a', 1], ['b', 2], ['c', 3]</span><br>}<br>复制代码<br></code></pre></section><p style="text-align: right;"><span style="font-size: 12px;">来自:雪月</span></p><p style="text-align: right;"><span style="font-size: 12px;">https://juejin.cn/post/6960868793140641799</span></p><h2 data-id="heading-13" style="margin: 35px 8px 10px;padding-bottom: 12px;outline: 0px;font-size: 24px;letter-spacing: 0.544px;white-space: normal;color: rgb(0, 0, 0);text-align: left;caret-color: rgb(51, 51, 51);text-size-adjust: auto;line-height: 1.5;border-bottom: 1px solid rgb(236, 236, 236);font-family: "PingFang SC", "Source Sans Pro", "Hiragino Sans GB", "Helvetica Neue", Helvetica, "Microsoft Yahei", arial, sans-serif;background-color: rgb(255, 255, 255);">最后</h2><section style="margin-bottom: 20px;padding-right: 0.5em;padding-left: 0.5em;outline: 0px;white-space: normal;font-size: 16px;text-align: left;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;letter-spacing: 2px;caret-color: rgb(51, 51, 51);text-size-adjust: auto;widows: 1;word-spacing: 2px;background-color: rgb(255, 255, 255);line-height: 1.8em;color: rgb(58, 58, 58);">欢迎关注【前端瓶子君】✿✿ヽ(°▽°)ノ✿</section><section class="mp_profile_iframe_wrp"><mpprofile class="js_uneditable custom_select_card mp_profile_iframe" data-pluginname="mpprofile" data-id="MzUzNjk5MTE1OQ==" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/pfCCZhlbMQT49XgH4IwJDH7MrbFPo2UFN7g3pCM2D8ZfREoXlmFHnpNs9YsdglyF8ekm3OFz2X4oW9I2JLHvhw/0?wx_fmt=png" data-nickname="前端瓶子君" data-alias="pinzi_com" data-signature="瓶子君,2021致力于帮助前端开启技术专项+算法之路!" data-from="0"></mpprofile></section><section style="margin-bottom: 20px;padding-right: 0.5em;padding-left: 0.5em;outline: 0px;white-space: normal;font-size: 16px;text-align: left;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;letter-spacing: 2px;caret-color: rgb(51, 51, 51);text-size-adjust: auto;widows: 1;word-spacing: 2px;background-color: rgb(255, 255, 255);line-height: 1.8em;color: rgb(58, 58, 58);"><span style="outline: 0px;letter-spacing: 0px;">回复「</span><span style="outline: 0px;letter-spacing: 0px;color: rgb(61, 167, 66);">算法</span><span style="outline: 0px;letter-spacing: 0px;">」,加入前端编程源码算法群,每日一道面试题(工作日),<span style="outline: 0px;letter-spacing: 2px;">第二天瓶子君都会很认真的解答哟!</span></span><br style="outline: 0px;"></section><section style="margin-bottom: 20px;padding-right: 0.5em;padding-left: 0.5em;outline: 0px;white-space: normal;font-size: 16px;text-align: left;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;letter-spacing: 2px;caret-color: rgb(51, 51, 51);text-size-adjust: auto;widows: 1;word-spacing: 2px;background-color: rgb(255, 255, 255);line-height: 1.8em;color: rgb(58, 58, 58);"><span style="outline: 0px;letter-spacing: 0px;"><span style="outline: 0px;letter-spacing: 0px;">回复「</span><span style="outline: 0px;letter-spacing: 0px;color: rgb(61, 167, 66);">交流</span><span style="outline: 0px;letter-spacing: 0px;">」,吹吹水、聊聊技术、吐吐槽!</span></span></section><section style="margin-bottom: 20px;padding-right: 0.5em;padding-left: 0.5em;outline: 0px;white-space: normal;font-size: 16px;text-align: left;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;letter-spacing: 2px;caret-color: rgb(51, 51, 51);text-size-adjust: auto;widows: 1;word-spacing: 2px;background-color: rgb(255, 255, 255);line-height: 1.8em;color: rgb(58, 58, 58);"><span style="outline: 0px;letter-spacing: 0px;">回复「</span><span style="outline: 0px;letter-spacing: 0px;color: rgb(61, 167, 66);">阅读</span><span style="outline: 0px;letter-spacing: 0px;">」,每日刷刷高质量好文!</span></section><section style="margin-bottom: 20px;padding-right: 0.5em;padding-left: 0.5em;outline: 0px;white-space: normal;font-size: 16px;text-align: left;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;letter-spacing: 2px;caret-color: rgb(51, 51, 51);text-size-adjust: auto;widows: 1;word-spacing: 2px;background-color: rgb(255, 255, 255);line-height: 1.8em;color: rgb(58, 58, 58);"><span style="outline: 0px;letter-spacing: 0px;">如果这篇文章对你有帮助,<span style="outline: 0px;letter-spacing: 0px;">「</span><span style="outline: 0px;letter-spacing: 0px;color: rgb(61, 167, 66);">在看</span><span style="outline: 0px;letter-spacing: 0px;">」是最大的支持</span></span></section><section style="margin-top: 5px;margin-bottom: 10px;padding-right: 0.5em;padding-left: 0.5em;outline: 0px;white-space: normal;color: rgb(0, 0, 0);font-size: 16px;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;letter-spacing: 2px;caret-color: rgb(51, 51, 51);text-size-adjust: auto;widows: 1;word-spacing: 2px;background-color: rgb(255, 255, 255);text-align: center;"><a class="weapp_text_link" data-miniprogram-appid="wx27c980b913cbfb08" data-miniprogram-path="pages/index/index" data-miniprogram-nickname="高级前端面试" data-miniprogram-type="text" data-miniprogram-servicetype="0" wah-hotarea="click" style="outline: 0px;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);cursor: pointer;font-size: 16px;" > 》》面试官也在看的算法资料《《</a><br style="outline: 0px;"></section><section style="padding-right: 0.5em;padding-left: 0.5em;outline: 0px;white-space: normal;font-size: 16px;color: rgb(89, 89, 89);font-family: Optima-Regular, Optima, PingFangTC-Light, PingFangSC-light, PingFangTC-light;letter-spacing: 2px;caret-color: rgb(51, 51, 51);text-size-adjust: auto;widows: 1;word-spacing: 2px;background-color: rgb(255, 255, 255);border-width: 0px;border-style: none;border-color: initial;text-align: right;"><section style="outline: 0px;display: inline-block;clear: both;"><section data-brushtype="text" style="padding: 18px 15px 20px 10px;outline: 0px;color: rgb(86, 146, 214);background-image: url("https://mmbiz.qpic.cn/mmbiz_png/Pn4Sm0RsAuhpplm16ibb8iaib7RoGQ5iaHEdy66AHd7QqL7A2s5icSBE0aw4iaKOKPnXGYxQPhG7VMpbbYV6VJprSh7w/640?wx_fmt=png");text-align: center;background-size: 100% 100%;letter-spacing: 1.5px;background-repeat: no-repeat;"><section style="outline: 0px;display: flex;justify-content: center;align-items: center;"><section data-brushtype="text" style="outline: 0px;font-size: 14px;color: rgb(51, 51, 51);text-align: right;"><span style="outline: 0px;font-family: 楷体, 楷体_GB2312, SimKai;color: rgb(255, 104, 39);">“在看和转发”</span><span style="outline: 0px;font-family: 楷体, 楷体_GB2312, SimKai;">就是最大的支持</span></section></section></section></section></section> </div></div></div><div class="tag-list-box"><div class="tag-list"><div class="tag-list-container"></div></div></div><span class="view_num">浏览 1</span><div class="float-bar float-bar-relative" id="float-bar-relative"><div class="float-bar-body"><div class="item qinglite-zan"><i class="iconfont icon-dianzan"></i>点赞 </div><div class="gap"></div><a href="#comments" class="item"><i class="iconfont iconfont icon-pinglun1"></i><span class="com_num"></span>评论 </a><div class="item qinglite-collect"><i class="iconfont icon-shoucang"></i>收藏 </div><div class="item qinglite_share"><i class="iconfont icon-fenxiang1"></i>分享 <div class="qrcode-modal"><img src="/api/pub/ewm" alt=""><p>手机扫一扫分享</p></div></div><div class="expand"></div><a onclick="miniProgram_navigateTo_func()" class="item qinglite_share_miniapp miniapp_show"><i class="iconfont icon-fenxiang1"></i>分享 </a><div class="item jubao qinglite-jubao miniapp_hide"><i class="iconfont icon-jubao"></i> 举报 </div></div></div></div><div class="comments_wrapper comments"><div class="title">评论</div><div id="comments" class="comments"><div class="error"></div><div class="textarea-wrapper"><textarea class="comment-content" cols="30" rows="5" placeholder="输入评论"></textarea></div><div class="button"><div class="error"><div class="comment-emojis"><div class="comment-choose-img qinglite_upload"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-tupianyangshi2"></use></svg><span>图片</span></div><div class="comment-choose-img comment-emoji-btn"><svg class="icon show-emoji-list" aria-hidden="true"><use xlink:href="#icon-biaoqing"></use></svg><span class="show-emoji-list">表情</span><div class="comment-emoji-list"></div></div><div style="display: none" class="comment-choose-img"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-shipinwenjian1"></use></svg><span>视频</span></div></div></div><button class="qinglite-comment">评价</button></div><div class="medias qinglite_upload_content"></div></div></div><div style="display: none" class="comments"><div class="title">全部评论</div><div class="comments comment-item-content"></div></div><div id="recommend" class="comments hide_app"><div class="title">推荐 <a href="#qs_detail" class="iconfont icon-huidaodingbu"></a></div></div><div class="qs_post_list flow_post_list hide_app"><div class="item img qinglite_item"><a href="/doc/586764770d01bca23" title="【JS】1162- 90% 的前端都会使用 ES6 来简化代码,你都用过哪些?" class="content"><div class="bg" style="background-image:url(https://filescdn.proginn.com/db7db4290ddd96252300e743c6a688e5/15d6c762898a6de481d8e67d88a4b4a6.webp?x-oss-process=image/resize,w_300)"></div></a><a href="/doc/586764770d01bca23" title="【JS】1162- 90% 的前端都会使用 ES6 来简化代码,你都用过哪些?" class="title_middle">【JS】1162- 90% 的前端都会使用 ES6 来简化代码,你都用过哪些?</a><a href="https://jishu.proginn.com/u/63446447295dc213d" title="前端自习课" class="up_info"><div style="background-image:url(https://inn.proginn.com/useralbum/465980/cps_wx_0173a36605ea.jpg!mediumicon?imageMogr2/format/webp/thumbnail/!200x200r)" class="avatar"></div><div class="username">前端自习课</div><div class="expand"></div><div class="likes"><i class="iconfont icon-dianzan"></i></div><span class="num">0</span></a></div><div class="item img qinglite_item"><a href="/doc/40086475e46a0daaf" title="25条实用的Python一行代码,你用过哪些?" class="content"><div class="bg" style="background-image:url(https://filescdn.proginn.com/15b7a9c232bb4b8df9c5fc8d30ac20ac/d3a88eca661dd8c240cd8e7b5367a707.webp?x-oss-process=image/resize,w_300)"></div></a><a href="/doc/40086475e46a0daaf" title="25条实用的Python一行代码,你用过哪些?" class="title_middle">25条实用的Python一行代码,你用过哪些?</a><a href="https://jishu.proginn.com/u/7492643ec76a4a843" title="小詹学Python" class="up_info"><div style="background-image:url(https://inn.proginn.com/useralbum/378868/cps_wx_0173a36584f6.jpg!mediumicon?imageMogr2/format/webp/thumbnail/!200x200r)" class="avatar"></div><div class="username">小詹学Python</div><div class="expand"></div><div class="likes"><i class="iconfont icon-dianzan"></i></div><span class="num">0</span></a></div><div class="item img qinglite_item"><a href="/doc/30366475ded9cec2a" title="25条实用的Python一行代码,你用过哪些?" class="content"><div class="bg" style="background-image:url(https://filescdn.proginn.com/f23adb036acacdb38e9c52a2cccdb577/1d693b4dd635224a60f5e8aed7d9d968.webp?x-oss-process=image/resize,w_300)"></div></a><a href="/doc/30366475ded9cec2a" title="25条实用的Python一行代码,你用过哪些?" class="title_middle">25条实用的Python一行代码,你用过哪些?</a><a href="https://jishu.proginn.com/u/208264438f51f2e88" title="Crossin的编程教室" class="up_info"><div style="background-image:url(https://inn.proginn.com/useralbum/463105/cps_wx_0173a365f16c.jpg!mediumicon?imageMogr2/format/webp/thumbnail/!200x200r)" class="avatar"></div><div class="username">Crossin的编程教室</div><div class="expand"></div><div class="likes"><i class="iconfont icon-dianzan"></i></div><span class="num">0</span></a></div><div class="item img qinglite_item"><a href="/doc/40806475e51517aea" title="25条实用的Python一行代码,你用过哪些?" class="content"><div class="bg" style="background-image:url(https://filescdn.proginn.com/6c66672e0b2396301e0c77912a90adb8/25b045424aac9a0dc3d155d112f52003.webp?x-oss-process=image/resize,w_300)"></div></a><a href="/doc/40806475e51517aea" title="25条实用的Python一行代码,你用过哪些?" class="title_middle">25条实用的Python一行代码,你用过哪些?</a><a href="https://jishu.proginn.com/u/82516442579abd25b" title="python之禅" class="up_info"><div style="background-image:url(https://inn.proginn.com/useralbum/453071/cps_wx_0173a3659574.jpg!mediumicon?imageMogr2/format/webp/thumbnail/!200x200r)" class="avatar"></div><div class="username">python之禅</div><div class="expand"></div><div class="likes"><i class="iconfont icon-dianzan"></i></div><span class="num">0</span></a></div><div class="item qinglite_item qinglite_item_news"><a href="/doc/f00537006519d957bf0d0" title="spring-boot-starter-swagger简化使用 Swagger2 的整合代码" class="content"><div class="qinglite_item_top_wrapper"><div class="title">spring-boot-starter-swagger简化使用 Swagger2 的整合代码</div><div class="right-top-icon-tag"></div></div><div class="desc">该项目主要利用Spring Boot的自动化配置特性来实现快速地将swagger2引入spring </div></a></div><div class="item img qinglite_item"><a href="/doc/35626474bbfeba93a" title="50个好用的前端框架,你都用过吗" class="content"><div class="bg" style="background-image:url(https://filescdn.proginn.com/56a396c5a669f691531570a1cae8893a/1ddd621ad3719fa0c69dea3816a5ac1c.webp?x-oss-process=image/resize,w_300)"></div></a><a href="/doc/35626474bbfeba93a" title="50个好用的前端框架,你都用过吗" class="title_middle">50个好用的前端框架,你都用过吗</a><a href="https://jishu.proginn.com/u/2973644377a6ce7f5" title="程序源代码" class="up_info"><div style="background-image:url(https://inn.proginn.com/useralbum/462614/cps_wx_0173a365c6dc.jpg!mediumicon?imageMogr2/format/webp/thumbnail/!200x200r)" class="avatar"></div><div class="username">程序源代码</div><div class="expand"></div><div class="likes"><i class="iconfont icon-dianzan"></i></div><span class="num">0</span></a></div><div class="item qinglite_item qinglite_item_news"><a href="/pedia/f00530246519d956433a7" title="spring-boot-starter-swagger简化使用 Swagger2 的整合代码" class="content"><div class="qinglite_item_top_wrapper"><div class="title">spring-boot-starter-swagger简化使用 Swagger2 的整合代码</div><div class="right-top-icon-tag"></div></div><div class="desc">该项目主要利用SpringBoot的自动化配置特性来实现快速地将swagger2引入springboot应用来生成API文档,简化原生使用swagger2的整合代码。</div></a></div><div class="item img qinglite_item"><a href="/doc/6576647798fd4f9f1" title="33个热门数据分析软件,你都用过哪些?" class="content"><div class="bg" style="background-image:url(https://filescdn.proginn.com/2f14e920e8cffd4a0cb6e6ae3f6bb0c3/19202ac9a8ebf064f83e74284624a7aa.webp?x-oss-process=image/resize,w_300)"></div></a><a href="/doc/6576647798fd4f9f1" title="33个热门数据分析软件,你都用过哪些?" class="title_middle">33个热门数据分析软件,你都用过哪些?</a><a href="https://jishu.proginn.com/u/7492643ec76a4a843" title="小詹学Python" class="up_info"><div style="background-image:url(https://inn.proginn.com/useralbum/378868/cps_wx_0173a36584f6.jpg!mediumicon?imageMogr2/format/webp/thumbnail/!200x200r)" class="avatar"></div><div class="username">小詹学Python</div><div class="expand"></div><div class="likes"><i class="iconfont icon-dianzan"></i></div><span class="num">0</span></a></div><div class="item img qinglite_item"><a href="/doc/700064778fb2e1078" title="33个热门数据分析软件,你都用过哪些?" class="content"><div class="bg" style="background-image:url(https://filescdn.proginn.com/7593317bc75347b089d64f99d51285c2/dc661d6559f9aaf4b7559ed2d0402101.webp?x-oss-process=image/resize,w_300)"></div></a><a href="/doc/700064778fb2e1078" title="33个热门数据分析软件,你都用过哪些?" class="title_middle">33个热门数据分析软件,你都用过哪些?</a><a href="https://jishu.proginn.com/u/422964758d7449036" title="俊红的数据分析之路" class="up_info"><div style="background-image:url(https://stacdn.proginn.com/image/usericon/1.png?imageMogr2/format/webp/thumbnail/!200x200r)" class="avatar"></div><div class="username">俊红的数据分析之路</div><div class="expand"></div><div class="likes"><i class="iconfont icon-dianzan"></i></div><span class="num">0</span></a></div><div class="item img qinglite_item"><a href="/doc/116364752222caac6" title="排名前 16 的 Java 工具类,你都用过哪些?" class="content"><div class="bg" style="background-image:url(https://filescdn.proginn.com/1f0c044bb8755784b9aaccb3741db87b/6c9dab3bfdd796fac4d8492c7d6a8bd5.webp?x-oss-process=image/resize,w_300)"></div></a><a href="/doc/116364752222caac6" title="排名前 16 的 Java 工具类,你都用过哪些?" class="title_middle">排名前 16 的 Java 工具类,你都用过哪些?</a><a href="https://jishu.proginn.com/u/760964428f9f5e5e7" title="java团长" class="up_info"><div style="background-image:url(https://inn.proginn.com/useralbum/455518/cps_wx_0173a365a063.jpg!mediumicon?imageMogr2/format/webp/thumbnail/!200x200r)" class="avatar"></div><div class="username">java团长</div><div class="expand"></div><div class="likes"><i class="iconfont icon-dianzan"></i></div><span class="num">0</span></a></div><i></i><i></i><i></i><i></i><i></i></div><div class="float-bar" id="float-bar"><div class="float-bar-body"><div class="item qinglite-zan"><i class="iconfont icon-dianzan"></i>点赞 </div><div class="gap"></div><a href="#comments" class="item"><i class="iconfont iconfont icon-pinglun1"></i><span class="com_num"></span>评论 </a><div class="item qinglite-collect"><i class="iconfont icon-shoucang"></i>收藏 </div><div class="item qinglite_share"><i class="iconfont icon-fenxiang1"></i>分享 <div class="qrcode-modal"><img src="/api/pub/ewm" alt=""><p>手机扫一扫分享</p></div></div><div class="expand"></div><a onclick="miniProgram_navigateTo_func()" class="item qinglite_share_miniapp miniapp_show"><i class="iconfont icon-fenxiang1"></i>分享 </a><div class="item jubao qinglite-jubao miniapp_hide"><i class="iconfont icon-jubao"></i> 举报 </div><a href="#recommend" class="item iconfont icon-huidaodingbu"></a></div></div></article></div></main><script> let act_type = 1; let act_pro_id="225948"; let act_point = 0; let act_kind = 0; let act_time =90000; let act_page_id=""; </script><footer id="footer"><div class="container"><div class="links"><i class="copyright">2023©技术圈</i><a href="https://jishu.proginn.com">隐私协议</a><a href="https://jishu.proginn.com">用户协议</a><a href="https://jishu.proginn.com/about">关于我们</a></div></div></footer><link href="https://qinglite-1253448069.cos.ap-shanghai.myqcloud.com/css/layui/css/layui.css" rel="stylesheet"><script src="https://qinglite-1253448069.cos.ap-shanghai.myqcloud.com/css/layui/layui.js?v=v202311290135"></script><script> var $ = layui.jquery; </script><script src="https://cdn.qinglite.cn/js/pub.js?v=v202311290135"></script><script src="https://cdn.qinglite.cn/js/news_info.js?v=v202311290135"></script><link rel="stylesheet" href="https://qinglite-1253448069.cos.ap-shanghai.myqcloud.com/css/icon/iconfont.css?v=v202311290135"><script src="https://qinglite-1253448069.cos.ap-shanghai.myqcloud.com/css/icon/iconfont.js?v=v202311290135"></script></body></html>