淺析JavaScript基本型別與引用型別_基礎知識
對於JavaScript 類型,可以簡單地概括為:相對於強類型語言來說,它是弱(鬆散)類型的語言;有基本類型和引用類型,他們是區別是一個有固定空間存在於棧內存中,一個沒有固定空間保存在堆疊記憶體中並且在堆疊記憶體中保存了一個指向實現位置的指標。
市面上很多書都有不小的篇幅在講。這篇文章會講幾個方面,這些方面可能需要你對 JavaScript 已經有了一些簡單的了解,特別是 JavaScript 的型別。如果還不一解,可以隨手拿起一本關於 JavaScript 的書翻翻,再來看這篇文章。
一、基本型別與引用型別
1.基本型別:Undefined / Null / Boolean / Number / String
2.引用型別:Object / Array / Function / Date / RegExp / Error / Map / Set …
為什麼引用型別沒有列舉呢,因為這裡面你了解這麼多就夠了,至少在我講的這篇中這些已經足夠。其他的可能很少會用到,甚至像 Map 、Set 這樣的也不是所有瀏覽器都支援。
二、JavaScript 類型的判斷
在 JavaScript 有兩個 operator 可以用以判斷型別。他們是 typeof 和 instanceof,不過圈子很小,它們混的可不是那麼好,是出了名的不靠譜。少數情況也是對的,很多情況下是不太可靠的。看看就知道了:
// 可靠的時候:
// 可靠的時候:
type ' sofish' // string
new String('sofish') instanceof String // true
// 不可靠的時候:
typeof [] // object
程式碼如下:
/* 偵測物件類型
* @param: obj {JavaScript Object}
* @param: type {String} 以大寫開頭的JS 型別名稱
* @return: {Boolean}
*/
* @return: {Boolean}
return Object.prototype.toString.call(obj).slice(8, -1) === type;
}
程式碼如下:
is('sofish', 'String' ) // trueis(null, 'Null') // trueis(new Set(), 'Set') // true
程式碼如下:
1 '2' // '12'
複製程式碼
四、JavaScript 引用型別
這一點是本文的一個困難點。相於基本型,引用可以為其添加屬性和方法;引用類似的值是一個引用,把一個引用類型的值賦給一個變量,他們所指向的是同一存儲在堆內存中的值。變數(屬性)可以重載,但複製會是一件很有趣的事情,後面我們會詳細來說。
1. 新增屬性與方法
下面的程式碼我們將會看到,假設我們對一個基本類似賦值,它並不會報錯,但在獲取的時候卻是失效的:
var arr = [1,2,3];
arr.hello = 'world';
console .log(arr.hello); // 'world'
var str = 'sofish';
str.hello = 'world';
console.log(str.hello); // undefined
2. 引用型別值的運算
由於引用類型儲存在堆疊記憶體中的是一個引用,那麼當我們指向的同一個原始的值,對值的操作將會影響所有引用;這裡有一個例是,重新賦值(並非對值的直接操作)會重新建立一個對象,並不會改變原始值。例如:
var arr = [1,2,33] , sofish = arr;
sofish.push('hello world');
console.log(arr); // [1, 2, 3, 'hello world']
// 非相同類型
sofish = ['not a fish']; // 當sofish 類似改變時,不會改變原始值
console.log(arr);// [1, 2 , 3, 'hello world']
3. 引用型別值的複製
對原始值的操作會影響所有引用,而這不一定是我們想要的,有時候我們需要複製一個全新的對象,操作的時候不會影響其他引用。而一般情況也,像是 Date / Function / RegExp … 都很少有具體的操作,主要是像 Array 和 Object 會有新增項目、屬性等操作。所以我們主要需要理解的是如何複製 Array 和 Object 物件。
3.1 陣列的複製
在 Array 物件中,存在 slice 方法傳回一個截取的數組,在 ES5 中 filter 等也傳回一個新的數組,那麼我們可能會利用這個方法來複製。
var arr = [1, 2, 3]; 🎜>var sofish = arr.slice();
// 對新的陣列進行操作並不會影響到原始陣列
sofish.push('hello world');
console.log(arr); // [1, 2, 3]
3.2 物件的複製 在 Array 的複製中我們使用的是 slice 方法,實際上對於 Array 和 Object 中都可以利用 for ... in 迴圈來進行遍歷並賦值來進行複製。
var obj = { name: '>for (p in obj) sofish[p] = obj[p];
// 對新的物件操作並不會影響原始值
sofish.say = function() {};
3.3 Shadow / Deep Copy
像上面的操作,就是我們常說的淺拷貝(Shadow Copy)。不過在 Array 和 Object 都可以有多層(維),像這樣的拷貝只考慮到最上面一層的值,在可能存在的值中的 Array 和 Object 都還是指向了原始物件。例如:
var arr = [1, { 🎜>
var arr = [1, { 9. ' not a fish' } ], sofish = [], p;for(p in arr) {
sofish[p] = arr[p];
}
sofish[1].bio = 'hackable';
console.log(arr);// [1 , cat: { bio: 'hackable' } ] 程式碼如下:
/* 複製物件
* @param: obj {JavaScript Object} 原始物件
* @param: isDeep {Boolean} 是否為深拷貝
{Java* @return:回傳一個新的物件
*/
function copy(obj, isDeep) {
var ret = obj.slice ? [] : {}, p, prop;
// 配合is 函數使用
if(!isDeep && is(obj, 'Array')) return obj.slice();
for(p in obj) {
if(!obj.hasOwnProperty(p)) continue;
prop = obj[p];
ret[p] = (is(prop, 'Object') || is(prop, 'Array')) ?
p.
}
return ret;
}
這樣,我們就可以透過copy(obj, isDeep) 函數來複製一個Array 或Object 。可以測試一下:
var arr = [1, {bio : 'not a fish'}];
var sofish = copy(arr);
// 淺拷貝對於第一層的操作不影響原始值,但影響第二層
sofish.push('cat');
console.log(arr); // [1, {bio: 'not a fish'}]
sofish[1].bio = 'hello world';
console.log(arr) // [1, {bio: 'hello world'}]
// 深拷貝則不會影響原始值
sofish = copy(arr, 1);
sofish[1].bio = 'foo or bar';
console.log(arr) ; // [1, {bio: 'hello world'}]
到此。你基本上要了解的關於類型的比較難的點,應該是都基本了解了。當然,複製是最麻煩的一個點,除了經常需要操作的 Array 和 Object 來說,還有 Date / Function / RegExp 的複製。

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

如何使用WebSocket和JavaScript實現線上語音辨識系統引言:隨著科技的不斷發展,語音辨識技術已成為了人工智慧領域的重要組成部分。而基於WebSocket和JavaScript實現的線上語音辨識系統,具備了低延遲、即時性和跨平台的特點,成為了廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現線上語音辨識系

如何利用JavaScript和WebSocket實現即時線上點餐系統介紹:隨著網路的普及和技術的進步,越來越多的餐廳開始提供線上點餐服務。為了實現即時線上點餐系統,我們可以利用JavaScript和WebSocket技術。 WebSocket是一種基於TCP協定的全雙工通訊協議,可實現客戶端與伺服器的即時雙向通訊。在即時線上點餐系統中,當使用者選擇菜餚並下訂單

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

如何使用WebSocket和JavaScript實現線上預約系統在當今數位化的時代,越來越多的業務和服務都需要提供線上預約功能。而實現一個高效、即時的線上預約系統是至關重要的。本文將介紹如何使用WebSocket和JavaScript來實作一個線上預約系統,並提供具體的程式碼範例。一、什麼是WebSocketWebSocket是一種在單一TCP連線上進行全雙工

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

用法:在JavaScript中,insertBefore()方法用於在DOM樹中插入一個新的節點。這個方法需要兩個參數:要插入的新節點和參考節點(即新節點將要插入的位置的節點)。
