成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

關(guān)於Javascript基本類(lèi)型和引用類(lèi)型小知識(shí)

iKcamp / 2453人閱讀

摘要:變量有兩種不同的數(shù)據(jù)類(lèi)型基本類(lèi)型,引用類(lèi)型。知識(shí)一基本類(lèi)型值就是簡(jiǎn)單的數(shù)據(jù)段引用類(lèi)型值保存的是對(duì)象的引用,不是實(shí)際的對(duì)象。

ECMAScirpt 變量有兩種不同的數(shù)據(jù)類(lèi)型:基本類(lèi)型,引用類(lèi)型

基本的數(shù)據(jù)類(lèi)型有:undefined,boolean,number,string,null. 基本類(lèi)型的訪問(wèn)是按值訪問(wèn)的,就是說(shuō)你可以操作保存在變量中的實(shí)際的值。JavaScript中除了上面的基本類(lèi)型之外就是引用類(lèi)型了。

區(qū)別如下:
基本類(lèi)型:

佔(zhàn)用空間固定,保存在棧中

保存與復(fù)製的是本身

使用typeof檢測(cè)數(shù)據(jù)類(lèi)型

值類(lèi)型

引用類(lèi)型:

佔(zhàn)用空間不固定,保存在堆中

保存與復(fù)製的是指向?qū)ο蟮囊粋€(gè)指針

使用instanceof檢測(cè)數(shù)據(jù)類(lèi)型

使用new()方法構(gòu)造出來(lái)的對(duì)象是引用類(lèi)型(相關(guān)內(nèi)容可參考關(guān)於Javascript中的new運(yùn)算符,構(gòu)造函數(shù)與原型鏈一些理解)

基本類(lèi)型是不會(huì)改變,衹能重新賦值,而引用類(lèi)型值是可以改變的

var a = "123456789",
      b = a;
 
a = "321";
console.log(a) // 321
console.log(b) // 123456789

上面因?yàn)槭前阎当4嬖诹俗兞苛?而不是保存的是引用地址,所以他們兩個(gè)是相對(duì)獨(dú)立的整體,互不影響。但是如果換成引用類(lèi)型的話

var a = {
    n: "123456789"
},
b = a;

a.n ="321";
console.log(a) // { n: "321" }
console.log(b) // { n: "321" }

原因在於在javascript語(yǔ)言中創(chuàng)建的對(duì)象值中其保存的是對(duì)象的引用(也就是一個(gè)地址.引用類(lèi)型值保存在內(nèi)存中,而JS是不能直接訪問(wèn)內(nèi)存的,所以對(duì)於引用類(lèi)型,操作的不是實(shí)際的對(duì)象而是對(duì)象的引用。)

這里有個(gè)小提示説一下,假如兩個(gè)相同的基本類(lèi)型或引用類(lèi)型(內(nèi)容一樣)相比,看看結(jié)果是怎樣的?

var base1 = "123",
    base2 = "123",
    obj1 = { a: "123" },
    obj2 = { a: "123" };

console.log(base1 === base2) // true
console.log(obj1 === obj2) // false

如果你還錯(cuò)了那就證明你沒(méi)理解透上面的東西了,因?yàn)榍懊媸侵抵g直接比較,后面是指向地址的比較,即使兩個(gè)引用類(lèi)型看起來(lái)一樣,衹要不是同一個(gè)聲明變量,它們就一定不同。

知識(shí)一:基本類(lèi)型值就是簡(jiǎn)單的數(shù)據(jù)段;引用類(lèi)型值保存的是對(duì)象的引用,不是實(shí)際的對(duì)象。

但是在函數(shù)中的對(duì)象傳值又是不是同一回事呢?看看下面代碼

function setName(obj) {
    obj.name = "1";
    obj = {};
    obj.name = "2";
}

var obj = {};
setName(obj);

console.log("最終結(jié)果obj:", obj) // 最終結(jié)果obj: { name: "1" }

沒(méi)錯(cuò),結(jié)果出乎意料的是1.而不是大多數(shù)人剛開(kāi)始認(rèn)為的2.
接下來(lái)我們?cè)谝徊讲椒治龀鲈诤瘮?shù)過(guò)程中對(duì)象發(fā)生了什么樣的變化?稍微修改下對(duì)象名便於區(qū)分。

function setName(innerObj) {
    console.log("初始的innerObj:", innerObj); // 初始的innerObj: {}

    innerObj.name = "1";
    console.log("第一次設(shè)置屬性值的innerObj:", innerObj); // 第一次設(shè)置屬性值的innerObj: { name: "1" }

    //保存下原對(duì)象
    var _innerObj = innerObj;

    innerObj = {};
    console.log("重新賦值的innerObj:", innerObj); // 重新賦值的innerObj: {}

    innerObj.name = "2";
    console.log("第二次設(shè)置屬性值的innerObj:", innerObj); // 第二次設(shè)置屬性值的innerObj: { name: "2" }

    console.log("兩者之間是不是同一個(gè)對(duì)象?:", _innerObj == innerObj) // 兩者之間是不是同一個(gè)對(duì)象?: false
    console.log("innerObj:", innerObj) // innerObj: { name: "2" }
    console.log("_innerObj: ", _innerObj) // _innerObj:  { name: "1" }
}

var outerObj = {};
setName(outerObj);
console.log("最終結(jié)果outerObj:", outerObj) // 最終結(jié)果outerObj: { name: "1" }

