JavaScript编码之路【对象的增强、ES6新特性之函数的默认值设置 、rest参数 (剩余参数)、拓展运算符、对象与数组的解构赋值】

简介: JavaScript编码之路【对象的增强、ES6新特性之函数的默认值设置 、rest参数 (剩余参数)、拓展运算符、对象与数组的解构赋值】

前言

嘟三~ 嘟三~ 今日份广播题目:“怎么让JavaScript越来越6”。接下来,小菜鸡本人将和大家一起来探讨ES6-ES13的那些酷酷的新特性,从这次广播开始,你也可以炫耀:“这个ES新特性我都用得溜溜的!”


一、ES对象的增强

ES6让JavaScript对象有了一种全新的魅力,ES6中对 对象字面量 进行了增强,称之为 Enhanced object literals(增强对象字面量)。

1.1. 属性的简写

你有没有过这样的经历?当你需要创建一个对象,你发现对象的属性名称和对应的变量名称恰好是一样的,你是否感到这样重复编码的过程非常痛苦?在ES6中,这问题已经被解决啦。

var name = "why"
var age = 18

// ES5的写法
var obj1 = {
  name: name,
  age: age
}

// ES6的增强写法
var obj2 = {
  name,
  age
}

1.2. 方法的简写

对象不仅被赋予了简化属性的能力,而且对象的方法也可以多了简写方式,就像一个新家具能更好地装饰你的房子一样。

// ES5的方法写法
var info1 = {
  foo: function() {

  },
  bar: function() {

  }
}

// ES6的增强写法
var info2 = {
  foo() {

  },
  bar() {
    
  }
}

1.3. 计算属性名

有时候,我们可能希望动态地设置对象的属性名。可以想象一下,这就像你的家有一扇神奇的门,门的名字不是固定的,而是根据你的需要改变。

var name = "three"
var obj = {
  one: 1,
  two: 2
}

obj[name] = 3

在ES6中,我们可以直接在字面量中编写计算属性名:

英文称之为 Computed Property Names

var name = "three"
var obj = {
  one: 1,
  two: 2,
  [name]: 3
}

console.log(obj)


二、函数知识补充

1.1. 函数的默认值设置

在ES6之前,我们编写的函数参数是没有默认值的,所以我们在编写函数时,如果有下面的需求:

  • 传入了参数,那么使用传入的参数
  • 没有传入参数,那么使用一个默认值

通常我们会进行如下方式的实现:

function foo(x, y) {
  x = x || 20
  y = y || 30
  console.log(x, y)
}

foo(50, 100) // 50 100
foo() // 20 30

其实这种做法是有弊端的,如果我们传入null、0、空字符串,那么会认为需要使用默认值:

foo(null, "") // 20, 30

而在ES6中,我们允许给函数一个默认值:

function foo(x = 20, y = 30) {
  console.log(x, y)
}

foo(50, 100) // 50 100
foo() // 20 30

我们使用ES6默认值的写法不仅仅可以避免上面的问题,而且代码的阅读性也会更强:

其实ES6的默认值转化后是如下的代码

function foo() {
  var x =
    arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 20;
  var y =
    arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 30;
  console.log(x, y);
}

默认值也可以和解构一起来使用

// 写法一:
function foo({name, age} = {name: "why", age: 18}) {
  console.log(name, age)
}

// 写法二:
function foo({name = "why", age = 18} = {}) {
  console.log(name, age)
}

foo()

1.2. 函数的剩余参数

有时,作为一个厨师,你可能会面临一个问题:你不知道会收到多少食材(参数)。ES6解决了这个问题——通过引入rest参数(剩余参数),你可以接收任意数量的参数。这就好比一个能装任意食材的无底洞口袋。

function makeSalad(...ingredients) {
  return `Making a salad with ingredients: ${ingredients.join(', ')}.`
}

console.log(makeSalad('lettuce', 'tomato', 'cucumber'))  // Making a salad with ingredients: lettuce, tomato, cucumber.

剩余参数必须放到最后一个位置,否则会报错:

function foo(m, ...args, n) {
  console.log(m, args, n)
}

// Rest parameter must be last formal parameter
foo(20, 30, 40, 50)

那么剩余参数和arguments有什么区别呢?


  • 剩余参数只包含那些没有对应形参的实参,而 arguments 对象包含了传给函数的所有实参
  • arguments对象不是一个真正的数组,而rest参数是一个真正的数组,可以进行数组的所有操作
  • arguments是早期的ECMAScript中为了方便去获取所有的参数提供的一个数据结构,而rest参数是ES6中提供并且希望以此来替代arguments的


三、拓展运算符

展开语法(Spread syntax)

  • 可以在函数调用/数组构造时,将数组表达式或者string在语法层面展开
  • 还可以在构造字面量对象时, 将对象表达式按key-value的方式展开

在函数调用时使用:

const names = ['a','b','c','d']
foo(...names)
const name = "abc"
foo(...name)

在数组构造时使用:

const newNames = [...names, ...name]
console.log(newNames)

在构建对象字面量时,也可以使用展开运算符,这个是在ES2018(ES9)中添加的新特性:

const newObj = {...obj, height: 1.88, ...names}
console.log(newObj)

展开语法是一种浅拷贝:

const obj = {
  friend: { name: "kobe" }
}

const newObj = { ...obj }
newObj.friend.name = "james"
console.log(obj.friend.name) // james


四、对象与数组的解构赋值

ES6中新增了一个从数组或对象中方便获取数据的方法,称之为解构Destructuring。

4.1. 数组的解构

