js堆栈以及数据类型

2019-04-25  本文已影响0人  _theFeng

基本数据类型

var str = "abc";
    str[1]='f'
    console.log(str);   // abc
var str = "abc";
    str = 'f'
    console.log(str);  // f
var a = 10;
var b = a;
a ++ ;
console.log(a); // 11
console.log(b); // 10
   var a = 1;
   var b = 1;
   console.log(a === b);//true

引用类型(对象,数组,函数,等)

    var a = [1,2,3];
    a[1] = 5;
    console.log(a[1]); // 5

-引用类型的比较是引用的比较(堆的空间)

    var a = [1,2,3];
    var b = [1,2,3];
    console.log(a === b); // false
var a = {}; // a保存了一个空对象的实例
var b = a;  // a和b都指向了这个空对象

a.name = 'jozo';
console.log(a.name); // 'jozo'
console.log(b.name); // 'jozo'

b.age = 22;
console.log(b.age);// 22
console.log(a.age);// 22

console.log(a == b);// true

'='是引用和浅拷贝的区别

    var obj1 = {
        'name' : 'zhangsan',
        'age' :  '18',
        'language' : [1,[2,3],[4,5]],
    };

    var obj2 = obj1;


    var obj3 = shallowCopy(obj1);
    function shallowCopy(src) {
        var dst = {};
        for (var prop in src) {
            if (src.hasOwnProperty(prop)) {
                dst[prop] = src[prop];
            }
        }
        return dst;
    }

    obj2.name = "lisi";
    obj3.age = "20";

    obj2.language[1] = ["二","三"];
    obj3.language[2] = ["四","五"];

    console.log(obj1);  
    //obj1 = {
    //    'name' : 'lisi',
    //    'age' :  '18',
    //    'language' : [1,["二","三"],["四","五"]],
    //};

    console.log(obj2);
    //obj2 = {
    //    'name' : 'lisi',
    //    'age' :  '18',
    //    'language' : [1,["二","三"],["四","五"]],
    //};

    console.log(obj3);
    //obj3 = {
    //    'name' : 'zhangsan',
    //    'age' :  '20',
    //    'language' : [1,["二","三"],["四","五"]],
    //};
  1. JSON.parse(JSON.stringify()) new Date()将变成字符串,正则将变成空对象

const obj = {
    arr: [111, 222],
    obj: {key: '对象'},
    a: () => {console.log('函数')},
    date: new Date(),
    reg: /正则/ig
}
image.png
  1. for in 和递归的方法 无法拷贝函数,date,reg类型的对象;

function isObj(obj) {
    return (typeof obj === 'object' || typeof obj === 'function') && obj !== null
}
function deepCopy(obj) {
    let tempObj = Array.isArray(obj) ? [] : {}
    for(let key in obj) {
        tempObj[key] = isObj(obj[key]) ? deepCopy(obj[key]) : obj[key]
    }
    return tempObj
}

未完待续 深拷贝的方法和坑

上一篇 下一篇

猜你喜欢

热点阅读