nodejs-基本类型,引用类型,值传递,引用传递

简介

值(基本)类型变量,引用类型变量
值类型变量 存在内存的堆中,ex:a=1,
引用类型变量 1.指针存在于栈中,2.引用类型的具体内容存在于堆中 ex:let a={b:1} a的指针指向 堆中的地址0xffac0ec

引用类型

let obja = {};
let objb = null;
objb = obja;
obja = objb;
obja.a = "a";
//引用类型 指向 同一个堆的区域
console.log(obja);
console.log(objb);

console:

{ a: 'a' }
{ a: 'a' }

值类型

let a = 1;
let b = a;
a += 1;
//值类型 两个单独的堆空间
console.log(a);
console.log(b);

console

2
1

引用类型 非null

let mm = { a: 1 };
let gg = mm;
mm.a = 2;
console.log(gg);
console.log(mm);

console

{ a: 2 }
{ a: 2 }

引用类型 多次改变堆内容

let cao = new String("aaa");
cao.aa = "123";
let wocao = cao;
cao.aa = "321";
console.log(cao);
console.log(wocao);
[String: 'aaa'] { aa: '321' }
[String: 'aaa'] { aa: '321' }

然而 (逐渐失去耐心…)

引用类型转换为值类型 会发生什么?

let cao1 = new String("aaa");
let wocao1 = cao1;
cao1 = "bbb"; 
//当cao1 变为基本类型时,相当于在内存中有一个新的堆空间,cao1的内存地址指向自己本身堆的地址
console.log(cao1); //cao1变为基本类型了
console.log(wocao1); 
//然而wocao1依然是对象类型 而wocao1不受cao1的改变而改变,依然是通过栈的指针 指向new String('aaa')对象的内存地址

console

bbb
[String: 'aaa']

值类型和引用类型 校验

var yiifaa = "yiifaa",
str1 = new String(yiifaa),
str2 = String(yiifaa);

// 类型为string,为值类型
console.log(yiifaa);
console.log("yiffaa " + yiifaa + " " + typeof yiifaa); //string
// 类型为object,为引用类型
console.log("str1 " + str1 + " " + typeof str1); //object
// 类型为string,为值类型
console.log("str2 " + str2 + " " + typeof str2); //string

console

yiffaa yiifaa string
str1 yiifaa object
str2 yiifaa string

//注意 new String()声明的是引用类型对象,String声明的是值对象

值传递 引用传递 针对的是方法

值传递

function addOne(num) {
num += 1;
return num;
}

var count = 10;
var result = addOne(count);
console.log(count);
console.log(result);

//调用addOne(num) 参数num相当于 在方法中拷贝了一个新的num值在堆中,方法内的改变,不会影响到外部变量

10
11

引用传递

let objj = { a: 1 };
function objAdd(obj) {
obj.b = 1;
}
objAdd(objj);
//引用传递,相当于传递的是obj的指针,会影响外部变量 堆中的值
console.log(objj);
{ a: 1, b: 1 }
var person = new Object();
var obj = person; // 赋值
obj.name = "ABC";
obj = new Object(); // 指向 新的对象
obj.name = "BCD";
console.log(person.name); // 指向老的对象 不受影响
console.log(obj.name); // 指向新的对象

console

ABC
BCD
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章