JS的引用类型和基本类型(传值和传引用)

首先基本类型的数据是存放在栈内存中的,而引用类型的数据是存放在堆内存中的。

基本类型:

    var num1 = 5;
    var num2 = num1;

执行结果:
在这里插入图片描述

基本类型的复制就是在栈内存中开辟出了一个新的存储区域用来存储新的变量,这个变量有它自己的值,所以如果其中一个的值改变,则不会影响到另一个

引用类型:

    var object1 = new Object();
    var object2 = object1;
    object2.name = 'jhon';
    alert(object1.name); //jhon

在这里插入图片描述
定义了一个对象其实是在栈内存中存储了一个指针,这个指针指向堆内存中该对象的存储地址。两个指针都指向同一个对象,所以若其中一个修改了,则另一个也会改变。

基本类型的数据是没有属性和方法的,引用类型才会有,但是为什么String类型却又那么多方法呢?

var string = "aaa";

var string2 = string.substring(0);   //aaa

为了方便程序员对这类的基本类型数据比较方便的操作,在底层做了一些工作,其实这段代码相当于:

var string = new String("aaa");

var string2 = string.substring(0);

string = null;

(1)创建一个String类型的实例 (使用 new 操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存在内存中。而自动创建的基本包装类型的对象,则只存在于一
行代码的执行瞬间,然后立即被销毁 )

(2)在实例上调用指定方法

(3)销毁该实例

经过这三步,字符串值就变得和对象一样了,在Boolean Number中也是这样
String Boolean Number 这三种类型也叫做 基本包装类型

再看看下面代码:

 function setName(obj) {
     obj.name = "Nicholas";
     obj = new Object(); //改变obj的指向,此时obj指向一个新的内存地址,不再和person指向同一个
     obj.name = "Greg";
 }
 var person = new Object();
 setName(person);  
 alert(person.name);  //"Nicholas"

当创建obj对象 obj = new Object(); 时,来看看这时person和obj的关系图:
(函数内创建object对象不会改变外面的属性值 person.name直接读取函数的属性)
引用传递的是指针的值,obj=new Object()改写了自己的指向,并不会影响到person的指向,这种方式就是按引用传递

var person=new Object(); 
var obj = person;  // 赋值
obj.name="ABC"; 
obj=new Object(); 
obj.name="BCD"; 
console.log(person.name);// ABC  并没有影响person的指向

对象引用本身是传递引用地址,重新初始化变量会改变引用地址,不会更改原变量.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript 中,函数参数是按值递的,而不是按引用递的。这意味着在函数内部修改参数的值不会影响到函数外部的原始值。但是,当参数是对象或数组时,递的是对象或数组的引用,因此在函数内部修改对象或数组的属性会影响到函数外部的原始对象或数组。 例如,考虑以下代码: ``` function changeValue(x) { x = 2; } let a = 1; changeValue(a); console.log(a); // 输出 1 ``` 在这个例子中,我们定义了一个函数 `changeValue`,它接受一个参数 `x`。当我们调用 `changeValue(a)` 时,函数内部的 `x` 变量被赋值为 `2`。然而,由于函数参数是按值递的,它并不会影响到外部的 `a` 变量,所以 `console.log(a)` 输出的是 `1`。 现在,让我们考虑一个对象的例子: ``` function changeProperty(obj) { obj.prop = 'new value'; } let myObj = { prop: 'old value' }; changeProperty(myObj); console.log(myObj.prop); // 输出 'new value' ``` 在这个例子中,我们定义了一个函数 `changeProperty`,它接受一个对象参数 `obj`。当我们调用 `changeProperty(myObj)` 时,函数内部修改了 `obj` 的 `prop` 属性的值为 `'new value'`。由于 JavaScript 中对象是按引用递的,这个修改也会影响到外部的 `myObj` 对象,所以 `console.log(myObj.prop)` 输出的是 `'new value'`。 总的来说,JavaScript 中的参数递是按值递的,但对于对象和数组等引用类型的参数,实际递的是它们的引用

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值