国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

iKcamp / 2454人閱讀

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

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

基本的數(shù)據(jù)類型有:undefinedbooleannumberstringnull. 基本類型的訪問是按值訪問的,就是說你可以操作保存在變量中的實(shí)際的值。JavaScript中除了上面的基本類型之外就是引用類型了。

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

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

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

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

值類型

引用類型:

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

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

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

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

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

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

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

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

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

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

這里有個(gè)小提示説一下,假如兩個(gè)相同的基本類型或引用類型(內(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ò)了那就證明你沒理解透上面的東西了,因?yàn)榍懊媸侵抵g直接比較,后面是指向地址的比較,即使兩個(gè)引用類型看起來一樣,衹要不是同一個(gè)聲明變量,它們就一定不同。

知識(shí)一:基本類型值就是簡(jiǎn)單的數(shù)據(jù)段;引用類型值保存的是對(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" }

沒錯(cuò),結(jié)果出乎意料的是1.而不是大多數(shù)人剛開始認(rèn)為的2.
接下來我們?cè)谝徊讲椒治龀鲈诤瘮?shù)過程中對(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" }

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

如果還有些混亂的同學(xué),看看如果不通過函數(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://m.specialneedsforspecialkids.com/yun/106154.html

相關(guān)文章

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

    摘要:前言文章主要基于高級(jí)程序設(shè)計(jì)總結(jié)的基本重寫了全文補(bǔ)充知識(shí)點(diǎn)新增實(shí)例優(yōu)化排版新增檢測(cè)方法技巧用法構(gòu)造函數(shù)創(chuàng)建一個(gè)用護(hù)定義的對(duì)象類型的實(shí)例或具有構(gòu)造函數(shù)的內(nèi)置對(duì)象類型之一命令執(zhí)行構(gòu)造函數(shù)返回一個(gè)實(shí)例對(duì)象構(gòu)造函數(shù)一個(gè)指定對(duì)象實(shí)例的類型的函數(shù)傳慘一 前言 文章主要基于>總結(jié)的!!!PS: 2018/05/09 基本重寫了全文,補(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)訪問的所有變量和函數(shù)的有序訪問。作用域鏈的前端,始終都是當(dāng)前執(zhí)行的代碼所在環(huán)境的變量對(duì)象。對(duì)語句來說,會(huì)將指定的對(duì)象添加到作用域鏈中。 前言 ps: 2018/05/13 經(jīng)指正之后發(fā)現(xiàn)惰性加載函數(shù)細(xì)節(jié)有問題,已改正在這里也補(bǔ)充一下,這些都是根據(jù)自己理解寫的例子,不一定說的都對(duì),有些只能查看不能運(yùn)行的要謹(jǐn)慎,因?yàn)槲铱赡苤皇菍⒎椒ㄋ悸穼懗鰜?沒有實(shí)際跑...

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

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

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

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

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

    摘要:在此,我們首先根據(jù)變量的作用域,將變量劃分為三級(jí),具體是全局變量局部變量和參數(shù)變量。 【摘要】本文是專為JavaScript入門者而總結(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元查看
<