1. 程式人生 > 實用技巧 >js基本型別和引用型別

js基本型別和引用型別

基本型別和引用型別

在mdn中,js資料型別被分為原始型別和物件型別,也叫基本型別和引用型別。

具體的基本型別和引用型別可以檢視mdn:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Data_structures

基本型別

1.基本型別值不可變

基本型別的變數存放在棧區,值不可變。不過這裡的值不可變說的是不能使用方法改變值,直接再次賦值顯然能夠改變值的。

let name='zhangsan';
console.log(typeof(name));//string
parseInt(name);
console.log(typeof(name));//
string name=true; console.log(typeof(name));//true

2.基本型別的變數賦值

基本型別的變數賦值時,會在棧區建立一個新值,賦值與被賦值的變數進行任何操作都不會影響對方。

let nameA='zhangsan';
let nameB=nameA;
console.log(nameB);//zhangsan
nameB='lisi';
console.log(nameA);//zhangsan
console.log(nameB);//lisi

引用型別

1.引用型別值可變

引用型別的值存放在堆疊區,值可變是指可以使用方法改變。

let person={
  name:
'zhangsan', age:18 }; console.log(person);//{ name: 'zhangsan', age: 18 } person.name='lisi'; person.age=20; console.log(person);//{ name: 'lisi', age: 20 }

2.引用型別的變數賦值

引用型別的變數賦值時,也會在棧區建立一個新值,但是這裡的棧區儲存的值是指向堆區的指標,也就是變數賦值後,棧區的值不同,但是都指向堆區的相同內容,賦值與被賦值的變數進行任何操作都會影響對方。

let personA={
  name:'zhangsan',
  age:
18 }; let personB=personA; console.log(personA);//{ name: 'zhangsan', age: 18 } personB.name='lisi'; personB.age=20; console.log(personA);//{ name: 'lisi', age: 20 } console.log(personB);//{ name: 'lisi', age: 20 }

兩種型別堆疊區變化

初始化

let a=1;
let b=1;
console.log(a===b);//true
​
let personA={};
let personB={};
console.log(personA===personB);//false

a和b在棧區值都是1,所以a===btrue。personA和personB堆區值相同,但是指向堆區的棧區值為堆記憶體地址a和堆記憶體地址b,所以personA===personBfalse

賦值

let a=1;
let b=a;
console.log(a===b);//true
​
let personA={};
let personB=personA;
console.log(personA===personB);//true

a賦值給b,a和b在棧區值都是1,所以a===btrue。personA賦值給personB,堆區不變,棧區新增指向堆區的棧區值(堆記憶體地址a),兩個變數棧區值相同,所以personA===personBtrue