欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript中值類型和引用類型的區(qū)別

 更新時(shí)間:2017年02月23日 17:01:52   作者:陌年古城  
本文主要介紹了JavaScript中值類型和引用類型的區(qū)別,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧

JavaScript的數(shù)據(jù)類型分為兩類:原始類型和對(duì)象類型。其中,原始類型包括:數(shù)字、字符串和布爾值。此外,JavaScript中還有兩個(gè)特殊的原始值:null和undefined,它們既不是數(shù)字也不是字符串,更不是布爾值。它們通常分別代表了各自特殊類型的唯一成員。JavaScript中除了數(shù)字、字符串、布爾值、null和undefined之外的就是對(duì)象了。

JavaScript中值類型和引用類型的區(qū)別

JavaScript中的值類型的值是不可變的:

任何方法都無(wú)法改變值類型的值。數(shù)字、布爾值、null和undefined等都屬于不可變類型。比如,修改一個(gè)數(shù)值的內(nèi)容,本身就說(shuō)不通。雖然字符串可以被看成是由字符組成的數(shù)組,可能會(huì)被認(rèn)為是可變的。但是,在JavaScript中,字符串是不可變的。在實(shí)際操作過(guò)程中,可以訪問(wèn)字符串任意位置的文本,單JavaScript并未提供修改已知字符串的文本內(nèi)容的方法。

代碼:

var str = 'abcdef';
console.log(str.toUpperCase()); // ABCDEF
console.log(str); // abcdef

可見(jiàn),原始的str字符串值并未發(fā)生改變,仍然是小寫的abcdef,第二行代碼,只是調(diào)用了字符串的toUpperCase()方法后,返回的是一個(gè)新的字符串。

JavaScript中的引用類型的值是可變的:

代碼:

var student = {name: '張三', age: 26};
console.log(student.name); // 張三
student.name = '李四';
console.log(student.name); // 李四

疑問(wèn):如果像studen.name = '李四'這段代碼一樣,給str也做相同的操作,str的值不也是改變了嗎?

擴(kuò)展:如果給str重新賦值,那么改變的是變量的值,給str重新賦值了,并沒(méi)有改變字符串內(nèi)容,改變的只是變量str的內(nèi)容

JavaScript中的值類型無(wú)法添加屬性和方法:

代碼:

var student = '張三';
student.age = 26;
student.run = function () {
 console.log('跑步中...');
}
console.log(student.age); // undefined
console.log(student.run); // undefined

通過(guò)代碼示例,可知,不能給值類型添加屬性和方法。從而,也更加說(shuō)明了值類型是不可變的。

JavaScript中的引用類型可以添加屬性和方法:

代碼:

var student = {};
student.age = 26;
student.run = function () {
 console.log('跑步中...');
}
console.log(student.age); // 26
console.log(student.run);
/*
function () {
 console.log('跑步中...');
}
*/

JavaScript中的值類型的變量是存放在棧區(qū)的:

JavaScript中的值類型的變量存儲(chǔ)結(jié)構(gòu)如下表模擬所示,棧區(qū)中包括了變量的標(biāo)識(shí)符以及變量所對(duì)應(yīng)的值。

JavaScript中的引用類型的變量也是存放在棧區(qū)的,不同的是,引用類型在棧區(qū)中存放的是變量標(biāo)識(shí)符以及變量所對(duì)應(yīng)值得引用地址,而變量所對(duì)應(yīng)的值被存放在堆區(qū)中:

所以,可以看出,即使兩個(gè)對(duì)象完全一樣,但是在堆區(qū)中的存放地址是不一樣的,所以在比較時(shí),是不相等的。

JavaScript中的值類型的比較是值的比較:

JavaScript中的值類型在進(jìn)行比較的時(shí)候,只有在它們的值相等的時(shí)候,它們才相等。注意:比較的時(shí)候注意“==”和“===”,雙等號(hào)(==)在做比較的時(shí)候,做了類型轉(zhuǎn)換,而全等號(hào)(===)是值和類型的比較,只有值和類型同時(shí)相等時(shí),才能相等。

代碼:

var student1 = '{}';
var student2 = '{}';
console.log(student1 === student2); // true

兩個(gè)相同字符串的比較,是值(‘{}')的比較,完全相等。

JavaScript中的引用類型的比較是引用地址的比較:

代碼:

var student1 = {};
var student2 = {};
console.log(student1 === student2); // false

可見(jiàn),兩個(gè)空對(duì)象并不相等。

疑問(wèn):為什么兩個(gè)一模一樣的對(duì)象不相等呢?

擴(kuò)展:因?yàn)橐妙愋褪前匆玫刂吩L問(wèn)的,引用類型的比較其實(shí)就是比較兩個(gè)對(duì)象在堆內(nèi)存中的地址是否相同,那么,很明顯,student1和student2在堆內(nèi)存中地址是不同的,所以,即使看到一模一樣的兩個(gè)對(duì)象,也不一定相等。

JavaScript中的值的變量賦值,是值得復(fù)制:

JavaScript中的值類型的變量賦值過(guò)程中,在從一個(gè)變量到另一個(gè)變量賦值基本類型(值類型)時(shí),會(huì)在該變量上創(chuàng)建一個(gè)新值,然后再把該值復(fù)制到為新變量分配的位置上:

代碼:

var str1 = 'abcdef';
var str2 = str1;
str1 = 'abc'; 
console.log(str1); // abc
console.log(str2); // abcdef

