JS ES6展开运算符的几个妙用

1. 添加属性

复制对象的同时,为其添加新的属性。

例子中复制了user对象到userWithPass,并添加了password属性。

const user = { id: 110, name: 'Kayson Li'}
const userWithPass = { ...user, password: 'Password!' }

user //=> { id: 110, name: 'Kayson Li'}
userWithPass //=> {  id: 110, name: 'Kayson Li', password: 'Password!' }

2. 合并多个对象

利用...可以合并多个对象到一个新的对象。part1和part2合并到user1:

const part1 = {  id: 110, name: 'Kayson Li' }
const part2 = { id: 110, password: 'Password!' }

const user1 = { ...part1, ...part2 }
//=> { id: 110, name: 'Kayson Li', password: 'Password!' }

3. 移除对象属性

可以结合使用解构和剩余操作符删除对象的属性。例子中password被解构出来,其他属性保留在rest对象里并被返回。

const noPassword = ({ password, ...rest }) => rest
const user = {
  id: 110,
  name: 'Kayson Li',
  password: 'Password!'
}

noPassword(user) //=> { id: 110, name: 'Kayson Li' }

4.动态移除属性

来看一个例子。removeProperty函数接受一个参数prop,利用动态属性名这个特性,prop可以动态地从拷贝对象中移除。

const user1 = {
  id: 110,
  name: 'Kayson Li',
  password: 'Password!'
}
const removeProperty = prop => ({ [prop]: _, ...rest }) => rest
//                     ----       ------
//                          \   /
//                      动态解构

const removePassword = removeProperty('password')
const removeId = removeProperty('id')

removePassword(user1) //=> { id: 110, name: 'Kayson Li' }
removeId(user1) //=> { name: 'Kayson Li', password: 'Password!' }

5. 调整属性顺序

有时候对象的属性并不是我们想要的顺序。利用一些技巧,可以将属性移到最前面或最后面。

为了把id移到最前面,可以把id: undefined放在展开object的前面:

const user3 = {
  password: 'Password!',
  name: 'Bruce',
  id: 300
}

const organize = object => ({ id: undefined, ...object })
//                            -------------
//                          /
//  移动 id 到第一个属性位置

organize(user3)
//=> { id: 300, password: 'Password!', name: 'Bruce' }

要把password移动到最后位置,先从object中解构出password,然后把password放在展开object的后面:

const user3 = {
  password: 'Password!',
  name: 'Bruce',
  id: 300
}

const organize = ({ password, ...object }) =>
  ({ ...object, password })
//              --------
//             /
// 把 password 移动到最后

organize(user3)
//=> { name: 'Bruce', id: 300, password: 'Password!' }

6. 设置属性默认值

当对象不存在某个属性时,我们有时候需要给对象添加这个属性,并设置一个默认值。

例如,user2没有quotes属性,setDefaults函数的作用是确保所有对象都有quotes,并有个默认值[]。

执行setDefaults(user2),返回的对象包含quotes: []。

执行 setDefaults(user4),由于user4已经有quotes了,那它就保持不变。

const user2 = {
  id: 200,
  name: 'Jack Ma'
}

const user4 = {
  id: 400,
  name: '鲁迅',
  quotes: ["我没说过这句话……"]
}

const setDefaults = ({ quotes = [], ...object}) =>
  ({ ...object, quotes })

setDefaults(user2)
//=> { id: 200, name: 'Jack Ma', quotes: [] }

setDefaults(user4)
//=> {
//=>   id: 400,
//=>   name: '鲁迅',
//=>   quotes: ["我没说过这句话……"]
//=> }

如果想让这个属性在最前面,可以这样写:

const setDefaults = ({ ...object}) => ({ quotes: [], ...object })

7: 属性重命名

结合前面的几个技巧,我们可以写一个给属性重命名的函数。

假设某些对象都有大写的ID属性,我们想让它们都变成小写,该怎么做呢?先从object中解构出ID的值,然后再把这个值合并到新对象里,改成小写的id:

const renamed = ({ ID, ...object }) => ({ id: ID, ...object })

const user = {
  ID: 500,
  name: "张全蛋"
}

renamed(user) //=> { id: 500, name: '张全蛋' }

8. 还有更秀的操作

可以根据条件决定是否添加某个属性,这在构造请求参数的时候非常有用。比如,我们只在password有值的情况才添加该属性:

const user = { id: 110, name: 'Kayson Li' }
const password = 'Password!'
const userWithPassword = {
  ...user,
  id: 100,
  ...(password && { password })
}

userWithPassword //=> { id: 110, name: 'Kayson Li', password: 'Password!' }

