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

JavaScript中變量、指針和引用功能與操作示例

 更新時(shí)間:2018年08月04日 15:04:50   作者:夜色蕪染  
這篇文章主要介紹了JavaScript中變量、指針和引用功能與操作,結(jié)合實(shí)例形式分析了javascript變量、指針與引用的功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了JavaScript中變量、指針和引用功能與操作。分享給大家供大家參考,具體如下:

1、變量

我們可能產(chǎn)生這樣一個(gè)疑問:編程語言中的變量到底是什么意思呢?

事實(shí)上,當(dāng)我們定義了一個(gè)變量a時(shí),就是在存儲(chǔ)器中指定了一組存儲(chǔ)單元,并將這組存儲(chǔ)單元命名為a。變量a的值實(shí)際上描述的是這組存儲(chǔ)單元中存放的具體信息。

例如,在JS中

var a;
a=10;

第一個(gè)語句在存儲(chǔ)器中指定了一組存儲(chǔ)單元,并命名為a;

第二個(gè)語句在這組存儲(chǔ)單元中存儲(chǔ)了數(shù)字10。

變量a的值為10實(shí)際上是說存儲(chǔ)單元組a存儲(chǔ)的信息是10。

假使我們?cè)俅螌?duì)a進(jìn)行復(fù)制操作:

a="hello";

這樣a的值變成字符串”hello”。這很容易理解,我們將存儲(chǔ)單元組a中存儲(chǔ)的信息改為字符串”hello”,顯然原先的數(shù)字10將被覆蓋。

2、指針

假使我們?cè)诹硪粋€(gè)變量b中存儲(chǔ)變量a在存儲(chǔ)器的地址,會(huì)發(fā)生什么?

我們很容易想到,直接訪問b變量,得到的并不是變量a的值,而是變量a在存儲(chǔ)器中的地址,變量b便被稱為指針。

這樣一個(gè)問題產(chǎn)生了:如何通過變量b訪問到變量a的值呢?

在C語言中,常用的是用*,比如:

int c=10,b;
int *p;/*p是指向int類型的指針*/
p=&c;/* &c獲取變量c的地址,然后賦值給變量p,這樣p存儲(chǔ)的是變量c的地址,即p是指向c的指針*/
b=*p;/* *p訪問p指向的對(duì)象,然后將值賦值給b*/

在JS中,并沒有指針這種變量類型,但指針的應(yīng)用卻無處不在。比如:

var o1={b:1};
var o2={b:1};
o1===o2;//false
o1==o2;//false

這里o1和o2都是相同的對(duì)象,為什么不相等呢?這就需要深入理解JavaScript中的引用類型和指針。

首先,我們需要明白:

給o1和o2賦值,并不是o1地址中存儲(chǔ)對(duì)象{b:1},o2地址中也存儲(chǔ)對(duì)象{b:1}

其次,我們要明白實(shí)際發(fā)生的操作:

var o1={b:1}實(shí)現(xiàn)了在堆內(nèi)存中創(chuàng)建了一個(gè)對(duì)象{b:1},o1則存儲(chǔ)了該對(duì)象在堆內(nèi)存中的地址,即o1是一個(gè)指針,指向{b:1};

同理,var o2={b:1}也在堆內(nèi)存中創(chuàng)建了一個(gè)對(duì)象{b:1},o2存儲(chǔ)了該對(duì)象在堆內(nèi)存中的地址,即o2也是一個(gè)指針,指向{b:1};

并且,由于兩個(gè)相同的對(duì)象{b:1}是先后創(chuàng)建,在堆內(nèi)存中也不是存儲(chǔ)在相同的地址。

然后,我們還需要知道:

在JavaScript中,引用類型(對(duì)象、數(shù)組、正則、Date、函數(shù))的比較,實(shí)際上是比較指針是否指向存儲(chǔ)器中的同一段地址,只有指向同樣的地址才能相等。

顯然,o1這個(gè)指針指向堆內(nèi)存中創(chuàng)建的第一個(gè)對(duì)象{b:1};

o2指針則指向堆內(nèi)存中創(chuàng)建的第二個(gè)對(duì)象{b:1};

但兩個(gè)對(duì)象相對(duì)獨(dú)立,并不是同一個(gè)對(duì)象,故o1和o2并沒有指向同樣的堆內(nèi)存地址,故而并不相等。