從上述代碼示例中可以看出,str1中保存的值為 abcdef ,當(dāng)使用 str1 來(lái)初始化 str2 時(shí),str2 中保存的值也為abcdef,但str2中的值和str1中的值是完全獨(dú)立的,str2的值只是str1中的值的一個(gè)副本,接下來(lái),這兩個(gè)變量可以參加任何操作而相互不影響。其實(shí)就是說(shuō),基本類型的變量在賦值操作后,兩個(gè)變量是相互獨(dú)立的,都不受影響的。

JavaScript中的引用類型的變量賦值過(guò)程中,在從一個(gè)變量到另一個(gè)變量賦值引用類型時(shí),同樣也會(huì)在該變量上創(chuàng)建一個(gè)新“值”,然后再把該“值”復(fù)制到為新變量分配的位置上。不同的是,復(fù)制的不是真正的“值”,而是真正的值在堆區(qū)中的存放地址:

代碼:

var student1 = {age: 26};
var student2 = student1;
student2.age = 100;
console.log(student1.age); // 100
console.log(student2.age); // 100
console.log(student2 === student1); // true

引用類型的賦值其實(shí)是對(duì)象保存在棧區(qū)地址指針的賦值,兩個(gè)變量都保存了同一個(gè)對(duì)象地址,則這兩個(gè)變量指向了同一個(gè)對(duì)象。因此,改變其中任何一個(gè)變量,都會(huì)相互影響。

以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!

相關(guān)文章

  • 有關(guān)Promises異步問(wèn)題詳解

    有關(guān)Promises異步問(wèn)題詳解

    這篇文章主要介紹了有關(guān)JavaScript Promises異步問(wèn)題詳解的相關(guān)資料,需要的朋友可以參考下
    2015-11-11
  • 使用JavaScript開(kāi)發(fā)跨平臺(tái)的桌面應(yīng)用詳解

    使用JavaScript開(kāi)發(fā)跨平臺(tái)的桌面應(yīng)用詳解

    下面小編就為大家?guī)?lái)一篇使用JavaScript開(kāi)發(fā)跨平臺(tái)的桌面應(yīng)用詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • 小程序云開(kāi)發(fā)部署攻略(圖文教程)

    小程序云開(kāi)發(fā)部署攻略(圖文教程)

    微信小程序的云開(kāi)發(fā)功能剛剛上線,這篇文章主要介紹了小程序云開(kāi)發(fā)部署攻略(圖文教程),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • javascript實(shí)現(xiàn)獲取瀏覽器版本、瀏覽器類型

    javascript實(shí)現(xiàn)獲取瀏覽器版本、瀏覽器類型

    這篇文章主要介紹了javascript實(shí)現(xiàn)獲取瀏覽器版本,javascript實(shí)現(xiàn)獲取瀏覽器類型兩大方面,對(duì)這方面感興趣的朋友可以參考一下
    2015-12-12
  • TypeScript中Map對(duì)象使用及Map與字典的區(qū)別詳解

    TypeScript中Map對(duì)象使用及Map與字典的區(qū)別詳解

    Map對(duì)象主要的應(yīng)用場(chǎng)景在于數(shù)據(jù)重組和數(shù)據(jù)儲(chǔ)存,下面這篇文章主要給大家介紹了TypeScript中Map對(duì)象使用及Map與字典的區(qū)別的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • JavaScript實(shí)現(xiàn)將Word文檔解析成瀏覽器認(rèn)識(shí)的HTML

    JavaScript實(shí)現(xiàn)將Word文檔解析成瀏覽器認(rèn)識(shí)的HTML

    這篇文章主要為大家詳細(xì)介紹了如何使用JavaScript實(shí)現(xiàn)將Word文檔解析成瀏覽器認(rèn)識(shí)的HTML,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2024-02-02
  • js實(shí)現(xiàn)select跳轉(zhuǎn)功能代碼

    js實(shí)現(xiàn)select跳轉(zhuǎn)功能代碼

    實(shí)現(xiàn)select跳轉(zhuǎn)的方法有很多,本例為大家介紹的是js實(shí)現(xiàn)的,通過(guò)location.href獲取跳轉(zhuǎn)地址,需要的朋友可以看看
    2014-10-10
  • js操作DOM--添加、刪除節(jié)點(diǎn)的簡(jiǎn)單實(shí)例

    js操作DOM--添加、刪除節(jié)點(diǎn)的簡(jiǎn)單實(shí)例

    下面小編就為大家?guī)?lái)一篇js操作DOM--添加、刪除節(jié)點(diǎn)的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-07-07
  • JavaScript 中的輸出數(shù)據(jù)多種方式

    JavaScript 中的輸出數(shù)據(jù)多種方式

    在 JavaScript 中,不像 Java 等語(yǔ)言,它沒(méi)有任何打印或者輸出方法的,在js中通過(guò)使用4種方式來(lái)輸出數(shù)據(jù),本文通過(guò)實(shí)例代碼給大家詳細(xì)介紹,感興趣的朋友跟隨小編一起看看吧
    2022-03-03
  • javascript 模擬點(diǎn)擊廣告

    javascript 模擬點(diǎn)擊廣告

    我們不管js或iframe怎么調(diào)用的,模擬點(diǎn)擊就意味著打開(kāi)廣告鏈接,廣告商就以為用戶點(diǎn)擊了他的廣告,所以我們只要保證點(diǎn)擊了一個(gè)鏈接但沒(méi)有跳出頁(yè)面的結(jié)果就行了,是嗎?
    2010-01-01

最新評(píng)論