您的位置:首页 > Web前端 > JavaScript

JS 数据基本类型和引用类型的区别,检测及对象的拷贝

2019-03-17 00:37 363 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_40537245/article/details/88608835

一,数据的基础类型主要有:number,string,boolean,null,undefined,symbol(es6);

       引用类型有:object,function,array,regexp,date(除了基本类型外的都可称之为对象);

二,基本类型和引用类型的区别:

     1,申明变量时内存分配不同

           基本类型存在栈中,占据空间是固定的,占用内存较小,便于查找;

            引用类型存在于堆中,大小是不固定的

      2,访问机制不同

           基本类型是可以直接访问的,而引用类型是通过访问地址,再得到值

      3,复制时不同

           原始类型的值: 修改新变量,不影响原变量

           原因: 复制的是值本身

           引用类型的对象: 通过新变量修改对象,等效于直接修改原对象。新旧变量都受影响。

           原因: 仅复制的是地址值,原对象始终只有一个

          新旧变量使用相同的地址值,引用同一个对象

          任何一方修改对象,另一方都同时受影响。

      4,参数的传递不同

          基本类型只是把值传递给参数,之后参数与变量互不影响

          引用值对象的值是堆内存地址,因此函数内部参数的修改会体现在外部

三,数据类型的检测

       typeof()返回类型

      检测基本类型除了null(返回的是object,null在js中叫做空对象指针),可检测function,对象都返回object;

      instanceof  返回布尔值,只能检测引用类型 ,原型链上出现构造函数都会返回true

      constructor  有继承时不准

      通用的Object.prototype.toString.call();

四,对象的拷贝

     对象之间的=复制会改变原对象

    浅拷贝:var a={};var b=Object.assign({},a); 此方法当对象里面的值不是字符串而是对象时无用;

    对一般的json对象时可:JSON.parse(JSON.stringify(boj))对日期和继承的值没用,当值为

undefined
、 
function
、 
symbol
 会在转换过程中被忽略

    深拷贝;

      var clone = function (obj) { 
              if(obj === null) return null 
              if(typeof obj !== 'object') return obj;
              if(obj.constructor===Date) return new Date(obj); 
              if(obj.constructor === RegExp) return new RegExp(obj);
              var newObj = new obj.constructor ();  //保持继承链
              for (var key in obj) {
                  if (obj.hasOwnProperty(key)) {   //不遍历其原型链上的属性
                      var val = obj[key];
                      newObj[key] = typeof val === 'object' ? arguments.callee(val) : val; // 使用arguments.callee解除与函数名的耦合
                  }
              }  
            return newObj;  
        };

 方法二;

[code]function deepCopy(obj) {
var result = Array.isArray(obj) ? [] : {};
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
if (typeof obj[key] === 'object') {
result[key] = deepCopy(obj[key]);   //递归复制
} else {
result[key] = obj[key];
}
}
}
return result;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: