JS数据类型判断、深浅克隆

一、数据类型判断

栈:原始数据类型(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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值