摘要:變量有兩種不同的數(shù)據(jù)類型基本類型,引用類型。知識(shí)一基本類型值就是簡(jiǎn)單的數(shù)據(jù)段引用類型值保存的是對(duì)象的引用,不是實(shí)際的對(duì)象。
ECMAScirpt 變量有兩種不同的數(shù)據(jù)類型:基本類型,引用類型。
基本的數(shù)據(jù)類型有:undefined,boolean,number,string,null. 基本類型的訪問是按值訪問的,就是說你可以操作保存在變量中的實(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
摘要:前言文章主要基于高級(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è)...
摘要:作用域鏈的用途,是保證對(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í)際跑...
摘要:沒有瀏覽器測(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ǔ)掃盲貼(...
摘要:它們的區(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è)概念 》系列的第三篇文章,今天...
摘要:在此,我們首先根據(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á)式。 本篇文章的主...
閱讀 974·2023-04-26 02:49
閱讀 1185·2021-11-25 09:43
閱讀 2556·2021-11-18 10:02
閱讀 2932·2021-10-18 13:32
閱讀 1293·2019-08-30 13:54
閱讀 2091·2019-08-30 12:58
閱讀 3022·2019-08-29 14:06
閱讀 2165·2019-08-28 18:10