最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

代碼:

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

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

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

代碼:

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

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

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

JavaScript中的值類型無法添加屬性和方法:

代碼:

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

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

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中的值類型的變量存儲結(jié)構(gòu)如下表模擬所示,棧區(qū)中包括了變量的標(biāo)識符以及變量所對應(yīng)的值。

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

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

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

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

代碼:

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

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

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

代碼:

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

可見,兩個空對象并不相等。

疑問:為什么兩個一模一樣的對象不相等呢?

擴展:因為引用類型是按引用地址訪問的,引用類型的比較其實就是比較兩個對象在堆內(nèi)存中的地址是否相同,那么,很明顯,student1和student2在堆內(nèi)存中地址是不同的,所以,即使看到一模一樣的兩個對象,也不一定相等。

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

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

代碼:

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

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

JavaScript中的引用類型的變量賦值過程中,在從一個變量到另一個變量賦值引用類型時,同樣也會在該變量上創(chuàng)建一個新“值”,然后再把該“值”復(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

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

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

相關(guān)文章

  • JavaScript生成福利彩票雙色球號碼

    JavaScript生成福利彩票雙色球號碼

    無聊用javascript寫了個隨機產(chǎn)生福利彩票雙色球7個數(shù)字的號碼其中紅色球不會重復(fù),喜歡的可以下來看看,有意見的可以說說
    2015-05-05
  • TypeScript里string和String的區(qū)別

    TypeScript里string和String的區(qū)別

    這篇文章主要介紹了TypeScript里string和String的區(qū)別,真的不止是大小寫的區(qū)別,string表示原生類型,而String表示對象,下文更多詳細內(nèi)容需要的小伙伴可以參考一下
    2022-03-03
  • FF和IE之間7個JavaScript的差異

    FF和IE之間7個JavaScript的差異

    盡管 JavaScript 歷史上使用冗長而令人生厭的代碼塊來標(biāo)的特定瀏覽器的時期已經(jīng)結(jié)束了,但是偶爾使用一些簡單的代碼塊和對象檢測來確保一些代碼在用戶機器上正常工作依然是必要的。
    2009-05-05
  • javascript 網(wǎng)頁跳轉(zhuǎn)的方法

    javascript 網(wǎng)頁跳轉(zhuǎn)的方法

    昨天練習(xí)的時候正好要用到跳轉(zhuǎn)代碼,在網(wǎng)上找了一下,覺得下面幾個不錯...整理了一下發(fā)上來...
    2008-12-12
  • 微信小程序背景音樂開發(fā)詳解

    微信小程序背景音樂開發(fā)詳解

    這篇文章主要介紹了微信小程序背景音樂開發(fā)詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • ES6中l(wèi)et 和 const 的新特性

    ES6中l(wèi)et 和 const 的新特性

    這篇文章主要介紹了ES6中l(wèi)et 和 const 的新特性,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-09-09
  • 超實用的全新JavaScript事件Scrollend實例詳解

    超實用的全新JavaScript事件Scrollend實例詳解

    這篇文章主要為大家介紹了超實用的全新JavaScript事件Scrollend實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • JavaScript 語句之常用 for 循環(huán)詳解

    JavaScript 語句之常用 for 循環(huán)詳解

    這篇文章主要介紹了JavaScript 語句之常用 for 循環(huán),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • js取模(求余數(shù))隔行變色

    js取模(求余數(shù))隔行變色

    今天需要用js實現(xiàn)做隔行變色功能,原來用的是asp程序都是用mod取模,原來js中用的是%,具體如下需要的朋友可以參考下
    2014-05-05
  • 使用cypress編寫第一個測試用例

    使用cypress編寫第一個測試用例

    這篇文章主要為大家介紹了使用cypress編寫第一個測試用例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06

最新評論

湘潭县| 岱山县| 察雅县| 白水县| 台东市| 图木舒克市| 卓资县| 浮山县| 五河县| 昌平区| 海安县| 博乐市| 大安市| 金乡县| 龙胜| 洛阳市| 房产| 寻乌县| 乌兰县| 车致| 桦川县| 岳西县| 龙口市| 泾阳县| 册亨县| 治县。| 丰城市| 芮城县| 靖远县| 梓潼县| 县级市| 桂东县| 睢宁县| 沙田区| 武威市| 平昌县| 璧山县| 南城县| 秦皇岛市| 甘洛县| 巴彦县|