中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-10-13 08:23:21 來源:腳本之家 閱讀:578 作者:夜色蕪染 欄目:web開發

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

1、變量

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

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

例如,在JS中

var a;
a=10;

第一個語句在存儲器中指定了一組存儲單元,并命名為a;

第二個語句在這組存儲單元中存儲了數字10。

變量a的值為10實際上是說存儲單元組a存儲的信息是10。

假使我們再次對a進行復制操作:

a="hello";

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

2、指針

假使我們在另一個變量b中存儲變量a在存儲器的地址,會發生什么?

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

這樣一個問題產生了:如何通過變量b訪問到變量a的值呢?

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

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

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

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

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

首先,我們需要明白:

給o1和o2賦值,并不是o1地址中存儲對象{b:1},o2地址中也存儲對象{b:1}

其次,我們要明白實際發生的操作:

var o1={b:1}實現了在堆內存中創建了一個對象{b:1},o1則存儲了該對象在堆內存中的地址,即o1是一個指針,指向{b:1};

同理,var o2={b:1}也在堆內存中創建了一個對象{b:1},o2存儲了該對象在堆內存中的地址,即o2也是一個指針,指向{b:1};

并且,由于兩個相同的對象{b:1}是先后創建,在堆內存中也不是存儲在相同的地址。

然后,我們還需要知道:

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

顯然,o1這個指針指向堆內存中創建的第一個對象{b:1};

o2指針則指向堆內存中創建的第二個對象{b:1};

但兩個對象相對獨立,并不是同一個對象,故o1和o2并沒有指向同樣的堆內存地址,故而并不相等。

我們再看常見的應用:

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

對象o的構造函數是Object,Object有一個prototype屬性,并且prototype是一個指針,他指向存儲器中的一個對象,此對象將會被由構造函數創建的對象實例所共享。

作為Object的實例,o也有一個指針__proto__,它也指向Object的prototype屬性指向的對象。

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

我們如果想主動讓兩個引用類型指向同樣的對象,如何操作呢?

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

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

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

的確如此。作為對比:

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

那么,對于基本類型呢?

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

在JS中,對于基本類型,只需其值相等,則兩個變量就相等。

3、引用

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

前面我們看到,obj1和obj2指向堆內存中存儲的同一個對象。當我們訪問obj1和obj2時,都會返回同一個對象。可以說:obj1的值和obj2的值相同。

對于o1和o2,他們指向堆內存中不同地址的兩個{b:1}對象,o1和o2擁有不同的值。

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

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

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

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

在add函數執行環境中對a、b操作不會影響到全局變量a1、b1。

再看引用類型:

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

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

如果通過obj修改該對象,外部訪問person便也能體現出來。

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

首先,我們看到函數內部對obj重新進行了賦值,使得obj指向新創建的對象。如果是按引用傳遞,那么外部person便也會指向新創建的對象。實際上,person還是指向原先的對象。

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

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

基于以上3點,我們就不難理解上面代碼運行的結果了。

更多關于JavaScript相關內容感興趣的讀者可查看本站專題:《JavaScript數組操作技巧總結》、《JavaScript事件相關操作與技巧大全》、《JavaScript數據結構與算法技巧總結》、《JavaScript操作DOM技巧總結》及《JavaScript字符與字符串操作技巧總結》

希望本文所述對大家JavaScript程序設計有所幫助。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

军事| 开远市| 阿巴嘎旗| 即墨市| 衡水市| 中西区| 兰西县| 芦山县| 哈巴河县| 英山县| 蓝田县| 青岛市| 阳东县| 迭部县| 神池县| 崇明县| 宁阳县| 无棣县| 济阳县| 连城县| 松阳县| 浙江省| 金寨县| 左云县| 斗六市| 平罗县| 永川市| 临清市| 前郭尔| 新蔡县| 金山区| 屏山县| 砀山县| 修文县| 海宁市| 安龙县| 芮城县| 浠水县| 邯郸市| 阳东县| 兰西县|