我是靠谱客的博主 冷傲夏天,最近开发中收集的这篇文章主要介绍JS 数据基本类型和引用类型的区别,检测及对象的拷贝,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一,数据的基础类型主要有: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;  
        };

 方法二;

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;
}

最后

以上就是冷傲夏天为你收集整理的JS 数据基本类型和引用类型的区别,检测及对象的拷贝的全部内容,希望文章能够帮你解决JS 数据基本类型和引用类型的区别,检测及对象的拷贝所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部