首页 > 其他分享 >JS中的扩展运算符(...)和剩余运算符(...)

JS中的扩展运算符(...)和剩余运算符(...)

时间:2024-01-24 18:13:24浏览次数:29  
标签:... console log 扩展 JS 运算符 数组

一、概念

在JS中,扩展运算符(spread)是三个点 (...) ,剩余运算符(rest)也是三个点 (...)

二、扩展运算符

(1)基本使用:扩展运算符的主要作用是将一个数组转为用逗号分隔的参数序列,它好比 rest 的逆运算

//传递数据代替多个字符串的形式
function  test(a,b,c){
  console.log(a); // 1
  console.log(b); // 2
  console.log(c); // 3
}

var arr = [1, 2, 3];
test(...arr);

//将一个数组插入到另一个数组中
var arr1 = [1,2,3];
var arr2 = [...arr1, 4, 5, 6];
console.log(arr2); // [1, 2, 3, 4, 5, 6]

//字符串转数组
var str = 'hello';
var arr3 = [...str];
console.log(arr3); // ["h", "e", "l", "l", "o"]

(2)扩展运算符(…)会调用默认的 Iterator 接口。

// 例一
var str = 'hello';
[...str] //  ['h','e','l','l','o']

// 例二
let arr = ['b', 'c'];
['a', ...arr, 'd']
// ['a', 'b', 'c', 'd']

上面代码的扩展运算符内部就调用 Iterator 接口。

实际上,这提供了一种简便机制,可以将任何部署了 Iterator 接口的数据结构,转为数组。也就是说,只要某个数据结构部署了 Iterator 接口,就可以对它使用扩展运算符,将其转为数组。

let arr = [...iterable];

有关对 Iterator 的介绍,请查看这篇文章 ES6中的Iterator(遍历器)和 for of 循环

(3)由于扩展运算符可以展开数组,所以可以用来替代函数的 apply 方法

// ES5 的写法
function f(x, y, z) {
  // ...
}
var args = [0, 1, 2];
f.apply(null, args);

// ES6 的写法
function f(x, y, z) {
  // ...
}
let args = [0, 1, 2];
f(...args);

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

// ES5 的写法
Math.max.apply(null, [14, 3, 77])

// ES6 的写法
Math.max(...[14, 3, 77])

// 等同于
Math.max(14, 3, 77);

三、剩余运算符

把用逗号隔开的值序列组合成一个数组

//当函数参数个数不确定时,用 rest运算符
function f1(...args) {
  console.log(args); // [1,2,3]
}

f1(1,2,3);

//当函数参数个数不确定时的第二种情况
function f2(item, ...arr) {
  console.log(item); // 1
  console.log(arr);  // [2,3]
}
f2(1, 2, 3);

//rest运算符配合 解构使用
let [a,...temp]=[1, 2, 4];
console.log(a);    // 1
console.log(temp); // [2,4]

四、总结

扩展运算符(spread)用三个点号表示,功能是把数组或类数组对象展开成一系列用逗号隔开的值。

剩余运算符(rest)也是三个点号,不过其功能与扩展运算符恰好相反,把逗号隔开的值序列组合成一个数组。

当三个点(…)在等号左边,或者放在形参上,为 rest 运算符

当三个在等号右边,或者放在实参上,是 spread运算符

或者说:放在被赋值一方是rest 运算符。放在赋值一方式 spread运算符。

  转载自:JS中的扩展运算符(...)和剩余运算符(...)_js扩展运算符-CSDN博客

标签:...,console,log,扩展,JS,运算符,数组
From: https://www.cnblogs.com/yitongtianxia666/p/17985448

相关文章

  • JS复制JPG图片到剪切板
    HTML代码:<buttonid="button"type="primary"class="ui-button">复制JPG图片</button><imgid="image"width="150"src="./mybook.jpg">JS代码:constdoCopyImg2Clipboard=async(image,suc......
  • PgSql 行转列的使用 jsonb_each与row_to_json
    PgSql行转列的使用jsonb_each与row_to_json1:正常的几行数据2:转换后3:code(以commodity来分组)select"Id","JabilPn","Brand","PricelnUsd","Commodity"from"Eme_Materials"emwhere"Id"<=3s......
  • idea中启动web、jsp项目
    1.idea打开项目选择要打开的项目的根目录2.项目配置配置jdkmodules配置添加web添加依赖删除爆红的依赖添加依赖目录或者jar配置web.xml配置lib如果没有生成则添加项目所需依赖facets配置和web配置一样配置artifacts3.配置tomcat......
  • js/ts中Date类的ref响应式 -- VUE3
    现象:Date对象无法响应式原因:Date是个深层对象,外面那层可以响应,但是更改里面的层,则不会被侦测到改动解决:强制触发副作用即可参考文档:https://cn.vuejs.org/api/reactivity-advanced.html#triggerref<template><divclass="cnblogs_yucloud">{{DateTime}}</div>......
  • js 旧 IE 中的 innerHTML
    在所有现代浏览器中,通过innerHTML插入的<script>标签是不会执行的。而在IE8及之前的版本中,只要这样插入的<script>元素指定了defer属性,且<script>之前是“受控元素”(scopedelement),那就是可以执行的。<script>元素与<style>或注释一样,都是“非受控元素”(NoScopeelement)......
  • js 自定义数据属性
    HTML5允许给元素指定非标准的属性,但要使用前缀data-以便告诉浏览器,这些属性既不包含与渲染有关的信息,也不包含元素的语义信息。除了前缀,自定义属性对命名是没有限制的,data-后面跟什么都可以。下面是一个例子:<divid="myDiv"data-appId="12345"data-myname="Nicholas"></div>......
  • js 焦点管理
    HTML5增加了辅助DOM焦点管理的功能。首先是document.activeElement,始终包含当前拥有焦点的DOM元素。页面加载时,可以通过用户输入(按Tab键或代码中使用focus()方法)让某个元素自动获得焦点。例如:letbutton=document.getElementById("myButton");button.focus();......
  • js CSS 类扩展
    自HTML4被广泛采用以来,Web开发中一个主要的变化是class属性用得越来越多,其用处是为元素添加样式以及语义信息。自然地,JavaScript与CSS类的交互就增多了,包括动态修改类名,以及根据给定的一个或一组类名查询元素,等等。为了适应开发者和他们对class属性的认可,HTML5增加了......
  • js matches()
    matches()方法(在规范草案中称为matchesSelector())接收一个CSS选择符参数,如果元素匹配则该选择符返回true,否则返回false。例如:if(document.body.matches("body.page1")){//true}使用这个方法可以方便地检测某个元素会不会被querySelector()或querySelectorAll()方......
  • js DOM 扩展
    尽管DOMAPI已经相当不错,但仍然不断有标准或专有的扩展出现,以支持更多功能。2008年以前,大部分浏览器对DOM的扩展是专有的。此后,W3C开始着手将这些已成为事实标准的专有扩展编制成正式规范。本章所有内容已经得到市场占有率名列前茅的所有主流浏览器支持,除非特别说明。Java......