console.1og(0 == -0); // true
console.1og(NaN == NaN); // false
console.1og(0bject.is(0,-0));// false
console.1og(0bject.is(NaN, NaN)); //true
let obj = {};
let obj1 = { username:'anverson ',age: 42};
let obj2 = {sex: '男'};
Object.assign(obj, obj1, obj2);
console.log(obj):
let obj3 = {};
let obj4 = {money: 5000000};
obj3.__proto__ = obj4;
console.log(obj3)
console.log(obj3.money);
拷贝后会生成一份新的数据,修改拷贝以后的数据不会影响原数据
拷贝后不会生成新的数据。而是拷贝的引用。修改拷贝以后的数据会影响原来的数据
JSON.stringify():js 数组或对象转换为 JSON 字符串
JSON.parse(): JSON 字符串转换为 js 数组或对象
拷贝的数据里不能有对象/ 数组,即使有对象/数组可以继续遍历对象、数组拿到里边每一项值,一直到拿到是基本数据类型,然后再去复制,或是深度拷贝
1.如何判断数据类型:
typeof 返回德数据类型:String,Number,Boolean,Undefined, Object,Function
2.Object.prototype.toString.call(obj) :取到原始的 toString(),通过 call 指定我们的目标数据,就能检测出我们的目标数据类型
for in 循环 对象(属性名) 数组(下标)
let obj = {username: 'abc', age: 39};
for (let i in obj){
console.log(i);
} // username, age
let arr = [1,2,'abc'];
for (let i in arr){
console.log(i)
}// 0,1,2
定义检测数据类型的功能函数
function checkedType(target) {
return Object.prototype.toString.call(target).slice(8,-1)
//Object.prototype.toString.call("idjgidji")
//"[object String]"
}
//实现深度克隆---> 对象/数组
function clone(target) {
//判断拷贝的数据类型
//初始化变量result成为最终克隆的数据
let result, targetType = checkedType(target);
if (targetType === 'Object'){
result = {};
}else if (targetType === 'Array'){
result = [];
}else {
return target;
}
// 遍历目标数据
for (let i in target){
let value = target[i];
// 判断目标结构里的每一项是否存在对象/数组
if (checkedType(value) === 'Object' || checkedType(value) === 'Array'){
// 持续遍历获取到的value值
result[i] = clone(value);
} else {//获取到的value 值是基本的数据类型或者是两数。
result[i] = value;
}
}
return result;
}
方法二:双越发
// 双越老师
function deepClone(obj = {}){
if(typeof obj !== 'object' || obj == null){
// obj是 null, 或者 obj不是数组或对象,直接返回
return obj
}
// 初始化结果
let result
if(obj instanceof Array){
result = []
} else{
result = {}
}
for(let key in obj){
// 保证key不是原型的属性
if(obj.hasOwnProperty(key)){
// 递归调用!!
result[key] = deepClone(obj[key])
}
}
return result
}