首頁 web前端 js教程 JavaScript資料型別之基本型別與引用型別的值_基礎知識

JavaScript資料型別之基本型別與引用型別的值_基礎知識

May 16, 2016 pm 04:06 PM
javascript 基本類型 引用類型 資料類型

ECMAScript變數包含兩種不同資料型別的值:基本型別值和引用型別值。基本型別值是簡單的資料段,而引用型別值指那些可能由多個值構成的物件。

在將一個值賦給變數時,解析器必須確定這個值是基本型別還是引用型別。基本類型包括如Undefined、Null、Boolean、Number和String,這5種基本類型資料類型是按值存取的,因此可以操作保存在變數中的實際的值;引用類型類型的值是保存在記憶體中的對象。與其他語言不同,JavaScript不允許直接存取記憶體中的位置,也就是說不能直接操作物件的記憶體空間。在操作對象時,實際上實在操作對象的引用而不是實際的對象,因此,引用類型的值是按引用訪問的。

1、動態的屬性
    定義基本型別和定義引用型別的方法大相近庭。對於引用類型的值,我們可以為其新增屬性和方法,也可以改變和刪除其屬性和方法,如下:

複製程式碼 程式碼如下:

var person = new Object();
person.name = "zxj";
alert(person.name); //"zxj"    

2、複製變數值

如果從一個變數複製基本型別的值,會在變數物件上建立一個新值,然後將該值複製到為新變數指派的位置。

複製程式碼 程式碼如下:

var num1 = 5;
var num2 = num1; //5

 當從一個變數複製引用型別的值到另一個變數時,同樣也會將儲存在變數物件中的值複製一份放到為新變數分配的記憶體空間。不同的是,這個值其實是一個指針,而這個指針執行儲存在堆中的一個物件。複製結束後,兩個變數實際上將引用同一個物件。因此,改變其中一個變量,就會影響到另一個變量,如下所示:

複製程式碼 程式碼如下:

var obj1 = new Object();
var obj2 = obj1;
obj1.name = "zxj";
alert(obj2.name); //"zxj"

3、傳遞參數

ESMAScript中所有函數的參數都是以值傳遞的。也就是說,把函數外部的值複製給函數內部的參數,就是把值從一個變數複製到另一個變數一樣。基本類型值的傳遞如同基本類型變數的複製。引用類型值的傳遞,則如同引用類型變數的複製一樣。有不少開發者在這一點上可能感到困惑,因為訪問變數有按值和按引用兩種方式,而參數只能按值傳遞。

在傳遞基本型別的值給參數時,被傳遞的值會被複製給一個局部變數(即命名參數)。如下程式碼所示:

複製程式碼 程式碼如下:

function addTen(num) {
    num = 10;
    return num;
}
var count = 20;
var result = addTen(count);
alert(count); // 20,沒有變化
alert(result); // 30

參數實際上是函數的局部變數。參數num和變數count互不認識,它們只是具有相同的值。假如num是按引用傳遞的,那麼變數count的值也會變成30,進而反映函數內部的變化。

在傳遞參考類型的值給參數時,會把這個值在記憶體中的位址複製一個給局部變量,因此這個局部變數的變​​化會反映在函數的外部。這裡我們使用引用型來看看:

複製程式碼 程式碼如下:

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

在這個函數內部,obj和person引用的是同一個物件。換句話說,即使這個物件是按值傳遞的,obj也會按引用來存取同一個物件。於是,當函數內部為obj添加name屬性後,函數外部的person也會有所反映,因為person指向的物件在堆記憶體中只有一個,而且是全域物件。很多開發者錯誤的認為:在局部作用域中修改的物件會在全域作用域中反映出來,就表示參數是按引用傳遞的。為了證明物件是按值傳遞的,我們在看看下面這個進過修改的例子:

複製程式碼 程式碼如下:

function setName(obj) {
    obj.name = "zxj";
    obj = new Object();
    obj.name = "sdf";
}
var person = new Object();
setName(person);
alert(person.name);

上面這個例子可以看出,如過person是按引用傳遞的,那麼person就會自動被修改為指向其name屬性值為"sdf"的新物件。但是,接下來再造訪person.name時,顯示的仍然是"zxj"。這說明即使在函數內部修改了參數的值,但原始的參考仍然保存不變。實際上,當在函數內部重寫obj時,這個變數引用的就是一個局部物件了。而這個局部物件會在函數執行完畢時立即銷毀。

可以將ECMAScript函數的參數想像成局部變數。

4、偵測類型

    雖然在偵測基本資料型別時typeof是個得力助手,但是在偵測引用型別時,這個運算子用處卻不大。通常,我們並不想知道某個值是對象,而是想知道他是什麼類型的對象。為此ECMAScript提供了instanceof操作符,其語法如下:

複製程式碼 程式碼如下:

result = varible instanceof constructor

    如果變數是給定參考類型的實例,那麼instanceof運算子會回傳true:
複製程式碼 程式碼如下:

