概述
一,数据的基础类型主要有: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 数据基本类型和引用类型的区别,检测及对象的拷贝所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复