一、数据类型判断
栈:原始数据类型(undefined,null,Boolean,Number,String)
堆 :引用数据类型(对象,函数,数组)
两者的区别在于,存储的位置不同.
boolean typeof -> boolean
string typeof -> string
number typeof -> number
特殊值:Infinity正无穷大 / -Infinity负无穷大 / NaN
null typeof -> object null === null
undefined typeof -> undefined undefined === undefined
array typeof -> object
精确判断方法:xx instanceof Array 为true时
object typeof -> object
精确判断方法:xx instanceof Array 为false时
function typeof -> function
判断对象object示例:
var obj = {};
if(typeof obj === 'object' && !(obj instanceof Array)){
console.log("obj 是一个对象");
}
对象object与数组Array的定义及取值
-
对象:无序的键值对的集合
数组:属性名是数字的对象 -
遍历对象: for key in 循环
遍历数组: for…循环 -
对象 取值:obj.key 、 obj[key]
- - - - 赋值:obj.key = value 、 obj[key] = value
obj [key] 和obj.key的区别
- obj.key : 只能获取正常值
- obj[key] :可以获取变量或复杂字符串
var obj = { name: "yokia", age: 11 };
var myname = "name";
console.log(obj[myname]); // yokia
console.log(obj.myname); // undefined
二、对象深浅克隆
对象浅克隆
引用类型值指向同一个堆地址的变量全等,改动一个变量,另一个变量会跟着改动。
方法:
- 直接赋值
- for 创建新变量
- Object.assign(obj1, obj2 …) 对象的合并 将第2个开始的所有对象的属性合并到第一个对象中,返回合并后的对象。如果后面对象中的属性和前面对象的属性重名,值会发生覆盖。
数组浅克隆
两个数组指向同一个堆地址,改动一个,另一个跟着改动。
方法:
- 直接赋值
- for 创建新变量,依次push()
- slice()从头截取
- concat()与空对象连接
var arr1 = [];
for(var i = 0; i < arr.length; i ++){
arr1.push(arr[i]);
}
console.log("for arr", arr1 === arr, arr1); // true
var arr2 = arr.slice(0);
console.log("slice ", arr2 === arr, arr2); // true
var arr3 = [].concat(arr);
console.log("concat ", arr3 === arr, arr3); // true
console.log(arr[3] === arr1[3]); // true
深克隆
- JSON.parse(JSON.stringify(obj)) : 会丢失对象中的function函数
var user = {
name: "libai",
age: 12,
friend: ["汪伦"],
sayName: function(){
console.log(this.name);
}
}
var user2 = JSON.parse(JSON.stringify(user));
console.log("user2", user2);
- 封装深克隆函数,采用递归思想:
// 函数方法的深克隆
function deepclone(obj){
// 排除null
if(obj === null){
return null;
}
// 如果是数组类型,新对象也应该是数组类型
var newObj = obj instanceof Array ? [] : {};
for(var i in obj){
newobj[i] =
typeof obj[i] === "object" ? deepclone(obj[i]) : obj[i];
// obj[i] 是一个引用类型的时候 null array object
// if(typeof obj[i] === "object"){
// newobj[i] = deepclone(obj[i]);
// }else{
// newobj[i] = obj[i];
// }
}
return newObj;
}