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