面试小题
程序员文章站
2022-06-15 19:10:59
深拷贝浅拷贝深拷贝和浅拷贝是针对复杂数据类型来说的,浅拷贝只拷贝一层,而深拷贝是层层拷贝。深拷贝深拷贝复制变量值,对于非基本类型的变量,则递归至基本类型变量后,再复制。 深拷贝后的对象与原来的对象是完全隔离的,互不影响, 对一个对象的修改并不会影响另一个对象。浅拷贝浅拷贝是会将对象的每个属性进行依次复制,但是当对象的属性值是引用类型时,实质复制的是其引用,当引用指向的值改变时也会跟着变化。可 以 使 用 for in 、 Object.assign 、 扩 展 运 算 符 … 、Arr.....
深拷贝和浅拷贝是针对复杂数据类型来说的,浅拷贝只拷贝一层,而深拷贝是层层拷贝。
- 深拷贝
深拷贝复制变量值,对于非基本类型的变量,则递归至基本类型变量后,再复制。 深拷贝后的对象与原来的对象是完全隔离的,互不影响, 对一个对象的修改并不会影响另一个对象。 - 浅拷贝
浅拷贝是会将对象的每个属性进行依次复制,但是当对象的属性值是引用类型时,实质复制的是其引用,当引用指向的值改变时也会跟着变化。
可 以 使 用 for in 、 Object.assign 、 扩 展 运 算 符 … 、Array.prototype.slice()、Array.prototype.concat() ,递归等递归函数实现深拷贝
代码
var arr = [1, 2, 3, 4, {
name: '张三'
}, 5, 6, {
name: '李四'
}]
function fn(arr) {
var arr2 = []
if(!(arr instanceof Object)) return arr
for (let k in arr) {
if (arr[k] instanceof Array) {
arr2[k] = arr[k]
} else {
arr2[k] = fn(arr[k])
}
}
return arr2
}
let obj = fn(arr)
arr[4].name = '你好'
console.log(arr, obj);
-
原型的概念
JavaScript 的所有对象中都包含了一个 [proto] 内部属性,这个属性所对应的就是自身的原型
JavaScript 的函数对象,除了原型 [proto] 之外,还有 prototype 属性,当函数对象作为构造函数创建实例时,该 prototype 属性值将被作为实例对象的原型 [proto] -
原型链的概念
当一个对象调用自身不存在的属性/方法时,首先会在当前对象中寻找,找不到就到对象中的原型中去寻找,
找到就返回,找不到就去原型中的原型去寻找,层层往上,直到找到方法/属性或undefined为止
这种层层寻找的机制就叫 原型链
- 数据类型
基本数据类型:number string undefined null boolean symbol 存放在栈中
引用数据类型:object array function 存放在堆中 - 判断基本数据类型 (typeof )
Typeof()判断引用数据类型 只能判断出 function
用法:
var a = "1234"
console.log(typeof(a))
- 判断对象和数组 (instanceof)
var arr = [1, 2, 3]
var obj = {
name: "张三"
}
console.log(arr instanceof Object)
- constructor:不能用于undefined 与 null 因为它们没有构造函数
- object.prototype.toString.call():判断一个变量类型的最准确的方式
- 使用jquery中的$.type()方法也可以实现
var arr = [1, 2, 3, 4, {
name: '张三'
}, 5, 6, {
name: '李四'
}]
function fn(arr) {
var arr2 = []
if(!(arr instanceof Object)) return arr
for (let k in arr) {
if (arr[k] instanceof Array) {
arr2[k] = arr[k]
} else {
arr2[k] = fn(arr[k])
}
}
return arr2
}
let obj = fn(arr)
arr[4].name = '你好'
console.log(arr, obj);
本文地址:https://blog.csdn.net/Layhj/article/details/112589019