JavaScript 扩展 (…) 运算符的 7 个技巧

介绍

JavaScript ES6 引入了新的扩展运算符 ( ...) 以使代码更简单、更美观。Mozilla将扩展运算符描述为:

扩展语法 允许在预期零个或多个参数(对于函数调用)或元素(对于数组字面量)的地方扩展诸如数组表达式或字符串之类的可迭代对象,或者在零个或多个参数的地方扩展对象表达式键值对(用于对象文字)是预期的。

描述比用途复杂,相信我。该运算符将改变您的编码方式。因此,事不宜迟,让我们从使用扩展运算符的基础开始。

基本

关键字...因此,它扩展了对象或数组的元素。下面是一个更容易理解的例子:

const arr = ['a','b','c'];
console.log(arr); // ["a", "b", "c"]
console.log(...arr); // "a", "b", "c"
console.log("a","b","c"); // "a", "b", "c"

如您所见, 的结果console.log(...arr);与 相同console.log("a","b","c");。操作员分别获取所有单独的元素。

现在您知道它的作用,让我们转到第一个技巧。

正确复制数组/对象

当我们想到复制一个对象或数组时,我们会这样做:

const arr = [1,2,3,4,5];
const arrCopy = arr;
console.log(arr); // [1,2,3,4,5]
console.log(arrCopy); // [1,2,3,4,5]

//------------------------------------------

const obj = { a:'A', b:'B', c:'C' };
const objCopy = obj;
console.log(obj); // { a:'A', b:'B', c:'C' }
console.log(objCopy); // { a:'A', b:'B', c:'C' }

它是否复制数组或对象?嗯,有点。只要数据不变。当您从复制的数组或对象中更改数据时,原始数据也会更改。请参见下面的示例:

const arr = [1,2,3,4,5];
const arrCopy = arr;
console.log(arr); // [1,2,3,4,5]
console.log(arrCopy); // [1,2,3,4,5]

arrCopy.push(6);
console.log(arr); // [1,2,3,4,5,6]
console.log(arrCopy); // [1,2,3,4,5,6]

// ----------------------

const obj = { a:'A', b:'B', c:'C' };
const objCopy = obj;
console.log(obj); // { a:'A', b:'B', c:'C' }
console.log(objCopy); // { a:'A', b:'B', c:'C' }

objCopy.c = 'X';
console.log(obj); // { a:'A', b:'B', c:'X' }
console.log(objCopy); // { a:'A', b:'B', c:'X' }

为什么会这样?因为 JavaScript 分配副本来引用原始文件。它们都指向同一个内存:arrwitharrCopyobjwith objCopy

那么,我们如何从原始创建副本,但是当我们更改副本的值时,原始不会改变?

我们要做的是通过改变初始化:
const arrCopy = arr;to const arrCopy = [ …arr ];
const objCopy = obj;toconst objCopy = { …obj };

请参阅下面的示例:

const arr = [1,2,3,4,5];
const arrCopy = [ ...arr ];
console.log(arr); // [1,2,3,4,5]
console.log(arrCopy); // [1,2,3,4,5]

arrCopy.push(6);
console.log(arr); // [1,2,3,4,5]
console.log(arrCopy); // [1,2,3,4,5,6]

// ----------------------

const obj = { a:'A', b:'B', c:'C' };
const objCopy = { ...obj };
console.log(obj); // { a:'A', b:'B', c:'C' }
console.log(objCopy); // { a:'A', b:'B', c:'C' }

objCopy.c = 'X';
console.log(obj); // { a:'A', b:'B', c:'C' }
console.log(objCopy); // { a:'A', b:'B', c:'X' }

合并数组/对象

使用扩展运算符合并数组或对象非常简单。您只需要创建一个空数组或对象,并使用扩展运算符扩展变量。这是一个例子:

const arr1 = [1,2,3];
const arr2 = [4,5,6];
const arr3 = [7,8,9];
const mergedArr = [...arr1, ...arr2, ...arr3];
console.log(mergedArr);
// [1, 2, 3, 4, 5, 6, 7, 8, 9]

const objA = { a:'A', b:'B' };
const objB = { c:'C', d:'D' };
const mergedObj = { ...objA, ...objB };
console.log(mergedObj);
// { a: "A", b: 'B', c: "C", d: "D" }

因此,无需将元素一一展开并将它们放入新的合并数组或对象中。很酷吧?

Math.min 和 Math.max

在 JavaScript 中,要从每个参数中获取最小数量,请使用Math.min(). 要获得最大数量,请使用Math.max(). 看下面的例子:

const min = Math.min(1,0,4,2,-1,-3);
console.log(min); // -3

const max = Math.max(1,0,4,2,-1,-3);
console.log(max); // 4

问题是,两者Math.min()Math.max()不能接受 Array 参数。两个函数都会返回NaN。因此,我们使用扩展运算符来解决问题,如下例所示:

const list = [1,0,4,2,-1,-3];

console.log(Math.min(list)); // NaN
console.log(Math.max(list)); // NaN
console.log(Math.min(...list)); // -3
console.log(Math.max(...list)); // 4

传递参数

您只需阅读与扩展运算符一起使用的Math.min()and函数。Math.max()您是否想知道如何创建一个可以接受多个参数的函数?

这很简单:在声明函数时将展开运算符放在用作参数的变量前面。然后,您可以在调用该函数时添加任意数量的参数(但请确保您已经处理过它)。请参阅下面的此代码段作为示例:

const dynamicFunc = (arg1, ...args) => {
   console.log("arg1: " + arg1); 
   console.log("args: " + args);
};

dynamicFunc(1,2,3,4,5); 
// arg1: 1 
// args: [2,3,4,5]

args将被解析为参数数组。它可以支持很多。

