… 作用
扩展运算符(spread)是三个点(…),用于取出参数对象中的所有可遍历属性,浅拷贝到当前对象之中。
常见用法
1.浅拷贝数组
const a1 = ['test1', 'test2'];
const a2 = [...a1];
a2[0] = 'test2';
a2 // ['test2', 'test2']
2.合并数据
const arr1 = ['a', 'b'];
const arr2 = ['c'];
const arr3 = ['d', 'e'];
// ES5 的合并数组
arr1.concat(arr2, arr3);
// [ 'a', 'b', 'c', 'd', 'e' ]
// ES6 的合并数组
[...arr1, ...arr2, ...arr3]
// [ 'a', 'b', 'c', 'd', 'e' ]
3. 解构赋值
const [first, ...rest] = [1, 2, 3, 4, 5];
first // 1
rest // [2, 3, 4, 5]
const [first, ...rest] = [];
first // undefined
rest // []
const [first, ...rest] = ["foo"];
first // "foo"
rest // []
4.字符串/类数组转为真正的数组
因为任何定义了遍历器(Iterator)接口的对象,都可以用扩展运算符转为真正的数组。
[...'test'] // [ "t", "e", "s", "t"] [...document.querySelectorAll('div')] // [
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net,,]基本实现原理
如果不用 …,如何实现一样的功能?由上面的用法,可以知道。扩展运算符主要就是浅拷贝可遍历对象属性,那么我们可以用es5的写法实现如下:
// 简单版实现 function _spread() { for (var ar = [], i = 0; i arguments.length; i++){ ar = ar.concat(arguments[i]); } return ar; };
用上面的例子测试一下,结果如下:
const a1 = ['test1', 'test2']; const a2 = _spread(a1); a2[0] = 'test2'; a2 // ['test2', 'test2']
可以看出上面的例子,没有考虑到属性的可遍历性判断,那么需要进一步优化。
严谨实现
这里分几种情况来考虑就好:
- 判断是否为数组,数组一定可迭代,则直接复制数组后返回结果即可。
- 判断是否为实现了遍历器(Iterator)接口的对象,若实现了则转为数组。
- 如果没有实现遍历器(Iterator)接口的对象,则判断是否为普通字符串/Map/Set等。
- 均不满足以上条件的话,则抛错。
所以,最后实现为:function _toConsumableArray(arr) { return ( _arrayWithoutHoles(arr) || // 判断是否为数组 _iterableToArray(arr) || // 判断是否为实现了遍历器(Iterator)接口的对象 _unsupportedIterableToArray(arr) || // 判断是否为普调字符串/Map/Set等 _nonIterableSpread() // 则抛错 ); } function _nonIterableSpread() { throw new TypeError( "Invalid attempt to spread non-iterable instance.nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method." ); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _iterableToArray(iter) { if ( (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null) || iter["@@iterator"] != null ) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i len; i++) { arr2[i] = arr[i]; } return arr2; }
$(function() {
setTimeout(function () {
var mathcodeList = document.querySelectorAll('.htmledit_views img.mathcode');
if (mathcodeList.length > 0) {
for (let i = 0; i < mathcodeList.length; i++) {
if (mathcodeList[i].naturalWidth === 0 || mathcodeList[i].naturalHeight === 0) {
var alt = mathcodeList[i].alt;
alt = '(' + alt + ')';
var curSpan = $('');
curSpan.text(alt);
$(mathcodeList[i]).before(curSpan);
$(mathcodeList[i]).remove();
}
}
MathJax.Hub.Queue(["Typeset",MathJax.Hub]);
}
}, 1000)
});
优惠劵
徐_三岁
关注
关注
1
点赞
踩
1
收藏
觉得还不错?
一键收藏
0
评论JavaScript详解(第2版)04-255.1 JavaScript运算符和表达式 5.1.1 赋值运算符 5.1.2 优先级和结合性 5.2 运算符类型 5.2.1 算术运算符 5.2.2 快捷赋值运算符 5.2.3 递增运算符和递减运算符 5.2.4 拼接...ES6 扩展运算符 ...【详解】(含使用场景、实战技巧和范例、实现原理、错误用法)朝阳39的博客11-14
535
含使用场景、实战技巧和范例、实现原理、错误用法参与评论
您还未登录,请先
登录
后发表或查看评论ES6 - 扩展运算符与Object.assign对象拷贝与合并世界和我们都不该止步于此08-11
1772
对于深浅拷贝,大家第一印象就是深拷贝递归,浅拷贝循环// 深拷贝 let obj2 = obj;// 修改obj2 obj2 . a = 100;不难看出我只是修改了拷贝出来的对象,结果原对象的属性也被我修改了,我们不想这样。ES6 扩展运算符(...)、[]用法&以及Vuex辅助函数原理,以mapState为例qq_36615115的博客07-18
551
ES6 扩展运算符(…)、[]用法&以及Vuex辅助函数原理
1、…
通俗来说一般用于将对象展开示例代码:
let obj = {
name:'ivan',
age:21
}let obj2 = {
...obj
}console.log(obj2)
此时输出的obj2包含obj的属性name,age
用法:不定参数,es6不再使用arguments对象
示例代码:
var demo = function (...arg){
for (let
Javascript 中的 ...(展开运算符)人间草木11-11
6205
曾几何时,ES6/ES2015 对 Javascript 语言进行了重大升级。它引入了许多不同的新功能。其中之一就是我们可以用在任何兼容容器(对象、数组、字符串、集合、映射)前面的三个连续点。这些小点使我们能够编写更加优雅和简洁的代码。在本文中我将会解释这三个点的工作原理,并展示最常见的例子。三个连续的点具有两个含义:展开运算符(spread operator)和剩余运算符(rest oper...
javascript入门笔记05-15使用 短路&&,扩展赋值运算符,位运算 4、条件运算符(三目运算) 单目(一元)运算符 :++,--,! 双目(二元)运算符 :+,-,*,/,%,>,运算符 :?: 1、语法 条件?表达式1:表达式2; 条件...深入云计算 MongoDB管理与开发实战详解pdf.part105-204.2.10 Javascript 查询和$where 查询 4.2.11 count查询记录条数 4.2.12 limit限制返回记录数 4.2.13 skip 限制返回记录的起点 4.2.14 sort 排序 4.2.15 分页查询 4.2.16 随机抽取文档 4.3 ...深入云计算 MongoDB管理与开发实战详解pdf.part205-204.2.10 Javascript 查询和$where 查询 4.2.11 count查询记录条数 4.2.12 limit限制返回记录数 4.2.13 skip 限制返回记录的起点 4.2.14 sort 排序 4.2.15 分页查询 4.2.16 随机抽取文档 4.3 ...整理后java开发全套达内学习笔记(含练习)06-06instanceof (关键字) 运算符,用于引用变量,以检查这个对象是否是某种类型。返回 boolean 值。 interface (关键字) 接口 ['intfeis] invoke vt.调用 [in'vuk]' ( invocation [,invu'kein]) Iterator ...js禁用所有的inputRockandrollman的博客04-11
264
要在JavaScript中禁用所有的input元素,您可以使用document.querySelectorAll方法来选择所有的input元素,然后使用一个循环来为它们设置disabled属性。这段代码将会禁用页面上所有的input元素。基于Springboot+Vue的Java项目-旅游网站系统(附演示视频+源码+LW)2301_77929200的博客04-11
903
网上旅游网站网络互动实现了个人中心、用户管理、路线分类管理、旅游路线管理、最新路线管理、系统管理、订单管理管理等信息处理和传递、资源信息交流的共享和下载,使得旅游网站效率得到了极大的提高。js的filter函数最新发布xiaohua0708day的博客04-14
57
这个函数接收数组中的每个元素作为参数,并检查该元素是否是偶数。如果是偶数,函数返回。是一个数组方法,它创建一个新数组,其包含通过提供的函数实现的测试的所有元素。函数遍历数组中的每个元素,并只将那些使测试函数返回。在这个箭头函数版本中,我们直接返回了表达式。在上面的代码中,我们传递了一个匿名函数给。方法就会将该元素包含在新数组中。,则该元素会被包含在新数组中。在JavaScript中,的元素包含在新数组中。【300套】基于Springboot+Vue的Java实战开发项目(附源码+演示视频+LW)2301_77929200的博客04-12
1289
今天给大家分享300+的Java毕业设计,基于Springboot+vue框架,这些项目都经过精心挑选,涵盖了不同的实战主题和用例,可做毕业设计和课程设计参考。✍️除了源码,对于大部分项目实现的功能都有相应的介绍,并且配有演示视频,方便大家根据自己的需要择优下载学习。另外如有定制需求或者想要相对应的论文参考,文末可以十我VX联系。后续还会持续更新,欢迎关注!Vue3 + Vite 构建组件库发布到 npm白雾茫茫丶04-09
1673
这篇文章介绍了如何使用Vite构建组件库,并将其发布到npm上。文章包括搭建项目、调整目录结构、组件开发、整合并导出组件、编写package.json文件、vite打包配置、本地模拟、发布到npm、安装验证等步骤。文章还提供了一个基于Vue3+Element-plus封装的Table组件的示例,演示了如何运行和使用发布的组件。electron打包后的调试方式大青虫的博客04-10
465
【代码】electron打包后的调试方式。vue2-vue3面试qq_45889379的博客04-09
680
在 watchEffect 回调函数内,我用 setTimeout 的形式去模拟响应时间为 3 秒的异步请求,上面代码可以理解为 3 秒之内如果你不去改变 search 变量,那么页面就成功返回接口数据,如果在 3 秒之内你再次点击按钮改变了 search 变量,onInvalidate 将会被触发,从而清理掉上一次的接口请求,然后根据新的 search 变量去执行新的请求。我个人是这么记住 Tree-shaking 的,翻译成中文就是 摇树,树上有枯叶和绿叶,我摇动树干,枯叶掉了,新叶留着。TypeScript尚硅谷学习qq_64662981的博客04-08
767
TypeScript是JavaScript的超集。它对JS进行了扩展,向JS中引入了类型的概念,并添加了许多新的特性。TS代码需要通过编译器编译为JS,然后再交由JS解析器执行。TS完全兼容JS,换言之,任何的JS代码都可以直接当成JS使用。相较于JS而言,TS拥有了静态类型,更加严格的语法,更强大的功能;TS可以在代码执行前就完成代码的检查,减小了运行时异常的出现的几率;TS代码可以编译为任意版本的JS代码,可有效解决不同JS运行环境的兼容问题;echarts tooltip提示框显示不全weixin_45024453的博客04-11
476
一个可由多个柱形图叠加而成的图表,命名为someHoverLine(可自定义)。
下面罗列了移动端和web端的封装组件代码;
展示了vue2、uniapp、vue3的不同封装和使用案列。vue 三目运算符.07-28Vue中的三目运算符与普通的 JavaScript 三目运算符相同,可以用于条件判断和返回不同的值。在Vue模板中,可以使用v-bind指令配合三目运算符来动态绑定属性或样式。下面是一个示例:```html
```在上述示例中,isActive和isDisabled是Vue实例中的data属性,可以根据这些属性的值来决定绑定的class或disabled属性的值。如果isActive为true,则该div元素会有'active'类,否则为'inactive'类;如果isDisabled为true,则按钮会被禁用。
需要注意的是,在Vue模板中使用三目运算符时,只能在表达式中使用,不能用于控制流程或赋值等其他情况。
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助提交
window.csdn.csdnFooter.options = {
el: '.blog-footer-bottom',
type: 2
}
- 121
- 原创
- 3万+
- 周排名
- 1万+
- 总排名
- 13万+
- 访问
- 等级
- 1393
- 积分
- 2288
- 粉丝
- 158
- 获赞
- 22
- 评论
- 319
- 收藏
私信关注
热门文章
windows远程桌面连接一直显示“请稍候”解决办法
12315elementui实现表格(el-table)默认选中
9943vue3组件之间双向绑定
5874什么是单点登录,如何实现单点登录
5720uView的select列选择器
5629分类专栏
vue
29篇
js
21篇
typescript
3篇
css
6篇
微信小程序
4篇
html
3篇
git
2篇
移动端
5篇
浏览器
2篇
最新评论
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐提交
最新文章
- 纯 CSS 实现多标签自动显示超出数量
- svg实现环形进度条
- 实现文本溢出提示效果
2024年14篇2023年37篇2022年48篇2021年22篇目录
$("a.flexible-btn").click(function(){
$(this).parents('div.aside-box').removeClass('flexible-box');
$(this).parents("p.text-center").remove();
})
一、背景 最近在进行某中台的接口测试准备,发现接口数量非常多,有6、70个,而且每个接口都有大量的参数并且需要进行各种参数验证来测试接口是否能够正确返回响应值。想了几种方案后,决定尝试使用JMeter的csv读取来实现批量的接口测试。 二、脚本编写 1、添加线…
服务器托管 地球探险家:
下载暂停,下不下来
不肥宅也不快乐-:
用了这个方法,还是不行
ywr121:
谢谢,已解决
糖丸桃桃包:
用了这个方法,还是不行
Tananxq:
用了这个方法,还是不行