最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript數(shù)據操作_淺談原始值和引用值的操作本質

 更新時間:2016年08月23日 10:51:44   投稿:jingxian  
下面小編就為大家?guī)硪黄狫avaScript數(shù)據操作_淺談原始值和引用值的操作本質。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

我的一句話總結:原始值不管是變量賦值還是函數(shù)傳遞都不會改變原值,引用值不管是變量賦值還是函數(shù)傳遞,如果新變量重新賦值,則不會影響原引用值,如新變量是直接操作,就會影響原引用值。

首先明確,值和類型是兩個不同的概念。例如,null是null類型的唯一值、undefined是undefined類型的唯一值、而true和false是boolean類型僅有的兩個值等。在任何語言中,值的操作都可以歸納為以下3個方面。

復制值:即把值賦值給新變量,或者通過變量把值賦值給另一個變量、屬性或數(shù)組元素。

傳遞值:即把值作為參數(shù)傳遞給函數(shù)或方法。

比較值:即把值與另一個值進行比較,看是否相等。

由于值類型數(shù)據和引用型數(shù)據的值存在形式不同,自然操作它們的方法和所產生的結果也是不同的。注意,當值為值類型數(shù)據時,我們常稱之為原始值或基本值;當值為引用型數(shù)據時,我們常稱之為引用值或復合值。

1.使用原始值

對于原始值來說,其操作的3個層面說明如下。

1)復制值

在賦值語句中,操作的過程將會產生一個實際值的副本,副本的值和實際值之間沒有任何聯(lián)系,它們獨自位于不同的棧區(qū)或者堆區(qū)。這個副本可以存儲變量、對象的屬性和數(shù)組的元素。例如:

var n = 123, a, b = [], c = {}; 
a = n;         // 復制數(shù)字123 
b[0] = n;        // 復制數(shù)字123 
c.x = n;        // 復制數(shù)字123 
(a == b[0]) && (a == c.x) && (b[0] == c.x) && alert("復制的值都是相等的");  // 檢測它們的值都是相等的 

在上面示例中,分別把值123復制3份給變量a、數(shù)組b和對象c,雖然它們的值是相等的,但是它們之間是相互獨立的。

2)傳遞值

當把值傳遞給函數(shù)或方法時,傳遞的值僅是副本,而不是值本身。例如,如果在函數(shù)中修改傳遞進來的值時,結果只能夠影響這個參數(shù)值的副本,并不會影響到原來的值。

var a = 123;    // 原來的值 

function f(x){ 
  x = x + x; 
} 
f(a);      // 調用函數(shù)修改傳遞的值 

alert(a);   // 查看變量a的值是否受影響,返回值為123,說明沒有變化

3)比較值

在上面的示例中我們也可以看到,當對原始值進行比較時,進行逐字節(jié)的比較來判斷它們是否相等。比較的是值本身,而不是值所處的位置,固然比較的結果可能會相等,但只是說明它們所包含的字節(jié)信息是相同的。

2.使用引用值

對于引用值來說,其操作的3個層面說明如下。

1)復制值

在賦值語句中,所賦的值是對原值的引用,而不是原值副本,更不是原值本身。也就是說,進行賦值之后,變量保存的都是對原值的引用(即原值的存儲地址)。當在多個變量、數(shù)組元素或對象屬性中間復制時,它們都會與原始變量保存的引用相同。

所有引用具有相同的效力和功能,都可以執(zhí)行操作,如果通過其中的一個引用編輯數(shù)據,這種修改將會在原值及其他相關引用中體現(xiàn)出來。例如:

var a = [1,2,3];  // 賦值數(shù)組引用 
b = a;         // 復制值 
b[0] = 4;      // 修改變量b中第一個元素的值 
alert(a[0]);     // 返回4,顯示變量a中第一個元素的值也被修改為4 

但是,如果給變量b重新賦予新值,則新值不會影響原值內容。例如:

var a = [1,2,3];  // 賦值數(shù)組引用 
b = a;         // 復制值 
b = 4;         // 為變量b重寫賦值 
alert(a[0]);     // 變量a的內容保持不變 

重復賦值實際上是覆蓋變量對原值的引用,變?yōu)榱硪粋€值的副本或對其引用。所以不會對原值產生影響,演示示意圖如圖4-2所示。

  

2)傳遞值

當使用引用將數(shù)據傳遞給函數(shù)時,傳遞給函數(shù)的也是對原值的一個引用,函數(shù)可以使用這個引用來修改原值本身,任何修改在函數(shù)外部都是可見的。例如:

var a = [1,2,3]; 
function f(x){ 
  x[0] = 4;   // 在函數(shù)中修改參數(shù)值 
} 
f(a);       // 傳遞引用值 
alert(a[0]);    // 返回4,原值發(fā)生變化 

請注意,在函數(shù)內修改的是對外部對象或數(shù)組的引用,而不是對象或數(shù)組本身的值。在函數(shù)內可以使用引用來修改對象的屬性或數(shù)組的元素,但是如果在函數(shù)內部使用一個新的引用覆蓋原來的引用,那么在函數(shù)內部的修改就不會影響原引用的值,函數(shù)外部也是看不到的。

var a = [1,2,3]; 
function f(x){ 
  x = 4;    // 在函數(shù)中修改參數(shù)值 
} 
f(a);       // 傳遞引用值 
alert(a[0]);    // 返回1,原值不會發(fā)生變化 

