js值传递和引用传递问题

前言:本文讨论javascript中值传递和引用传递的问题,部分参考自《JavaScript高级程序设计》

基本数据类型和引用数据类型:

基本数据类型:

ECMScript定义了五种基本数据类型,分别是:Null,Undefined,Number,String,Boolean。这五种数据类型是按值访问的,因为可以操作保存在变量中的值。

引用数据类型:

引用类型数据包括一切的object,类似Date,Array。引用数据类型的值是保存在内存中的对象,JavaScript是不允许直接访问内存中的位置,就是说不能直接操作对象的内存空间,所以在操作对象时,实际上是操作对象的引用而不是实际的对象。所以引用类型的值是按引用访问的。

添加属性:

在引用类型中我们可以添加对象属性,而在基本数据类型中不可以,虽然不会报错

var g=new Object();
g.name="haha";
alert(g.name);//haha

基本数据类型

var d="people";
d.name="xixi";
alert(d.name);//undefined

复制变量值时:

在基本类型中,复制变量实际上是复制了变量的一个副本,在新的变量上修改,也不会互相影响,

var num=5;
var num2=num;//复制了num的一个副本赋值给num2   

而在引用数据类型中,与基本类型不同的是,复制引用类型的值时,同样是复制一份放到新的内存空间,但是这个值得副本实际上是一个指针,指向堆内存中的对象,所以复制完成后,两个变量引用一个对象,他们任何一个作修改,都会改变另一个变量。

var obj1=new Object();
var obj2=obj1;
obj2.name="2";
alert(obj1.name);//2

引用红宝书的一张图方便理解:

这里写图片描述

在函数中传递参数:

ECMScript中所有函数参数都是值传递,基本类型值传递如基本类型变量复制一样,而引用数据类型传递则和引用类型变量复制一样,所以就有下面的区别:

基本类型值传递

function add(num){
    num+=1;
    return num;
}
var n=3;
var m=add(n);
alert(n);//3
alert(m);//4

引用类型值传递:

function setName(obj){
    obj.name="xixi";
}
var person=new Object();
setName(person);
alert(person.name);//xixi

技术博客:https://gdmec07140603.github.io/ 欢迎访问

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值