js 值类型和引用类型

一、基本类型

也称值类型,包括字符串(string)、数字(number)、布尔(boolean)、Null、Undefined、Symbol(ES6新增,类似于string的数据类型,表示独一无二,详情见[MDN-Symbol])六种基本类型。

特点:
1. 指向的内存空间不会变
2. 按值访问,可以操作变量实际值
3. 存放在栈区(栈区指内存里的栈内存),包括变量的标识符和变量的值。
复制的例子:
var a=3;
var b=a;
console.log(a);//3
b=5;
console.log(a);//3
console.log(b);//5

显然,a 不会随b的改变而改变。值类型就像陌生人一样,虽然都是人,但我有我的特色,你有你的爱好,各自都没有影响。

二、引用类型(敲黑板、重点)

数组(array)、对象(object)、函数(function)

PS:其实也可以直接说object一种,毕竟一切皆对象嘛,哈哈

特点:
  1. 在计算机中占用内存可变
  2. 访问是按引用访问。当查询时,我们需要先从栈中读取内存地址,然后再顺藤摸瓜地找到保存在堆内存中的值
  3. 值保存在内存中,而JS是不能直接访问内存的,所以对于引用类型,操作的不是实际的对象而是对象的引用。
复制的例子:
var obj1={
    "name":'jack',
    "lesson":{
        "Chinese":'110',
        "Mathematics":"135"
    }
}
var obj2=obj1.lesson;
obj1.lesson.English="90";
console.log(obj1.lesson.English);//90
console.log(obj2.English);//90

obj2属性和值随着obj1的改变而改变!
调换下顺序,改变obj2属性,不改变obj1,看下结果:

var obj1={
    "name":'jack',
    "lesson":{
        "Chinese":'110',
        "Mathematics":"135"
    }
}
var obj2=obj1.lesson;
obj2.English="90";
console.log(obj2.English);//90
console.log(obj1.lesson.English);//90

obj1属性和值随着obj2的改变而改变!

引用类型的复制实际上是共用一个指针,而这个指针指向存储在堆中的一个对象。两个变量实际上引用的是同一个对象。

这种感觉就像夫妻一样,你影响着我,我影响着你。

所以这种复制也叫浅拷贝啦。什么?什么叫深拷贝?看官先自行思考熟悉下,待我下回分解 O(∩_∩)O

比较的例子:
var a = new Number(1);    
var b = new Number(1);   
var c = a;                // 把a的引用赋值给c  
console.log(a==b);              // false  
console.log(a==c);              // true 

a和b分别new了个Number 对象,指向不同对象的引用,因此a!=b;而c=a,即a和c的引用地址是一样的,所以a==c。

不难看出,js中对象的比较实际是内存地址的比较

传递的例子:
var a = [1,2,3];  
function f(x){  
    x[0] = 4;      // 在函数中修改参数值  
}  
f(a);              
console.log(a[0]);      

a作为参数传递的也是引用,最后a的值为[4,2,3]

最后,一个备受争议的例子:
function setName(obj){
    obj.name="ted";
    obj=new Object();//个人觉得这明明就是作用域问题,局部变量没有return,执行完就销毁了
    obj.name="marry";
}
var obj=new Object();
setName(obj);
console.log(obj.name);

个人觉得就是作用域问题,不知道争论的点和引用传递有什么关系。。。

最后

引用类型或许单独看着很简单,但是如果在复杂的应用中(尤其是上下文依赖比较严重的地方)还是能一眼看穿,那就是真大神了吧!

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

土豆片片

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值