以上就是JS ES6展开运算符的几个妙用的详细内容,更多关于JS ES6展开运算符的资料请关注我们其它相关文章!

(0)

相关推荐

  • ES6 十大特性简介

    ES6(ECMAScript2015)的出现,无疑给前端开发人员带来了新的惊喜,它包含了一些很棒的新特性,可以更加方便的实现很多复杂的操作,提高开发人员的效率. 本文主要针对ES6做一个简要介绍. 也许你还不知道ES6是什么, 实际上, 它是一种新的javascript规范.在这个大家都很忙碌的时代,如果你想对ES6有一个快速的了解,那么请继续往下读,去了解当今最流行的编程语言JavaScript最新一代的十大特性. 以下是ES6排名前十的最佳特性列表(排名不分先后): 1.Block-Scop

  • ES6基础之展开语法(Spread syntax)

    展开语法用"..."进行表示,展开语法将可迭代的对象拆分成独立的值(语法层面展开).扩展语法通常用于将可迭代的对象的值传递到函数的参数中.今天小编将从以下方面进行介绍: 函数传参中的应用 数组的相关应用 剩余参数的应用 函数传参中的应用 ES6之前,如果我们希望将数组作为参数分别传递给函数中的参数,我们可以使用Function的apply()方法.如下段代码所示: function myFunction(a, b) { return a + b; } var data = [1, 4]

  • ES6中的类(Class)示例详解

    类的基本语法 ES6提供了更接近面向对象(注意:javascript本质上是基于对象的语言)语言的写法,引入了Class(类)这个概念,作为对象的模板.通过class关键字,可以定义类. 基本上,ES6的class可以看作只是一个语法糖,它的绝大部分功能,ES5都可以做到,新的class写法只是让对象原型的写法更加清晰.更像面向对象编程的语法而已. //定义类 class Point { constructor(x, y) { this.x = x; this.y = y; } toString

  • JavaScript中展开运算符及应用的实例代码

    展开运算符(spread operator)允许一个表达式在某处展开.展开运算符在多个参数(用于函数调用)或多个元素(用于数组字面量)或者多个变量(用于解构赋值)的地方可以使用. let obj1 = { value1: 1, value2: 2 }; let obj2 = {...obj1 }; console.log(obj2); // {value1: 1, value2: 2} 上面的用法实际相当于 obj2 = {value1: 1, value2: 2} 展开运算符的写法与obj2

  • JavaScript展开操作符(Spread operator)详解

    你可以通过展开操作符(Spread operator)...扩展一个数组对象和字符串.展开运算符(spread)是三个点(-),可以将可迭代对象转为用逗号分隔的参数序列.如同rest参数的逆运算. 用于数组 以数组为例,首先创建一个数组, const a = [1, 2, 3], b = [4,5,6]; 你可以轻松赋值一个数组: const c = [...a] // [1,2,3] 你还可以轻松拼接两个数组: const d = [...a,...b] // [1,2,3,4,5,6] 也可

  • 聊聊JS ES6中的解构

    概述 es6新增了一种从数组或者对象中获取指定元素的方式,这种方式就是我们今天要说的解构. 先来说说数组的解构 在有解构之前呢,我们获取数组中的指定元素通常是根据索引去做的: const arr = [1, 2, 3]; const a = arr[1]; 有了解构之后呢,我们便可以使用如下方式快速的去获取数组中的某个元素: const arr = [1, 2, 3]; const [a, b, c] = arr; console.log(a); console.log(b); console.

  • JS ES6异步解决方案

    最初使用回调函数 ​ 由于最初j s官方没有明确的规范,各种第三方库中封装的异步函数中传的回调函数中的参数没有明确的规范, 没有明确各个参数的意义, 不便于使用. ​ 但是node中有明确的规范 ​ node中的的回调模式: 1. 所有回调函数必须有两个参数,第一个参数表示错误,第二个参数表示结果 2. 所有回调函数必须作为函数最后的参数 3. 所有回调函数不能作为属性出现 es6 异步处理模型 Es6 出现以后, 官方就提出了异步处理的规范, 提出了一种适用于所有异步场景的处理模型.该模型有:

  • ES6字符串的扩展实例

    本节我们来学习 ES6 中字符串类型的扩展,包括一些字符串对象的新增方法的使用等. 字符的 Unicode 表示法 ES6 加强了对 Unicode 的支持,JavaScript 中可以采用 \\uxxx 形式表示一个字符,其中 xxxx 表示字符的码点.例如: console.log("\u0075"); // u 但是这种表示法只限于码点在 \\u0000~\\uFFFF 之间的字符.超出这个范围的字符,必须用两个双字节的形式表示. console.log("\uD842

  • 详解ES6 扩展运算符的使用与注意事项

    扩展运算符 spread syntax 又叫展开语法,写法是 ...,顾名思义,其实是用来展开字符串,数组和对象的一种语法,可以在函数调用/数组构造时, 将数组表达式或者 string 在语法层面展开:还可以在构造字面量对象时, 将对象表达式按 key-value 的方式展开.常用的语法如下: //函数调用: myFunction(...iterableObj); //字面量数组构造或字符串: [...iterableObj, '4', ...'hello', 6]; // 构造字面量对象时,进

  • JS ES6展开运算符的几个妙用

    1. 添加属性 复制对象的同时,为其添加新的属性. 例子中复制了user对象到userWithPass,并添加了password属性. const user = { id: 110, name: 'Kayson Li'} const userWithPass = { ...user, password: 'Password!' } user //=> { id: 110, name: 'Kayson Li'} userWithPass //=> { id: 110, name: 'Kayson

  • JS中位运算符的一些妙用

    目录 前言: 1.使用左移运算符<<迅速得出2的次方 2.使用^切换变量0或1 3.使用&判断奇偶性 4.使用!!将数字转为布尔值 5.使用~.>>.<<.>>>.|来取整 6.使用^来完成值交换 7.使用^判断符号是否相同 8.使用^来检查数字是否不相等 9.n&(n-1),如果为0,说明n是2的整数幂 10.使用A+0.5|0来替代Math.round() String 1.使用toString(16)取随机字符串 2.使用spli

  • 详解JS ES6编码规范

    1.块级作用域 1.1.let取代var ES6 提出了两个新的声明变量的命令: let 和const.其中,let可以完全取代var,因为两者语义相同,而且let没有副作用. var命令存在变量提升的特性,而let没有这个命令. 所谓变量提升,即指变量可以先使用,再声明,显然,这种编码规范非常不适合阅读. 1.2.全局常量和线程安全 在let和const之间,优先使用const. let应出现在单线程模块代码内,而const则非常适合多线程. // bad var a = 1, b = 2,

  • ES6扩展运算符的用途实例详解

    ES6的扩展运算符可以说是非常使用的,在给多参数函数传参,替代Apply,合并数组,和解构配合进行赋值方面提供了很好的便利性. 扩展运算符就是三个点"...",就是将实现了Iterator 接口的对象中的每个元素都一个个的迭代并取出来变成单独的被使用. 看这个例子: console.log(...[3, 4, 5]) 结果: 3 4 5 调用其实就是: console.log(3, 4, 5) 合并数组 可以使用扩展运算符将多个数组进行合并. let arr1 = [1, 2, 3]

  • ES6扩展运算符用法实例分析

    本文实例讲述了ES6扩展运算符用法.分享给大家供大家参考,具体如下: 扩展运算符用三个点号表示,功能是把数组或类数组对象展开成一系列用逗号隔开的值,扩展运算符有以下几点作用 一.展开数组 //展开数组 let a = [1,2,3,4,5], b = [...a,6,7]; console.log(b); //打印出来的值[1, 2, 3, 4, 5, 6, 7] 二.数组的拷贝 //数组的拷贝 var c = [1, 2, 3]; var d = [...c]; d.push(4); cons

  • ES6扩展运算符和rest运算符用法实例分析

    本文实例讲述了ES6扩展运算符和rest运算符用法.分享给大家供大家参考,具体如下: 运算符可以很好的为我们解决参数和对象数组未知情况下的编程,让我们的代码更健壮和简洁. 运算符有两种:对象扩展运算符与rest运算符. 1.对象扩展( spread)运算符(...) (1)解决参数个数问题 以前我们编程是传递的参数一般是确定,否则将会报错或者异常,如下: function test(a,b,c,d) { console.log(a) console.log(b) console.log(c) c

  • ES6扩展运算符的使用方法示例

    目录 什么是spread 和rest运算符 数组的扩展运算符 rest运算符(收集作用) spread运算符(展开作用) 对象的扩张运算符 浅克隆 深克隆 总结 什么是spread 和rest运算符 spread和rest运算符在ES6中,都用(...)表示,其中spread为扩展(展开)运算符,rest为剩余(收集)运算符.在不同的地方使用此运算符有不同的作用,可以从读和写两个角度考虑.其中写操作有收集作用,读操作有展开作用.在ES6中,(...)运算符只对数组有效,ES7中添加了对对象的扩展

随机推荐