關(guān)于ECMAScript中的原始值和引用值詳解
前言
這應(yīng)該是很基礎(chǔ)的 JavaScript 的知識(shí)點(diǎn),但估計(jì)很多小伙伴都只是簡(jiǎn)單帶過(guò),到面試時(shí)一問(wèn)三不知。這里結(jié)合我之前的筆記,再簡(jiǎn)單的介紹下原始值和引用值的相關(guān)知識(shí),來(lái),開(kāi)始。
ECMAScript 規(guī)定變量可以包含兩種數(shù)據(jù)類型,要么是原始值(primitive value),要么是引用值(reference value),原始值即為最簡(jiǎn)單的數(shù)據(jù)構(gòu)成,而引用值是指由多個(gè)值構(gòu)成的對(duì)象。
一共包含六種原始值,分別是:Undefined、Null、Boolean、Number、String和 Symbol,操作原始值就是操作存儲(chǔ)變量中的實(shí)際值。
而引用值這玩意呢,它是保存在內(nèi)存中的對(duì)象,由于 JavaScript 是不能直接訪問(wèn)內(nèi)存位置的,因此也就不能直接操作對(duì)象所在的內(nèi)存空間,當(dāng)你操作對(duì)象的時(shí)候,實(shí)際也就是操作的對(duì)象的引用,而不是這個(gè)對(duì)象本身。
什么是動(dòng)態(tài)屬性
動(dòng)態(tài)屬性是指在創(chuàng)建一個(gè)引用值后,可以動(dòng)態(tài)地添加、修改、刪除其屬性和方法。示例:
let obj = new Object(); obj.name = "Sam"; console.log(obj.name); // "Sam"
釋義:首先創(chuàng)建一個(gè)引用值對(duì)象,并把它保存在變量 obj 中,第二步賦予 obj 一個(gè) name 屬性,值為“Sam”。除非這個(gè)屬性被修改/刪除,不然你是可以直接打印或者訪問(wèn)這個(gè)屬性的。
原始值不能帶有屬性,盡管在給它進(jìn)行屬性操作的時(shí)候不會(huì)報(bào)錯(cuò)。示例:
let me = "Sam"; me.sex = "男"; console.log(me.sex); // undefined
這里使用的是字面量的形式初始化,因此盡管給 me 賦予了 sex 屬性,也是無(wú)濟(jì)于事的,無(wú)法訪問(wèn)該屬性。
如果是使用 new 關(guān)鍵字初始化原始值,JavaScript 則會(huì)創(chuàng)建一個(gè) Object 實(shí)例。示例:
let me = new String("Sam"); me.sex = "男"; console.log(me.sex); // "男"
值的復(fù)制
原始值和引用值在通過(guò)變量復(fù)制時(shí)也有所不同,原始值會(huì)被復(fù)制到一個(gè)新的變量,而引用值實(shí)際上是復(fù)制了值的指針。示例:
let name = "Sam"; let myName = name; console.log(myName); // "Sam"
當(dāng) myName 初始化為 name 時(shí),“Sam”也會(huì)被復(fù)制到 myName 中,與 name 相互獨(dú)立,互不干擾,可以理解為 myName 是 name 的副本。
而引用值的復(fù)制,實(shí)際是復(fù)制了一個(gè)指針,指向堆內(nèi)存中的對(duì)象,對(duì)復(fù)制后的變量進(jìn)行屬性操作,實(shí)際也是操作的被復(fù)制的對(duì)象,兩個(gè)變量實(shí)際上是指同一對(duì)象。示例:
let me = new Object(); let you = me; me.name = "Sam"; console.log(you.name); // "Sam"
判斷值類型
我們經(jīng)常使用 typeof 來(lái)判斷一個(gè)變量的類型,對(duì)判斷原始值的類型很有用,但如果是用來(lái)判斷引用值,卻顯得用處不大,因?yàn)閷?duì)于引用值和 null,typeof 都是返回的 object。
通常情況下,我們需要確切知道,這是一個(gè)什么類型的對(duì)象,于是便有了 instanceof 操作符。語(yǔ)法為:
result = variable instanceof constructor
instanceof 返回一個(gè) Boolean 值。示例:
console.log(person instanceof Object); // 變量 person 是 Object 嗎? console.log(colors instanceof Array); // 變量 colors 是 Array 嗎? console.log(pattern instanceof RegExp); // 變量 pattern 是 RegExp 嗎?
如果使用 instanceof 檢測(cè)原始值,則會(huì)始終返回 false,因?yàn)樵贾挡皇菍?duì)象。
總結(jié)
到此這篇關(guān)于關(guān)于ECMAScript中的原始值和引用值的文章就介紹到這了,更多相關(guān)ECMAScript原始值和引用值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談js在html中的加載執(zhí)行順序,多個(gè)jquery ready執(zhí)行順序
下面小編就為大家?guī)?lái)一篇淺談js在html中的加載執(zhí)行順序,多個(gè)jquery ready執(zhí)行順序。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11JavaScript中Async/Await通過(guò)同步的方式實(shí)現(xiàn)異步的方法介紹
在JavaScript的異步編程中,我們經(jīng)常使用回調(diào)函數(shù)、Promise和 Async/Await來(lái)解決異步操作的問(wèn)題,Async/Await 又是Promise的語(yǔ)法糖,它的出現(xiàn)讓異步編程變得更加直觀和易于理解,本文將詳細(xì)講解Async/Await如何通過(guò)同步的方式實(shí)現(xiàn)異步2023-06-06JS閉包、作用域鏈、垃圾回收、內(nèi)存泄露相關(guān)知識(shí)小結(jié)
閉包是指有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域中變量的函數(shù)。接下來(lái)通過(guò)本文給大家介紹JS閉包作用域鏈等相關(guān)知識(shí)小結(jié)(垃圾回收內(nèi)存泄露)的相關(guān)知識(shí),感興趣的朋友一起學(xué)習(xí)吧2016-05-05JavaScript使用Promise實(shí)現(xiàn)并發(fā)請(qǐng)求數(shù)限制
本文主要介紹了JavaScript使用Promise實(shí)現(xiàn)并發(fā)請(qǐng)求數(shù)限制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04微信小程序開(kāi)發(fā)中生命周期的詳細(xì)介紹
生命周期是指一個(gè)對(duì)象從創(chuàng)建→>運(yùn)行>銷毀的整個(gè)階段,強(qiáng)調(diào)的是一個(gè)時(shí)間段,文中介紹了小程序中組件的生命周期,需要的朋友可以參考下2023-03-03