JavaScript中的不可變原始值和可變對象引用
在JavaScript中,原始值(undefined、null、布爾值、數(shù)字和字符串)與對象(包括數(shù)組和函數(shù))之間存在著根本的區(qū)別。原始值是不可變的,意味著它們的值無法改變。這對于數(shù)字和布爾值很容易理解:修改它們的值是沒有意義的。然而,對于字符串來說,這可能會(huì)稍微不太直觀。由于字符串類似于字符數(shù)組,可能會(huì)認(rèn)為在特定索引處修改字符是可能的。然而,JavaScript不允許這樣做。所有看似修改字符串的方法實(shí)際上都返回一個(gè)新的字符串。例如:
原始值通過其值進(jìn)行比較,意味著只有當(dāng)兩個(gè)值的值相同時(shí),它們才被認(rèn)為是相等的。這在處理數(shù)字、布爾值、null和undefined時(shí)可能聽起來令人困惑。但實(shí)際上很簡單:例如,當(dāng)比較兩個(gè)不同的字符串時(shí),只有當(dāng)它們具有相同的長度且在相同索引處的每個(gè)字符都相同時(shí),JavaScript才認(rèn)為它們是相等的。
(程序員的軟技能:ke.qq.com/course/6034346)
另一方面,對象是可變的;它們的值可以改變:
對象不是通過值進(jìn)行比較的;即使兩個(gè)具有相同屬性和值的不同對象,也不被認(rèn)為是相等的。類似地,具有相同元素且順序相同的兩個(gè)不同數(shù)組也不相等:
對象有時(shí)被稱為引用類型,與JavaScript的原始類型相對。根據(jù)這種術(shù)語,對象值是引用,對象通過引用進(jìn)行比較。換句話說,只有當(dāng)兩個(gè)對象值引用相同的底層對象時(shí),它們才相等。
從上面的代碼可以看出,將對象(或數(shù)組)賦值給一個(gè)變量實(shí)際上是賦值引用,而不是對象的新副本。如果要?jiǎng)?chuàng)建對象或數(shù)組的新副本,必須顯式地復(fù)制其屬性或元素。下面的示例演示了如何使用for循環(huán)來實(shí)現(xiàn)這個(gè)過程:
如果要比較兩個(gè)不同的對象或數(shù)組,必須比較它們的屬性或元素。下面的代碼定義了一個(gè)函數(shù),用于比較兩個(gè)數(shù)組:
(程序員的軟技能:ke.qq.com/course/6034346)