将字符串转换为字符列表

您可以使用展开运算符非常轻松地将字符串转换为字符列表。可以这样做是因为字符串也是可迭代的。请参见下面的示例:

const word = "Coding";
const arrOfChar = [...word];
console.log(arrOfChar); // ["C", "o", "d", "i", "n", "g"]

删除重复项

结合本Set机对象,扩展运算符可用于删除数组中存在的任何重复项。只需创建一个新数组,其中包含一个新数组的扩展运算符,Set该数组具有重复项。或者,请参阅下面的示例以获得更清晰的信息:

const arr = [1,2,3,3,5,8,8,true,true,"books","books","books",null,2];

const unique = [...new Set(arr)];

console.log(unique);
// [1, 2, 3, 5, 8, true, "books", null]

初始化一个新数组,该新数组将...new Set(arr)具有唯一值。

rest运算符

运算符的最后一个技巧...是使用 rest 运算符。正如其名称所预期的那样,它使您能够将解构数组中的剩余(其余)值作为较小的数组。请参见下面的示例:

const [ first, ...rest ] = ['a','b','c'];
console.log(first, rest);
// 'a' [ 'b', 'c' ]

因此,在定义first为 be之后,前面'a'的运算符的存在确保了其余的值将属于一个数组。应该没有运算符,它将作为一个值。...restrest...'b'

结论

扩展运算符是一个非常有用的功能,主要用于数组和对象。因为,这个操作符让一些合并等情况变得非常简单。最后,我们只需使用扩展运算符就可以节省编写合并函数的时间。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: JavaScript权威指南(第7版)是一本经典的JavaScript编程指南,是学习JavaScript的绝佳教材。这本书是由David Flanagan所著,内容详细、全面而且权威。它包含了所有JavaScript的核心语法和特性,以及许多实用的编程技巧和最佳实践。 在这本书中,读者可以学习到JavaScript的基础知识,如变量、数据类型、运算符等。同时,它还介绍了JavaScript的控制流程、函数、对象和数组等复杂的概念。此外,书中还详细讲解了DOM操作、事件处理、Ajax和JSON等与Web开发密切相关的主题。 这本书的第7版特别注重介绍了新的JavaScript语言特性,如箭头函数、解构赋、Promise等。它还介绍了ES6、ES7和ES8的一些新特性,例如模块化、类和模板字面量等。这些新的语言特性使得JavaScript编程更加简洁和高效。 希望读者能够在学习这本书的过程中,掌握并理解JavaScript的核心概念和语法,从而能够灵活运用JavaScript进行开发。无论是初学者还是有经验的开发者,这本书都能帮助读者提升自己的JavaScript编程能力,并且成为一名优秀的JavaScript开发者。 最后,这本书的文件格式是PDF,便于读者在电子设备上方便地阅读和查找需要的内容。 ### 回答2: JavaScript权威指南(第7版)是一本关于JavaScript编程语言的权威参考手册,它包含了JavaScript的全部核心知识和语法规范。该书由Flanagan编写,是学习和掌握JavaScript的必备工具。 其中的"filetype pdf"表示希望获取的是PDF格式的书籍文件类型。JavaScript权威指南(第7版)提供了多种电子书格式供用户选择,包括PDF格式。以PDF格式打开,可以方便地在不同设备上阅读、检索和参考。 该书的内容非常全面,从语言基础、数据类型、操作符、函数、对象、数组、模块化编程、异步编程等各个方面进行了深入介绍和讲解。无论是初学者还是有一定经验的开发者,都可以通过该书系统地学习和理解JavaScript编程语言。 除了介绍语言特性和语法规范外,该书还涵盖了一些常用的编程技巧和最佳实践,帮助读者编写高质量、可维护和可扩展JavaScript代码。 JavaScript权威指南(第7版)是一本由业界知名的作者编写的经典著作,并经过多次修订和更新,适用于目前流行的JavaScript环境和最新的语言标准。无论是作为学习参考书,还是作为日常开发过程中的查阅手册,该书都是程序员必备的工具之一。 ### 回答3: 《JavaScript权威指南》(第7版)是一本广泛应用的JavaScript编程指南,覆盖了JavaScript的方方面面。这本书被广泛认可为学习JavaScript语言和理解其工作原理的权威资料。 作为一本权威指南,该书由Douglas Crockford所著,他是JavaScript语言的专家之一,对于语言的设计和开发具有深入的理解。他将他的知识和经验整理成这本详实的教材,包含了对语法、对象、函数、DOM操作、浏览器兼容性、调试技巧等内容的详尽解释。 该书以深入浅出的方式讲解了JavaScript的核心概念和技术。它从基本的语法和数据类型开始,逐渐深入介绍了函数、对象、原型、闭包、模块化等高级概念。通过讲解这些关键概念,读者能够理解JavaScript的工作原理,并且能够编写高效、可靠的JavaScript代码。 除了对基本概念的解释,该书还包含了大量的示例代码和实践案例。这些示例代码覆盖了各种实际问题和解决方案,帮助读者理解如何应用JavaScript进行实际开发。此外,书中还介绍了一些最佳实践和常见的陷阱,以帮助读者避免常见的错误和优化性能。 《JavaScript权威指南》(第7版)的PDF格式使其易于访问和分享。读者可以通过电子设备随时随地阅读,并通过电子搜索功能快速找到需要的内容。这种便利性使得该书成为学习JavaScript和进行日常开发的理想资源。 总之,《JavaScript权威指南》(第7版)是一本深入浅出、全面而权威的JavaScript编程指南。它适合初学者和有一定经验的开发者阅读,帮助他们掌握JavaScript的核心概念和技术,提高开发效率和代码质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Meta.Qing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值