3)比較值

當比較兩個引用值時,比較的是兩個引用地址,看它們引用的原值是否為同一個副本,而不是比較它們的原值字節(jié)是否相等。當對兩個不同值進行引用時,盡管它們具有相同的字節(jié)構成,但是這兩個引用的值卻是不相等的。

var a = new Number(1);  // 引用值a 
var b = new Number(1);  // 引用值b 
var c = a;        // 把a的引用賦值給c 
alert(a==b);       // 返回false 
alert(a==c);       // 返回true 

所以,{} == {},[] == [],都返回false。因為引用地址不同。

總之,對于任何語言來說,使用值和使用引用都是數(shù)據操作的兩種基本方法。當我們操作數(shù)據時,要采用什么方法來進行處理,主要看數(shù)據的類型。值類型和引用型數(shù)據參與運算的方式不同,值類型數(shù)據通過使用值來操作數(shù)據,而引用型數(shù)據使用引用來操作數(shù)據。運算方式的不同,自然所產生的結果也不同。我們不妨再看一個示例:

var s = "abc";         // 字符串,值類型數(shù)據 
var o = new String(s);     // 字符串對象,被裝箱后的字符串 


function f(v){         // 運算函數(shù) 
  v.toString = function(){  // 修改參數(shù)的方法toString() 
    return 123; 
  }; 
} 

f(s);    // 傳入值 
alert(s);  // 返回字符串"abc",說明運算沒有對原數(shù)據造成影響 
f(o);    // 傳入引用 
alert(o);  // 返回數(shù)值123,說明運算已經影響到原數(shù)據的內部結構

值類型是以實際值參與運算的,因此與原數(shù)據沒有直接聯(lián)系。而引用型以引用地址參與運算,計算的結果會影響到引用地址所關聯(lián)的堆區(qū)數(shù)據塊。但是,有一點例外,對于JavaScript的字符串來說,它的操作方法就比較復雜,詳情請google!

以上這篇JavaScript數(shù)據操作_淺談原始值和引用值的操作本質就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • innerText和innerHTML 一些問題分析

    innerText和innerHTML 一些問題分析

    盡管DOM帶來了動態(tài)修改文檔的能力,但對開發(fā)人員來說,這還不夠。IE4.0為所有的元素引入了兩個特性,以更方便的進行文檔操作,這兩個特性是innerText和innerHTML。
    2009-05-05
  • 收藏一個代碼

    收藏一個代碼

    收藏一個代碼...
    2006-08-08
  • 微信小程序 騰訊地圖顯示偏差問題解決

    微信小程序 騰訊地圖顯示偏差問題解決

    這篇文章主要介紹了微信小程序 騰訊地圖顯示偏差問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • 使用javascript實現(xiàn)一個在線RGB顏色轉換器

    使用javascript實現(xiàn)一個在線RGB顏色轉換器

    目前已經有很多網頁版在線小工具,之前很多窗體化的工具也逐漸網頁化,比如:PS畫圖軟件,也都能直接網頁化進行設計,由于自己實際項目經常會用到顏色轉換,所以直接自己開發(fā)個簡單版的在線顏色轉換小工具,需要的朋友可以參考下
    2024-01-01
  • JS中artdialog彈出框控件之提交表單思路詳解

    JS中artdialog彈出框控件之提交表單思路詳解

    artDialog是一個基于javascript編寫的對話框組件,它擁有精致的界面與友好的接口。本文給大家介紹JS中artdialog彈出框控件之提交表單思路詳解,對本文感興趣的朋友一起學習吧
    2016-04-04
  • JS+Vue實現(xiàn)三級全選單選

    JS+Vue實現(xiàn)三級全選單選

    這篇文章主要為大家詳細介紹了JS+Vue實現(xiàn)三級全選單選,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • js Function類型

    js Function類型

    函數(shù)就是對象,而函數(shù)名是指向函數(shù)對象的指針,不會與某個函數(shù)綁定
    2011-12-12
  • 淺談javascript控制HTML5的全屏操控,瀏覽器兼容的問題

    淺談javascript控制HTML5的全屏操控,瀏覽器兼容的問題

    下面小編就為大家?guī)硪黄獪\談javascript控制HTML5的全屏操控,瀏覽器兼容的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • 微信小程序防止重復點擊按鈕的示例代碼

    微信小程序防止重復點擊按鈕的示例代碼

    這篇文章主要介紹了微信小程序防止重復點擊按鈕的示例代碼,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-10-10
  • Webpack按需加載打包chunk命名的方法

    Webpack按需加載打包chunk命名的方法

    這篇文章主要給大家介紹了關于Webpack按需加載打包chunk命名的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Webpack具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-09-09

最新評論

富阳市| 内丘县| 五大连池市| 峡江县| 策勒县| 阿拉善右旗| 德化县| 衡水市| 华坪县| 稷山县| 孝感市| 乌兰浩特市| 广元市| 永定县| 鲁山县| 闸北区| 鄄城县| 安丘市| 宣汉县| 高碑店市| 龙山县| 博客| 图片| 沾化县| 资阳市| 台南县| 神农架林区| 和田县| 鄂温| 思南县| 通海县| 通城县| 东港市| 五台县| 潢川县| 巴林右旗| 眉山市| 永州市| 梅河口市| 岳普湖县| 武威市|