過(guò)程中可以看出在函數(shù)中間 innerObj = {} 之后;對(duì)象的指向就已經(jīng)變了,也就是說(shuō)這里相當(dāng)於重新建立一個(gè)新的指向,后續(xù)的操作都是基於新指向之上進(jìn)行的。
此時(shí),outerObj === _innerObj !== innerObj, 所以最終輸出的是1而不是2.

如果還有些混亂的同學(xué),看看如果不通過(guò)函數(shù)直接修改會(huì)是什么結(jié)果?

var obj = {"a":1}
obj = {};
obj = {"a":2};
console.log(obj) // { a: 2 }

這次確確實(shí)實(shí)的是輸出2了。

知識(shí)二:JS中所有函數(shù)傳參都是按值傳遞的。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/106154.html

相關(guān)文章

  • 關(guān)於Javascript中的new運(yùn)算符,構(gòu)造函數(shù)與原型鏈一些理解

    摘要:前言文章主要基于高級(jí)程序設(shè)計(jì)總結(jié)的基本重寫(xiě)了全文補(bǔ)充知識(shí)點(diǎn)新增實(shí)例優(yōu)化排版新增檢測(cè)方法技巧用法構(gòu)造函數(shù)創(chuàng)建一個(gè)用護(hù)定義的對(duì)象類(lèi)型的實(shí)例或具有構(gòu)造函數(shù)的內(nèi)置對(duì)象類(lèi)型之一命令執(zhí)行構(gòu)造函數(shù)返回一個(gè)實(shí)例對(duì)象構(gòu)造函數(shù)一個(gè)指定對(duì)象實(shí)例的類(lèi)型的函數(shù)傳慘一 前言 文章主要基于>總結(jié)的!!!PS: 2018/05/09 基本重寫(xiě)了全文,補(bǔ)充知識(shí)點(diǎn),新增實(shí)例,優(yōu)化排版PS: 2018/05/11 新增檢測(cè)...

    cikenerd 評(píng)論0 收藏0
  • Javascript難點(diǎn)知識(shí)運(yùn)用---遞歸,閉包,柯里化等

    摘要:作用域鏈的用途,是保證對(duì)執(zhí)行環(huán)境有權(quán)訪問(wèn)的所有變量和函數(shù)的有序訪問(wèn)。作用域鏈的前端,始終都是當(dāng)前執(zhí)行的代碼所在環(huán)境的變量對(duì)象。對(duì)語(yǔ)句來(lái)說(shuō),會(huì)將指定的對(duì)象添加到作用域鏈中。 前言 ps: 2018/05/13 經(jīng)指正之后發(fā)現(xiàn)惰性加載函數(shù)細(xì)節(jié)有問(wèn)題,已改正在這里也補(bǔ)充一下,這些都是根據(jù)自己理解寫(xiě)的例子,不一定說(shuō)的都對(duì),有些只能查看不能運(yùn)行的要謹(jǐn)慎,因?yàn)槲铱赡苤皇菍⒎椒ㄋ悸穼?xiě)出來(lái),沒(méi)有實(shí)際跑...

    hqman 評(píng)論0 收藏0
  • 關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(四) ----- FileReader

    摘要:沒(méi)有瀏覽器測(cè)試,所以不知道是不是有效,其實(shí)里面看起來(lái)比我寫(xiě)的那個(gè)復(fù)雜,實(shí)際上多了個(gè)檢驗(yàn)格式上兼容寫(xiě)法所以不要怕,如果我錯(cuò)了記得提醒下我啊。目前為止其實(shí)已經(jīng)該說(shuō)的都差不多覆蓋到了吧,動(dòng)手能力強(qiáng)的話已經(jīng)可以根據(jù)教程寫(xiě)一個(gè)實(shí)例出來(lái)的了。 系列文章 關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(零)關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(一) ----- XMLHttpRequest關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(...

    Tony 評(píng)論0 收藏0
  • 三、值類(lèi)型引用類(lèi)型

    摘要:它們的區(qū)別之一就是在計(jì)算機(jī)中的存儲(chǔ)方式不同基本類(lèi)型數(shù)據(jù)是將變量名及值存儲(chǔ)在變量對(duì)象中,而引用類(lèi)型的數(shù)據(jù)是將變量名和地址存儲(chǔ)在變量對(duì)象中,真正的值是存儲(chǔ)在堆內(nèi)存中。 showImg(https://segmentfault.com/img/remote/1460000017151449); 說(shuō)點(diǎn)別的 這是《關(guān)于 JavaScript 你必須要知道的 33 個(gè)概念 》系列的第三篇文章,今天...

    tinysun1234 評(píng)論0 收藏0
  • JavaScript知識(shí)架構(gòu)學(xué)習(xí)路徑(一)- 變量篇

    摘要:在此,我們首先根據(jù)變量的作用域,將變量劃分為三級(jí),具體是全局變量局部變量和參數(shù)變量。 【摘要】本文是專(zhuān)為JavaScript入門(mén)者而總結(jié)的,總體上將JavaScript的基礎(chǔ)部分分成了九大塊,分別是變量、運(yùn)算符、數(shù)組、流程控制結(jié)構(gòu)、字符串函數(shù)、函數(shù)基礎(chǔ)、DOM操作基礎(chǔ)、文檔對(duì)象模型DOM和正則表達(dá)式。 【關(guān)鍵字】變量、運(yùn)算符、數(shù)組、流程控制結(jié)構(gòu)、函數(shù)、DOM、正則表達(dá)式。 本篇文章的主...

    toddmark 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<