我們?cè)倏闯R姷膽?yīng)用:

var o={a:1};
o.__proto__===Object.prototype;//true

對(duì)象o的構(gòu)造函數(shù)是Object,Object有一個(gè)prototype屬性,并且prototype是一個(gè)指針,他指向存儲(chǔ)器中的一個(gè)對(duì)象,此對(duì)象將會(huì)被由構(gòu)造函數(shù)創(chuàng)建的對(duì)象實(shí)例所共享。

作為Object的實(shí)例,o也有一個(gè)指針__proto__,它也指向Object的prototype屬性指向的對(duì)象。

這里的全等返回true,則清楚地表明了兩者指向同樣的堆內(nèi)存地址,即指向的是同一個(gè)對(duì)象。

我們?nèi)绻胫鲃?dòng)讓兩個(gè)引用類型指向同樣的對(duì)象,如何操作呢?

var obj1={b:1};
var obj2=obj1;
obj1===obj2;//true
obj1==obj2;//true

可以看到,對(duì)于引用類型,直接使用'='賦值實(shí)際上就是使兩者指向同一個(gè)對(duì)象。
故而,我們猜測(cè),如果通過obj1修改了對(duì)象的值,obj2再次訪問時(shí)將看到修改后的對(duì)象:

obj1.name='ls';
obj1;//{b: 1, name: "ls"}
obj2;//{b: 1, name: "ls"}

的確如此。作為對(duì)比:

o1.name='ls';
o1;//{b: 1, name: "ls"}
o2;//{b: 1}

那么,對(duì)于基本類型呢?

var s1=1;
var s2=2;
s1===s2;//true

在JS中,對(duì)于基本類型,只需其值相等,則兩個(gè)變量就相等。

3、引用

首先,我們要深入理解引用類型的值。

前面我們看到,obj1和obj2指向堆內(nèi)存中存儲(chǔ)的同一個(gè)對(duì)象。當(dāng)我們?cè)L問obj1和obj2時(shí),都會(huì)返回同一個(gè)對(duì)象??梢哉f:obj1的值和obj2的值相同。

對(duì)于o1和o2,他們指向堆內(nèi)存中不同地址的兩個(gè){b:1}對(duì)象,o1和o2擁有不同的值。

因此,對(duì)于引用類型,我們所說的值,指的是保存在內(nèi)存中的對(duì)象。如果是同一對(duì)象,則值相同,不同對(duì)象則值不同。

在JS中,傳遞參數(shù)都是按值傳遞的。比如:

var a1=1,b1=2;
function add(a,b){
  a++;
  b--;
  return a+b;
};
add(a1,b1);//3
a1;//1
b1;//2

這里,函數(shù)add中的形參a、b分別得到變量a1、b1的值的拷貝,這便是按值傳遞。

在add函數(shù)執(zhí)行環(huán)境中對(duì)a、b操作不會(huì)影響到全局變量a1、b1。

再看引用類型:

function setName(obj){
   obj.name="Nicholas";
   obj=new Object();
   obj.name="Greg";
}
var person=new Object();
setName(person);
alert(person.name);//"Nicholas"

執(zhí)行setName(person)時(shí),person指向的內(nèi)存中的地址便被傳入obj,使得obj也指向同樣的內(nèi)存地址,即同一個(gè)對(duì)象。這里的按值傳遞,傳遞的是內(nèi)存地址。

如果通過obj修改該對(duì)象,外部訪問person便也能體現(xiàn)出來。

我們可能有一個(gè)疑問,既然是指向同一個(gè)對(duì)象,為什么不是按引用傳遞呢?

首先,我們看到函數(shù)內(nèi)部對(duì)obj重新進(jìn)行了賦值,使得obj指向新創(chuàng)建的對(duì)象。如果是按引用傳遞,那么外部person便也會(huì)指向新創(chuàng)建的對(duì)象。實(shí)際上,person還是指向原先的對(duì)象。

對(duì)于引用類型的按值傳遞,其實(shí)可以更加通俗地理解:

1、實(shí)參將指向的內(nèi)存地址傳遞給形參 ,按值傳遞的值指的是內(nèi)存地址;
2、形參修改了它和實(shí)參共同指向的對(duì)象后,外部的實(shí)參會(huì)反映出來;
3、但形參始終無法修改實(shí)參指向的內(nèi)存地址,即如果將形參指向新的對(duì)象,實(shí)參并不會(huì)指向新的對(duì)象。

基于以上3點(diǎn),我們就不難理解上面代碼運(yùn)行的結(jié)果了。

更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript數(shù)組操作技巧總結(jié)》、《JavaScript事件相關(guān)操作與技巧大全》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript操作DOM技巧總結(jié)》及《JavaScript字符與字符串操作技巧總結(jié)

希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Mac地址驗(yàn)證的javascript代碼

    Mac地址驗(yàn)證的javascript代碼

    這篇文章介紹了Mac地址驗(yàn)證的javascript代碼,在路由器中,mac地址是用得比較多的
    2013-11-11
  • 使用JS實(shí)現(xiàn)圖片展示瀑布流效果的實(shí)例代碼

    使用JS實(shí)現(xiàn)圖片展示瀑布流效果的實(shí)例代碼

    下面小編就為大家?guī)硪黄褂肑S實(shí)現(xiàn)圖片展示瀑布流效果的實(shí)例代碼。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-09-09
  • 一文搞懂JavaScript中原型與原型鏈

    一文搞懂JavaScript中原型與原型鏈

    js中的原型與原型鏈應(yīng)該是老生常談的話題了,在前端面試中基本都是必問的一個(gè)問題,但是很多人還是稀里糊涂的,只知道其表層含義。本文將帶大家深入了解JavaScript中的原型與原型鏈,感興趣的可以學(xué)習(xí)一下
    2022-10-10
  • Vue3基于countUp.js實(shí)現(xiàn)數(shù)字滾動(dòng)的插件

    Vue3基于countUp.js實(shí)現(xiàn)數(shù)字滾動(dòng)的插件

    本文主要介紹了Vue3基于countUp.js實(shí)現(xiàn)數(shù)字滾動(dòng)的插件,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • JS讀取cookies信息(記錄用戶名)

    JS讀取cookies信息(記錄用戶名)

    很多網(wǎng)站、博客把網(wǎng)頁生成html靜態(tài)頁面了,以利于搜索引擎的索引排名,減輕服務(wù)器負(fù)擔(dān)。靜態(tài)頁面由于其穩(wěn)定快速更快,給用戶及站長(zhǎng)帶來了方便。但評(píng)論后如何記住用戶的信息呢
    2012-01-01
  • 基于JavaScript實(shí)現(xiàn)復(fù)選框的全選和取消全選

    基于JavaScript實(shí)現(xiàn)復(fù)選框的全選和取消全選

    這篇文章主要為大家詳細(xì)介紹了基于JavaScript實(shí)現(xiàn)復(fù)選框的全選和取消全選,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • 使用JS監(jiān)聽鍵盤按下事件(keydown event)

    使用JS監(jiān)聽鍵盤按下事件(keydown event)

    這篇文章主要介紹了使用JS監(jiān)聽鍵盤按下事件(keydown event),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • JS簡(jiǎn)單獲取當(dāng)前年月日星期的方法示例

    JS簡(jiǎn)單獲取當(dāng)前年月日星期的方法示例

    這篇文章主要介紹了JS簡(jiǎn)單獲取當(dāng)前年月日星期的方法,結(jié)合完整實(shí)例形式分析了javascript基于自定義函數(shù)獲取當(dāng)前日期時(shí)間的方法,涉及javascript中Date()類的使用與日期相關(guān)運(yùn)算技巧,需要的朋友可以參考下
    2017-02-02
  • 百度地圖自定義控件分享

    百度地圖自定義控件分享

    本文給大家介紹的是如何使用百度地圖的自定義控件,附上示例,分享給大家,小伙伴們根據(jù)自己的需求稍微改動(dòng)下即可使用。
    2015-03-03
  • JS檢測(cè)數(shù)組類型的方法小結(jié)

    JS檢測(cè)數(shù)組類型的方法小結(jié)

    這篇文章主要介紹了js檢測(cè)數(shù)組類型的方法小結(jié),有instanceof方法Array.isArray() 方法和Object.prototype.toString.call()方法,都是比較常用的,需要的朋友可以參考下
    2017-03-03

最新評(píng)論