前端進階系列(第1期):理解JavaScript資料型別

布一發表於1970-01-01

寫在前面

前端進階系列本著“好好幹前端”的心態,一步一個腳印認真練好前端的基本功,為在前端的發展道路上做好鋪墊。

本週正式開始前端進階的第1期,本週的主題是理解JavaScript資料型別

資料型別

最新的 ECMAScript 標準定義了7種資料型別,主要分為兩大類基本型別引用型別

基本型別

基本型別有時也被稱為值型別原始型別。其中包括6種資料型別,分別是:字串型別(String)數字型別(Number)布林型別(Boolean)對空型別(Null)未定義型別(Undefined)符號型別(Symbol)

字串型別

JavaScript的字串型別用於表示文字資料。它是一組16位的無符號整數值的“元素”。在字串中的每個元素佔據了字串的位置。第一個元素的索引為0,下一個是索引1,依此類推。字串的長度是它的元素的數量。

數字型別

根據 ECMAScript 標準,JavaScript 中只有一種數字型別:基於 IEEE 754 標準的雙精度 64 位二進位制格式的值(-(263 -1) 到 263 -1)。它並沒有為整數給出一種特定的型別。除了能夠表示浮點數外,還有一些帶符號的值:+Infinity,-Infinity 和 NaN (非數值,Not-a-Number)。

123;
// 正整數-123;
// 負整數520.1314;
// 浮點數0;
// 零Infinity;
// 正無窮-Infinity;
// 負無窮typeof Infinity;
// number複製程式碼

布林型別

布林表示一個邏輯實體,可以有兩個值:true 和 false。

2 >
1;
// true[] == [];
// false [] == ![];
// true 這是為什麼?null == undefined // true'10' >
'3';
// flase 這個啥?typeof true;
// boolean複製程式碼

Null 型別

Null 型別只有一個值: null。

null === null;
// truetypeof null;
// object 為什麼不是 null呢?複製程式碼

Undefined 型別

一個沒有被賦值的變數會有個預設值 undefined。

let a;
// 我申明我是一個變數 atypeof a;
// undefined 申明未賦值undefined == undefined;
// trueundefined == 0;
// falseundefined == null;
// trueundefined == '';
// false複製程式碼

符號型別

符號(Symbols)是ECMAScript 第6版新定義的。符號型別是唯一的並且是不可修改的, 並且也可以用來作為Object的key的值。

let obj = {
};
let symbol1 = Symbol();
let symbol2 = Symbol();
typeof symbol1;
// symboltypeof symbol2;
// symbolsymbol1 == symbol2;
// falseobj.symbol1 = 'hello';
obj[symbol1] = 'world';
console.log(obj.symbol1 + ' ' + obj[symbol1]);
// hello world複製程式碼

引用型別

引用型別主是指Object型別

Object 物件

在電腦科學中, 物件是指記憶體中的可以被 識別符號引用的一塊區域。

let obj1 = {
};
// 物件字面量let obj2 = new Object();
// 例項化一個物件typeof obj1;
// objecttypeof obj2;
// objectconst person = {
author: {name: "布一", "wechat": "Hankewins"
}, 1: "No.1"
};
console.log(person.author.name);
// 布一console.log(person.author.wechat);
// Hankewinsconsole.log(person[1]);
// No.1複製程式碼

型別對比

我們都知道JavaScript中有兩大資料型別:基本型別引用型別,其中基本型別主要是把值儲存在棧記憶體中,而引用型別卻是把地址儲存在棧記憶體中,把值儲存在堆記憶體中,然後將棧記憶體中儲存的地址指向堆記憶體中儲存的值。

基本型別 資料結構 儲存位置
基本型別 數字、字串、布林、Null、Undefined、Symbol
引用型別 陣列、物件、函式 棧、堆

什麼是堆疊?

堆疊是兩種資料結構,是一種資料項按序排列的資料結構,只能在一端進行插入和刪除操作。堆為佇列優先,先進先出(FIFO)。棧為先進後出(FILO)。

堆和棧有啥區別?

  1. 空間分配
  • 堆(作業系統):一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由OS回收,分配方式類似於連結串列。PS:java中都是系統GC,程式設計師無法進行GC。
  • 棧(作業系統):由作業系統自動分配釋放,存放函式的引數值,區域性變數值等。操作方式與資料結構中的棧相類似。
  1. 快取方式
  • 堆:使用二級快取,生命週期與虛擬機器的GC演算法有關(並不是引用為空就立即被GC),呼叫速度相對較低。
  • 棧:使用一級快取,被呼叫時通常處於儲存空間中,呼叫後被立即釋放。
  1. 資料結構
  • 堆(資料結構):類似於樹結構,可以類比於堆排序
  • 棧(資料結構):先進後出(FILO)

總結

本篇文章內容主要告訴我們以下幾個基本知識點:

  1. JavaScript中有7種資料型別,分為兩大類:基本型別引用型別
  2. 堆和棧的概念和區別,以及JavaScript中兩大資料型別的儲存方式。
  3. 丟擲了一些資料型別轉換時遇到的“奇葩”問題。

針對第3點我們將在下一章節中重點講解。

參考資料

交流

更多精彩內容請關注我的github部落格,如果你覺得還不錯請給個star,非常感謝。

來源:https://juejin.im/post/5c4d2bf0f265da61163a22bc

相關文章