背景
在学习js的时候,总有各种“拷贝”的问题存在,之前一直也搞不清楚(虽然现在有不怎么清楚2333),在学习和实践的过程中,突然想到一个问题:如何拷贝一个函数?
然后心中略微一懵,啥?这是个啥?然后网上一搜,大家也都表示这个问题很奇葩,主要的观点为:js中,函数是‘一等公民’,不属于任何谁谁谁,因此不论是在哪里,都可以直接调用函数,因此js根本不需要所谓的‘拷贝’,直接调用就行了。
后来想了一下,确实,函数本身就是一个单独的内存块,它不属于任何对象或函数或xxx,function本身有call、bind这些函数用来绑定this值,实际上他就是一个第三方独立的工具一般存在。
再往深的想一想
但如果说,我们就是想拷贝一个函数呐(虽然很难想到应用场景)?那么这个问题也是可以有分析的思路的。
-
什么是拷贝?
拷贝,是复制的意思,也就是单独请求一个内存块来存储特定的信息,且这部分信息是与原来的部分独立开的。 -
js中的拷贝
js 中的基础类型的值,是值类型的,例如 number、string、null、undefined、boolean。这些类型的特点就是,‘是什么,就是什么,改变了,内存中的值也就发生了改变’。
而 js 中的对象和函数都是‘引用类型’,当我们直接使用赋值运算给一个变量赋值时,其实只是把对象的地址指针给了该变量,举个例子:let func = function () { console.log('this is from func') } let varFunc1 = func let varFunc2 = func varFunc1 = function () { console.log('this is from varFunc1') } varFunc1() // => this is from varFunc1 varFunc2() // => this is from func
这个例子中,varFunc1和varFunc2的值其实都是一个指向 func 这个函数内存地址的一个指针(姑且先这么理解吧)。如果我们重新对 varFunc1 赋值,发生的事情仅仅是改变了 varFunc1 这个变量的指针而已。而实际 函数本身 ,一直在内存中的某个位置待着,等着其他地方调用。
-
要怎么拷贝?
拷贝的意义就是形成两个‘完全一样’ 却又 ‘完全不相关’的东西,因此,拷贝的过程也可以从这里下手。- 对于一个json对象的拷贝
json对象也就意味着每一层对象中,仅存在:基本类型、对象、数组 这三种,那么最简单的方式就是使用JSON对象提供的两个方法:JSON.stringify() 、JSON.parse()
举个例子:
let target = { a: 123, b: { b1: 234, b2: [1, 3, 5]}, c: true } let copy = JSON.
- 对于一个json对象的拷贝