数组的解构就是从数组中获取我们需要的数组:

var names = ["abc", "cba", "nba"]
var [name1, name2, name3] = names
console.log(name1, name2, name3)

数组的解构必须按照数据的顺序依次获取,如果我们只想获取第二个和第三个,那么可以有如下语法:

var [, nameb, namec] = names
console.log(nameb, namec)

如果我们希望解构出来一个元素,其他元素继续放到另外一个数组中:

var [namea, ...newNames] = names
console.log(namea, newNames)

如果我们解构的数据数量大于数组中原本的数据数量,那么会返回undefined:

var [namex, namey, namez, namem] = names
console.log(namem) // undefined

我们可以在解构出来的数据为undefined的时候,给它一个默认值:

var [namex, namey, namez, namem = "aaa"] = names
console.log(namem) // aaa

4.2. 对象的解构

对象的解构和数组的解构是相似的,不同之处在于:

  • 数组中的元素是按照顺序排列的,并且我们只能根据顺序来确定需要获取的数据
  • 对象中的数据由key和value组成,我们可以通过key来获取想要的value
var obj = {
  name: "why",
  age: 18,
  height: 1.88
}

var { name, age, height } = obj
console.log(name, age, height)

因为对象是可以通过key来解构的,所以它对顺序、个数都没有要求:

var { height, name, age } = obj
console.log(name, age, height)

var { age, height } = obj
console.log(age, height)

如果我们对变量的名称不是很满意,那么我们可以重新命名:

var { name: whyName, age: whyAge } = obj
console.log(whyName, whyAge)

我们也可以给变量一个默认值:

var { name, address = "广州市" } = obj
console.log(name, address)

4.3. 解构的使用

  • 在开发中拿到一个变量时,自动对其进行解构使用
  • 对函数的参数进行解构

小结

目录
相关文章
|
1月前
|
机器学习/深度学习 JavaScript 前端开发
JS进阶教程:递归函数原理与篇例解析
通过对这些代码示例的学习,我们已经了解了递归的原理以及递归在JS中的应用方法。递归虽然有着理论升华,但弄清它的核心思想并不难。举个随手可见的例子,火影鸣人做的影分身,你看到的都是同一个鸣人,但他们的行为却能在全局产生影响,这不就是递归吗?雾里看花,透过其间你或许已经深入了递归的魅力之中。
77 19
|
3月前
|
编解码 JavaScript 前端开发
【Java进阶】详解JavaScript的BOM(浏览器对象模型)
总的来说,BOM提供了一种方式来与浏览器进行交互。通过BOM,你可以操作窗口、获取URL、操作历史、访问HTML文档、获取浏览器信息和屏幕信息等。虽然BOM并没有正式的标准,但大多数现代浏览器都实现了相似的功能,因此,你可以放心地在你的JavaScript代码中使用BOM。
113 23
|
3月前
|
JavaScript
JS实现多条件搜索函数
JS封装的多条件搜索
|
5月前
|
JavaScript 前端开发
JavaWeb JavaScript ③ JS的流程控制和函数
通过本文的详细介绍,您可以深入理解JavaScript的流程控制和函数的使用,进而编写出高效、可维护的代码。
119 32
|
4月前
|
JavaScript 前端开发 Java
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
柯里化是一种强大的函数式编程技术,它通过将函数分解为单参数形式,实现了灵活性与可复用性的统一。无论是参数复用、延迟执行,还是函数组合,柯里化都为现代编程提供了极大的便利。 从 Redux 的选择器优化到复杂的数据流处理,再到深度嵌套的函数优化,柯里化在实际开发中展现出了非凡的价值。如果你希望编写更简洁、更优雅的代码,柯里化无疑是一个值得深入学习和实践的工具。从简单的实现到复杂的应用,希望这篇博客能为你揭开柯里化的奥秘,助力你的开发之旅! 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一
|
6月前
|
JavaScript 算法 安全
深度剖析:共享文件怎么设置密码和权限的 Node.js 进阶算法
在数字化时代,共享文件的安全性至关重要。本文聚焦Node.js环境,介绍如何通过JavaScript对象字面量构建数据结构管理文件安全信息,包括使用`bcryptjs`库加密密码和权限校验算法,确保高效且安全的文件共享。通过实例代码展示加密与权限验证过程,帮助各行业实现严格的信息资产管理与协作。
|
8月前
|
JSON 前端开发 JavaScript
JavaScript中对象的数据拷贝
本文介绍了JavaScript中对象数据拷贝的问题及解决方案。作者首先解释了对象赋值时地址共享导致的值同步变化现象,随后提供了五种解决方法:手动复制、`Object.assign`、扩展运算符、`JSON.stringify`与`JSON.parse`组合以及自定义深拷贝函数。每种方法都有其适用场景和局限性,文章最后鼓励读者关注作者以获取更多前端知识分享。
85 1
JavaScript中对象的数据拷贝
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
206 2
|
8月前
|
JavaScript 前端开发
JavaScript中的原型 保姆级文章一文搞懂
本文详细解析了JavaScript中的原型概念,从构造函数、原型对象、`__proto__`属性、`constructor`属性到原型链,层层递进地解释了JavaScript如何通过原型实现继承机制。适合初学者深入理解JS面向对象编程的核心原理。
110 1
JavaScript中的原型 保姆级文章一文搞懂
|
8月前
JS+CSS3文章内容背景黑白切换源码
JS+CSS3文章内容背景黑白切换源码是一款基于JS+CSS3制作的简单网页文章文字内容背景颜色黑白切换效果。
79 0

热门文章

最新文章