alert(person instanceof Object);
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

MySQL資料庫中性別欄位應該使用什麼資料類型? MySQL資料庫中性別欄位應該使用什麼資料類型? Mar 14, 2024 pm 01:21 PM

在MySQL資料庫中,性別欄位通常可以使用ENUM類型來儲存。 ENUM是一種枚舉類型,它允許我們在一組預先定義的值中選擇一個作為欄位的值。在表示性別這樣一個固定且有限的選項時,ENUM是一個很好的選擇。讓我們來看一個具體的程式碼範例:假設我們有一個名為"users"的表,其中包含了使用者的信息,包括性別。現在我們要為性別創建一個字段,我們可以這樣設計表結構:CRE

泛型函數在Golang中如何處理指標和引用型別? 泛型函數在Golang中如何處理指標和引用型別? Apr 16, 2024 pm 04:06 PM

泛型函數在Go中處理指標型別時,會收到原始變數的引用,允許修改變數值。引用類型則在傳遞時會被複製,使函數無法修改原始變數值。實戰案例包括使用泛型函數比較字串或數字切片。

MySQL中最適合用於性別欄位的資料類型是什麼? MySQL中最適合用於性別欄位的資料類型是什麼? Mar 15, 2024 am 10:24 AM

在MySQL中,最適合用於性別欄位的資料類型是ENUM枚舉類型。 ENUM枚舉類型是一種允許定義一組可能取值的資料類型,性別欄位適合使用ENUM類型是因為性別通常只有兩個取值,即男性和女性。接下來,我將透過具體的程式碼範例來展示如何在MySQL中建立一個性別欄位並使用ENUM枚舉類型儲存性別資訊。以下是操作步驟:首先,在MySQL中建立一個名為users的表格,包括

Python 語法的心智圖:深入理解程式碼結構 Python 語法的心智圖:深入理解程式碼結構 Feb 21, 2024 am 09:00 AM

python憑藉其簡單易讀的語法,廣泛應用於廣泛的領域。掌握Python語法的基礎架構至關重要,既可以提高程式效率,又能深入理解程式碼的運作方式。為此,本文提供了一個全面的心智圖,詳細闡述了Python語法的各個面向。變數和資料類型變數是Python中用於儲存資料的容器。心智圖展示了常見的Python資料類型,包括整數、浮點數、字串、布林值和列表。每個資料類型都有其自身的特性和操作方法。運算符運算符用於對資料類型執行各種操作。心智圖涵蓋了Python中的不同運算子類型,例如算術運算子、比

MySQL中布林類型的使用方法詳解 MySQL中布林類型的使用方法詳解 Mar 15, 2024 am 11:45 AM

MySQL中布林類型的使用方法詳解MySQL是一種常用的關聯式資料庫管理系統,在實際應用中經常需要使用布林類型來表示邏輯上的真假值。 MySQL中布林類型有兩種表示法:TINYINT(1)和BOOL。本文將詳細介紹MySQL中布林類型的使用方法,包括布林類型的定義、賦值、查詢和修改等操作,同時結合具體的程式碼範例進行說明。 1.布林類型的定義在MySQL中,可

什麼是MD5哈希值? 什麼是MD5哈希值? Feb 18, 2024 pm 08:50 PM

MD5值是什麼?在電腦科學中,MD5(MessageDigestAlgorithm5)是一種常用的雜湊函數,用於對訊息進行摘要或加密。它產生一個固定長度的128位二進位數字,通常以32位的十六進位表示。 MD5演算法由RonaldRivest於1991年設計。儘管在密碼學領域中,MD5演算法被認為不再安全,但它仍廣泛應用於資料完整性驗證和檔案校驗等方

MySQL中性別欄位最佳資料類型選擇是什麼? MySQL中性別欄位最佳資料類型選擇是什麼? Mar 14, 2024 pm 01:24 PM

在設計資料庫表時,選擇合適的資料類型對於效能最佳化和資料儲存效率非常重要。在MySQL資料庫中,儲存性別欄位的資料類型真是沒有所謂的最佳選擇,因為性別欄位一般只有兩個取值:男或女。但是為了效率和節省空間,我們可以選擇合適的資料類型來儲存性別欄位。在MySQL中,儲存性別欄位最常用的資料類型是枚舉類型。枚舉類型是一種能夠把欄位的值限定在一個有限的集合內的資料型別

C語言的基本語法和資料類型介紹 C語言的基本語法和資料類型介紹 Mar 18, 2024 pm 04:03 PM

C語言是一種廣泛使用的電腦程式語言,具有高效、靈活和強大的特點。要熟練使用C語言進行編程,首先需要了解其基本語法和資料類型。本文將介紹C語言的基本語法和資料類型,並舉例說明。一、基本語法1.1註解在C語言中,可以使用註解來對程式碼進行說明,以便於理解和維護。註解可以分為單行註解和多行註解。 //這是單行註解/*這是多行註解*/1.2關鍵字C語

See all articles