Skip to content

Commit 8035420

Browse files
committed
深浅拷贝
1 parent f366cb7 commit 8035420

File tree

2 files changed

+228
-6
lines changed

2 files changed

+228
-6
lines changed

README.md

Lines changed: 114 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ ES6 出来的 `Symbol` 也是原始数据类型 ,表示独一无二的值
3232
<details><summary><b>答案</b></summary>
3333
<p>
3434

35-
函数声明表达式
36-
35+
函数声明表达式
36+
3737
```javascript
3838
var func = function add(a, b) {
3939
return a + b
@@ -67,7 +67,7 @@ var func = (a, b) => {
6767

6868
---
6969

70-
#### null 和 undefined 的差异?
70+
#### `null``undefined` 的差异?
7171

7272
<details><summary><b>答案</b></summary>
7373
<p>
@@ -89,6 +89,23 @@ var func = (a, b) => {
8989

9090
---
9191

92+
#### `let``const` 的区别?
93+
94+
<details><summary><b>答案</b></summary>
95+
<p>
96+
97+
- `let``const` 都是只在声明所在的块级作用域内有效。
98+
- `let` 声明的变量可以改变,值和类型都可以改变,没有限制。
99+
- `const` 声明的变量不得改变值,这意味着,`const` 一旦声明变量,就必须立即初始化,不能留到以后赋值。
100+
101+
修改 `const` 对象的某个属性会报错吗?
102+
因为对象是引用类型的,`const`仅保证指针不发生改变,修改对象的属性不会改变对象的指针,所以是被允许的。
103+
104+
</p>
105+
</details>
106+
107+
---
108+
92109
#### 箭头函数和普通函数的区别?
93110

94111
<details><summary><b>答案</b></summary>
@@ -106,3 +123,97 @@ var func = (a, b) => {
106123
</details>
107124

108125
---
126+
127+
#### es6 class static 解释?如何继承 static?
128+
129+
<details><summary><b>答案</b></summary>
130+
<p>
131+
132+
类相当于实例的原型,所有在类中定义的方法,都会被实例继承。如果在一个方法前,加上`static`关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”。
133+
134+
- 静态方法调用直接在类上进行,而在类的实例上不可被调用。
135+
- 父类的静态方法,可以被子类继承。
136+
137+
```javascript
138+
class Foo {
139+
static classMethod() {
140+
return 'hello'
141+
}
142+
}
143+
// 静态方法调用直接在类上进行,而在类的实例上不可被调用。
144+
Foo.classMethod() // 'hello'
145+
var foo = new Foo()
146+
foo.classMethod() // TypeError: foo.classMethod is not a function
147+
148+
// 父类的静态方法,可以被子类继承。
149+
class Bar extends Foo {}
150+
Bar.classMethod() // 'hello'
151+
```
152+
153+
</p>
154+
</details>
155+
156+
---
157+
158+
#### 深拷贝和浅拷贝的区别,以及实现?
159+
160+
<details><summary><b>答案</b></summary>
161+
<p>
162+
163+
`浅拷贝`只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。
164+
`深拷贝`会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
165+
166+
**如何实现浅拷贝:**
167+
168+
```javascript
169+
function clone(target) {
170+
let cloneTarget = {};
171+
for (const key in target) {
172+
cloneTarget[key] = target[key];
173+
}
174+
return cloneTarget;
175+
};
176+
```
177+
178+
**如何实现深拷贝:**
179+
180+
如果你的对象**没有**复杂类型的数据如 `Dates`, `functions`, `undefined`, `Infinity`, `RegExps`, `Maps`, `Sets`, `Blobs`等 简单的实现方法:
181+
182+
```javascript
183+
JSON.parse(JSON.stringify())
184+
```
185+
基础款:
186+
187+
```javascript
188+
function cloneObject(obj) {
189+
var clone = {};
190+
for(var i in obj) {
191+
if(typeof(obj[i])=="object" && obj[i] != null)
192+
clone[i] = cloneObject(obj[i]);
193+
else
194+
clone[i] = obj[i];
195+
}
196+
return clone;
197+
}
198+
```
199+
看如何一步一步实现: [如何写出一个惊艳面试官的深拷贝?](https://juejin.im/post/5d6aa4f96fb9a06b112ad5b1)
200+
201+
**ES6 `Object.assign()` 是深拷贝还是浅拷贝?**
202+
203+
`Object.assign`方法实行的是浅拷贝,不是深拷贝。
204+
也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。
205+
注意:object 只有一层的时候,是深拷贝
206+
207+
```javascript
208+
let obj = {
209+
username: 'sunnie',
210+
}
211+
let obj2 = Object.assign({}, obj)
212+
obj2.username = 'change' // `深拷贝`修改新对象不会改到原对象
213+
console.log(obj) // {username: "sunnie"}
214+
```
215+
216+
</p>
217+
</details>
218+
219+
---

docs/javascript/README.md

Lines changed: 114 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ ES6 出来的 `Symbol` 也是原始数据类型 ,表示独一无二的值
3232
<details><summary><b>答案</b></summary>
3333
<p>
3434

35-
函数声明表达式
36-
35+
函数声明表达式
36+
3737
```javascript
3838
var func = function add(a, b) {
3939
return a + b
@@ -67,7 +67,7 @@ var func = (a, b) => {
6767

6868
---
6969

70-
#### null 和 undefined 的差异?
70+
#### `null``undefined` 的差异?
7171

7272
<details><summary><b>答案</b></summary>
7373
<p>
@@ -89,6 +89,23 @@ var func = (a, b) => {
8989

9090
---
9191

92+
#### `let``const` 的区别?
93+
94+
<details><summary><b>答案</b></summary>
95+
<p>
96+
97+
- `let``const` 都是只在声明所在的块级作用域内有效。
98+
- `let` 声明的变量可以改变,值和类型都可以改变,没有限制。
99+
- `const` 声明的变量不得改变值,这意味着,`const` 一旦声明变量,就必须立即初始化,不能留到以后赋值。
100+
101+
修改 `const` 对象的某个属性会报错吗?
102+
因为对象是引用类型的,`const`仅保证指针不发生改变,修改对象的属性不会改变对象的指针,所以是被允许的。
103+
104+
</p>
105+
</details>
106+
107+
---
108+
92109
#### 箭头函数和普通函数的区别?
93110

94111
<details><summary><b>答案</b></summary>
@@ -106,3 +123,97 @@ var func = (a, b) => {
106123
</details>
107124

108125
---
126+
127+
#### es6 class static 解释?如何继承 static?
128+
129+
<details><summary><b>答案</b></summary>
130+
<p>
131+
132+
类相当于实例的原型,所有在类中定义的方法,都会被实例继承。如果在一个方法前,加上`static`关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”。
133+
134+
- 静态方法调用直接在类上进行,而在类的实例上不可被调用。
135+
- 父类的静态方法,可以被子类继承。
136+
137+
```javascript
138+
class Foo {
139+
static classMethod() {
140+
return 'hello'
141+
}
142+
}
143+
// 静态方法调用直接在类上进行,而在类的实例上不可被调用。
144+
Foo.classMethod() // 'hello'
145+
var foo = new Foo()
146+
foo.classMethod() // TypeError: foo.classMethod is not a function
147+
148+
// 父类的静态方法,可以被子类继承。
149+
class Bar extends Foo {}
150+
Bar.classMethod() // 'hello'
151+
```
152+
153+
</p>
154+
</details>
155+
156+
---
157+
158+
#### 深拷贝和浅拷贝的区别,以及实现?
159+
160+
<details><summary><b>答案</b></summary>
161+
<p>
162+
163+
`浅拷贝`只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。
164+
`深拷贝`会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
165+
166+
**如何实现浅拷贝:**
167+
168+
```javascript
169+
function clone(target) {
170+
let cloneTarget = {};
171+
for (const key in target) {
172+
cloneTarget[key] = target[key];
173+
}
174+
return cloneTarget;
175+
};
176+
```
177+
178+
**如何实现深拷贝:**
179+
180+
如果你的对象**没有**复杂类型的数据如 `Dates`, `functions`, `undefined`, `Infinity`, `RegExps`, `Maps`, `Sets`, `Blobs`等 简单的实现方法:
181+
182+
```javascript
183+
JSON.parse(JSON.stringify())
184+
```
185+
基础款:
186+
187+
```javascript
188+
function cloneObject(obj) {
189+
var clone = {};
190+
for(var i in obj) {
191+
if(typeof(obj[i])=="object" && obj[i] != null)
192+
clone[i] = cloneObject(obj[i]);
193+
else
194+
clone[i] = obj[i];
195+
}
196+
return clone;
197+
}
198+
```
199+
看如何一步一步实现: [如何写出一个惊艳面试官的深拷贝?](https://juejin.im/post/5d6aa4f96fb9a06b112ad5b1)
200+
201+
**ES6 `Object.assign()` 是深拷贝还是浅拷贝?**
202+
203+
`Object.assign`方法实行的是浅拷贝,不是深拷贝。
204+
也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。
205+
注意:object 只有一层的时候,是深拷贝
206+
207+
```javascript
208+
let obj = {
209+
username: 'sunnie',
210+
}
211+
let obj2 = Object.assign({}, obj)
212+
obj2.username = 'change' // `深拷贝`修改新对象不会改到原对象
213+
console.log(obj) // {username: "sunnie"}
214+
```
215+
216+
</p>
217+
</details>
218+
219+
---

0 commit comments

Comments
 (0)