问题分享:Js引用类型赋值
今天在微信群里有這樣一個(gè)問題和大家分享一下:
附上源碼:
function changeAgeAndReference(person){person . age = 25;person = {nage : 'John',age : 50};return person ; } var personObj1={name : 'Alex',age : 30 } var personObj2 = changeAgeAndReference(personObj1); console.log(personObj1) console.log(personObj2) 復(fù)制代碼會(huì)輸出什么呢?答案是:
{name: "Alex", age: 25} {nage: "John", age: 50} 復(fù)制代碼要理解答案為什么是25和50 要理解Js變量賦值問題:
1. Js有兩類數(shù)據(jù)類型:值類型(基本類型)和引用類型
? 值類型(基本類型):字符串(String)、數(shù)字(Number)、布爾(Boolean)、對(duì)空(Null)、未定義(Undefined)、Symbol
? 引用數(shù)據(jù)類型:對(duì)象(Object)、數(shù)組(Array)、函數(shù)(Function)。
基本數(shù)據(jù)類型是按值訪問的,因?yàn)榭梢圆僮鞅4嬖谧兞恐械膶?shí)際的值; 引用類型的值是保存在內(nèi)存中的對(duì)象,在操作對(duì)象時(shí),實(shí)際上是在操作對(duì)象的引用而不是實(shí)際的對(duì)象
2. 變量復(fù)制
基本類型復(fù)制:舉個(gè)栗子
var num1 = 5; var num2 = num1; 復(fù)制代碼num1 中保存的值是 5。當(dāng)使用 num1 的值來初始化 num2 時(shí),num2 中也保存了值 5。但 num2 中的 5 與 num1 中的 5 是完全獨(dú)立的,該值只是 num1 中 5 的一個(gè)副本。此后,這兩個(gè)變量可以參與任 何操作而不會(huì)相互影響
引用類型復(fù)制:舉個(gè)栗子
var obj1 = new Object(); var obj2 = obj1; obj1.name = "Nicholas"; alert(obj2.name); 復(fù)制代碼變量 obj1 保存了一個(gè)對(duì)象的新實(shí)例。然后,這個(gè)值被復(fù)制到了 obj2 中;換句話說,obj1 和 obj2 都指向同一個(gè)對(duì)象。這樣,當(dāng)為 obj1 添加 name 屬性后,可以通過 obj2 來訪問這個(gè)屬性, 因?yàn)檫@兩個(gè)變量引用的都是同一個(gè)對(duì)象
現(xiàn)在讓我們回到問題當(dāng)中
function changeAgeAndReference(person){person . age = 25;person = {nage : 'John',age : 50};return person ; } var personObj1={name : 'Alex',age : 30 } var personObj2 = changeAgeAndReference(personObj1); console.log(personObj1) console.log(personObj1) 復(fù)制代碼var personObj2 = changeAgeAndReference(personObj1) 相當(dāng)于:
var person = personObj1 復(fù)制代碼personObj1 和 person 都指向同一個(gè)對(duì)象,改變person的屬性age也就改變了personObj1的age; 所以 personObj1 變?yōu)?{name: "Alex", age: 25}
函數(shù)內(nèi)部:
person = {nage : 'John',age : 50 }; //相當(dāng)于 var person = {nage : 'John',age : 50 }; 復(fù)制代碼person被重新賦值,已經(jīng)不指向之前的的對(duì)象了,所以return 的是 {nage: "John", age: 50}
文章參考:
《JavaScript 高級(jí)程序設(shè)計(jì)》中文譯本 第三版
轉(zhuǎn)載于:https://juejin.im/post/5becd0e9e51d4543cd17310c
總結(jié)
以上是生活随笔為你收集整理的问题分享:Js引用类型赋值的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 强化学习与深度,神经网络的结合随记
- 下一篇: SQLServer 大小写敏感配置