了解一下ES6: 函数简述深浅拷贝
标准开头
今天我们来看一下ES6的函数部分知识
函数
函数初始值
有时候,函数的非必填参数,我们可以给予其默认值。保证程序完整不会出错
在早期,我们赋初始值可能是这样做的:
// 早期ES5方法
function ajax(url, method, param) {method = method ? method : 'GET';param = param ? param : {};console.log(url, method, param);
}复制代码
但是这种方法不够整洁和美观。且维护较为麻烦
在ES6中,我们可以直接在参数栏上指定默认值
function ajax(url, method = 'GET', param = {}) {console.log(url, method, param)
}复制代码
这样让方法看起来更加整洁。且保证了程序的正常运行
我们可以用babel编译为ES5代码review一下:
'use strict';function ajax(url) {var method = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'GET';var param = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};console.log(url, method, param);
}ajax('http://www.baidu.com');复制代码
转换为ES5代码后,我们可以看出:其转换方法就是判断参数列表内是否有值且长度是否足够。然后再进行判断
函数剩余操作符
在对于很多重复参数的函数,我们可以用“...”剩余操作符进行省略
例如,我们现在有个方法,要把每个参数进行相加,参数可以随便定义长度。但是长度必须>2
在ES5中,我们可能要重复写好多的参数名。不仅造成浪费,也让程序易读性变差
function sum(param1, param2, param3, param4, param5) {console.log(param1 + param2 + param3 + param4 + param5);
}复制代码
其实我们从param2 - param5可以借助ES6合并为同一个参数。且无需手动扩展
function sum(param1, ...paramN) {let result = param1;paramN.forEach((param) => {result += param});console.log(result);
}复制代码
合并后的参数会输出为一个数组,大家可以按照数组的操作来操作它
函数参数解构
如果我们按照一个对象的方式当作参数传入一个函数,且函数参数也是对象的方式接受。那我们可以完成一次解构
还记得之前解构要怎么做吗?要保证解构双方的类型,数据格式要类似
function f({name, age}) {console.log(name, age);
}f({name: 'janlay', age: 8});复制代码
不难理解
箭头函数
箭头函数应该是ES6函数中最Nice的一个知识了。中文名叫“箭头函数”,英文名叫“Lambda表达式”。
箭头函数是为了在你声明方法时,更加简单便捷。其语法如下:
let sum = (a, b) => {return a + b;};复制代码
箭头左边的是参数列表,右边的就是函数方法体
当你的函数只有一个参数时,你可以更加简化函数方法
let result = num => num * 2;复制代码
但是当你使用箭头函数时,你可就小心咯。我们用箭头函数会涉及到一个叫“作用域”的问题。这个问题通常影响我们的关键字this的值
因为箭头函数内调用this,作用域并不是指向箭头函数本身,而是指向比箭头函数还要大一层的函数。举个栗子
let myInfo = {name: 'janlay',sayHello: () => {console.log(`Hi,My name is ${this.name}`)}
};myInfo.sayHello();复制代码
这时候控制台输出undefined
正如我们所说的,箭头函数内的this会指向它上一层函数中的作用域。但是他并没有上一层函数体。所以我们打印this,也是显示undefined
简述深浅拷贝
先上这样一段代码
let myInfo = {name: 'janlay',age: 17
};
let heInfo = {};
heInfo = myInfo;
heInfo.name = 'Mike';
console.log(myInfo);复制代码
按照一般逻辑,我们复制一份myInfo到heInfo。然后我们修改heInfo内的属性,输出myInfo应该不会变才对
但是我们错了
{ name: 'Mike', age: 17 }复制代码
像这种对象拷贝叫做 “浅拷贝”。意味着只是拷贝了内存地址,但是并没有再内存中复制一份给新变量
像这样的浅拷贝,还有ES6的“Object.assign()”方法。他的作用是传入2个对象进行合并,然后赋值给第三个对象。
有时候我们会用到浅拷贝,但是一般情况下我们要用到深拷贝。也就是我们常说的值传递
深拷贝的方式很多。由于本人学识有限,给大家带来一个容易理解的深拷贝方法
1. JSON.parse()和JSON.stringify方法
这应该算是最简单的深拷贝方法了。其原理就是将源对象转化为一个JSON对象,然后用parse方法再释放为一个对象。经过这么一折腾,内存地址就发生了改变。也就达到了深拷贝的效果
let myInfo = {name: 'janlay',age: 17
};
let heInfo = {};
heInfo = JSON.parse(JSON.stringify(myInfo));
heInfo.name = 'Mike';
console.log(myInfo);复制代码
结果输出为: { name: 'janlay', age: 17 }
2. 使用外置clone方法
其原理也很简单,通过遍历对象,让对象的每个值都挨个复制给新对象,不再进行整体复制。细分到对象的最小单位
function clone(origin) {let newObj = {}; //新对象for (let key in origin) { //循环原始对象if (typeof origin[key] === 'object') { //如果对象内的属性是一个对象newObj[key] = clone(origin[key]) // 用递归方式对对象内的对象进行拆分} else { //否则newObj[key] = origin[key]; //如果是简单的属性,直接复制}}return newObj; //返回拷贝后的新对象
}复制代码
调用 heInfo = clone(myInfo);
结果输出为 { name: 'janlay', age: 17 }
以上两种深拷贝方法都非常简单。像了解更深度的深拷贝,这里推荐一个掘金的另一篇文章
深拷贝的终极探索(90%的人都不知道)
The End
Babel中文网 - ES6在线转换ES5工具
了解一下ES6: 函数简述深浅拷贝相关推荐
- python自定义函数复制字符串_Python学习笔记摘要(一)类型 字符串 函数 列表 深浅拷贝...
python中的对象和类型 在python中,认为系统中的每一个"东西"都是一个对象,在python中,"对象"有着特殊的意义,python中的对象有: 一个标 ...
- JS中深浅拷贝 函数封装代码
一.了解 基本数据类型保存在栈内存中,按值访问,引用数据类型保存在堆内存中,按址访问. 二.浅拷贝 浅拷贝只是复制了指向某个对象的指针,而不是复制对象本身,新旧对象其实是同一内存地址的数据,修改其中一 ...
- Python全栈开发之3、数据类型set补充、深浅拷贝与函数
转载请注明出处http://www.cnblogs.com/Wxtrkbc/p/5466082.html 一.基本数据类型补充 set是一个无序而且不重复的集合,有些类似于数学中的集合,也可以求交集, ...
- JS 中对象的深浅拷贝(ES3、ES5、ES6不同方法底层实现,一文搞清楚深浅拷贝面试常问题)
JS 中对象的深浅拷贝 拷贝我们都知道这个词的意思,我们经常做过复制.粘贴的操作,其中的复制就是拷贝,那么在拷贝的时候,如果我们复制出来的内容和原内容是完全的分开,各自不相影响,那么这就属于深拷贝 ...
- JavaScript学习笔记(四)---闭包、递归、柯里化函数、继承、深浅拷贝、设计模式
JavaScript学习笔记(四)---闭包.递归.柯里化函数.继承.深浅拷贝.设计模式 1. 匿名函数的使用场景 2.自运行 3.闭包 3.1前提: 3.2闭包 4.函数对象的三种定义方式 5.th ...
- python基础(三元运算+深浅拷贝+函数参数)
三元运算 三元运算,又称三目运算,主要作用是减少代码量,是对简单的条件语句的缩写. 1 书写格式: 2 result = 值1 if 条件 else 值2 3 即如果条件成立,则将值1赋给result ...
- 深浅拷贝、函数、内置函数、文件处理、三元运算、递归
深浅拷贝 import copy copy.copy() #浅拷贝 copy.deepcopy() #深拷贝 num = 110 copynum = num #赋值 一.数字和字符串 对于 数字 和 ...
- Python基础(三)深浅拷贝、函数、文件处理、三元运算、递归、冒泡排序
本章内容: 深浅拷贝 函数(全局与局部变量) 内置函数 文件处理 三元运算 lambda 表达式 递归(斐波那契数列) 冒泡排序 深浅拷贝 一.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝 ...
- python copy函数用法_Python深浅拷贝
预备知识一--python的变量及其存储 在详细的了解python中赋值.copy和deepcopy之前,我们还是要花一点时间来了解一下python内存中变量的存储情况. 在高级语言中,变量是对内存及 ...
最新文章
- Codeforces Educational round 58
- ubuntu 在firefox,网页听不了音乐
- python 字符串形式的列表 转 列表
- mysql常见排错_MySQL常规日志排错
- pthread_cleanup_push
- linux indent命令: 调整C原始代码文件的格式
- django登录跳转到另一个页面_[JWT]djangojson web token实现单用户登录
- 程序员的工资普遍在20k以上
- jQuery 中bind(),live(),delegate(),on() 区别
- X5045的C语言源码,X5045看门狗的单片机源程序和Proteus仿真原理图
- [POI2013]MOR-Tales of seafaring
- 【Grasshopper基础1】怎样制作一个Grasshopper电池 / 二次开发基础
- java实现PDF转tif格式并且设置颜色和dpi
- python twisted教程_twisted基础教程.pdf
- 浪潮8465m4安装linux,浪潮NF8465M4安装windows2008R2系统
- 计算机类部分核心期刊投稿经验
- 网桥与交换机的区别,以及和中继器,集线器 之间的联系及各自的功能
- [视频]K8飞刀 一键免杀 IE神洞网马教程
- python课设答辩记录表_09 答辩记录表
- 进阶39 奇妙的数字