最新的 ECMAScript 標(biāo)準(zhǔn)定義了7種數(shù)據(jù)類型递沪,主要分為兩大類基本類型和引用類型豺鼻。
基本類型
基本類型有時(shí)也被稱為值類型或原始類型。其中包括6種數(shù)據(jù)類型款慨,分別是:字符串類型(String)儒飒、數(shù)字類型(Number)、布爾類型(Boolean)樱调、對(duì)空類型(Null)约素、未定義類型(Undefined)、符號(hào)類型(Symbol)笆凌。
字符串類型
JavaScript的字符串類型用于表示文本數(shù)據(jù)圣猎。它是一組16位的無(wú)符號(hào)整數(shù)值的“元素”。在字符串中的每個(gè)元素占據(jù)了字符串的位置乞而。第一個(gè)元素的索引為0送悔,下一個(gè)是索引1,依此類推爪模。字符串的長(zhǎng)度是它的元素的數(shù)量欠啤。
數(shù)字類型
根據(jù) ECMAScript 標(biāo)準(zhǔn),JavaScript 中只有一種數(shù)字類型:基于 IEEE 754 標(biāo)準(zhǔn)的雙精度 64 位二進(jìn)制格式的值(-(263 -1) 到 263 -1)屋灌。它并沒(méi)有為整數(shù)給出一種特定的類型洁段。除了能夠表示浮點(diǎn)數(shù)外,還有一些帶符號(hào)的值:+Infinity共郭,-Infinity 和 NaN (非數(shù)值祠丝,Not-a-Number)疾呻。
123; // 正整數(shù)? ? ? ? ? ? ? ? ? -123; // 負(fù)整數(shù)? ? ? ? ? 520.1314; // 浮點(diǎn)數(shù)? ? ? ? ? ? ?0; // 零
Infinity; // 正無(wú)窮? ? ? ? ? ? ? ? ?-Infinity; // 負(fù)無(wú)窮? ? ? ? ? ?typeof Infinity; // number
布爾類型
布爾表示一個(gè)邏輯實(shí)體,可以有兩個(gè)值:true 和 false写半。
2 > 1; // true? ? ? ? ? [] == []; // false? ? ? ? ? [] == ![]; // true 這是為什么岸蜗?
null == undefined // true? ? ? ? ?'10' > '3'; // flase 這個(gè)啥?? ? ? ? ? ? ? typeof true; // boolean
Null 類型
Null 類型只有一個(gè)值: null叠蝇。? ? ? null === null; // true? ? ? ? ? ? ? ?typeof null; // object 為什么不是 null呢璃岳?
Undefined 類型
一個(gè)沒(méi)有被賦值的變量會(huì)有個(gè)默認(rèn)值 undefined。
let a; // 我申明我是一個(gè)變量 a? ? ? ? ? ? ?typeof a; // undefined 申明未賦值
undefined == undefined; // true? ? ? ? ? ? ? ?undefined == 0; // false
undefined == null; // true? ? ? ? ? ? undefined == ''; // false
符號(hào)類型
符號(hào)(Symbols)是ECMAScript 第6版新定義的悔捶。符號(hào)類型是唯一的并且是不可修改的, 并且也可以用來(lái)作為Object的key的值铃慷。
let obj = {};? ? ? ? let symbol1 = Symbol();? ? ? ? ? ? let symbol2 = Symbol();? ? ? ? ?typeof symbol1; // symbol
typeof symbol2; // symbol? ? ? ? ? ?symbol1 == symbol2; // false? ? ? ? ? ? ? ?obj.symbol1 = 'hello';
obj[symbol1] = 'world';? ? ? ? ? console.log(obj.symbol1 + ' ' + obj[symbol1]); // hello world
引用類型
引用類型主是指Object類型。
Object 對(duì)象
在計(jì)算機(jī)科學(xué)中, 對(duì)象是指內(nèi)存中的可以被 標(biāo)識(shí)符引用的一塊區(qū)域蜕该。
let obj1 = {}; // 對(duì)象字面量? ? ? ? ? let obj2 = new Object(); // 實(shí)例化一個(gè)對(duì)象
typeof obj1; // object? ? ? ? ? ? ?typeof obj2; // object
const person = { author: {name: "布一", "wechat": "Hankewins"}, 1: "No.1" };
console.log(person.author.name); // 布一
console.log(person.author.wechat); // Hankewins
console.log(person[1]); // No.1
類型對(duì)比
我們都知道JavaScript中有兩大數(shù)據(jù)類型:基本類型和引用類型枚冗,其中基本類型主要是把值存儲(chǔ)在棧內(nèi)存中,而引用類型卻是把地址存儲(chǔ)在棧內(nèi)存中蛇损,把值存儲(chǔ)在堆內(nèi)存中,然后將棧內(nèi)存中存儲(chǔ)的地址指向堆內(nèi)存中存儲(chǔ)的值坛怪。
基本類型? ? ? ?數(shù)據(jù)結(jié)構(gòu)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 存儲(chǔ)位置
基本類型? ? ? ?數(shù)字淤齐、字符串、布爾袜匿、Null更啄、Undefined、Symbol? ? ? ? ? ? ?棧
引用類型? ? ? ?數(shù)組居灯、對(duì)象祭务、函數(shù)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 棧、堆
什么是堆棧怪嫌?
堆棧是兩種數(shù)據(jù)結(jié)構(gòu)义锥,是一種數(shù)據(jù)項(xiàng)按序排列的數(shù)據(jù)結(jié)構(gòu),只能在一端進(jìn)行插入和刪除操作岩灭。堆為隊(duì)列優(yōu)先拌倍,先進(jìn)先出(FIFO)。棧為先進(jìn)后出(FILO)噪径。
堆和棧有啥區(qū)別柱恤?
空間分配
堆(操作系統(tǒng)):一般由程序員分配釋放,若程序員不釋放找爱,程序結(jié)束時(shí)可能由OS回收梗顺,分配方式類似于鏈表。PS:java中都是系統(tǒng)GC车摄,程序員無(wú)法進(jìn)行GC寺谤。
棧(操作系統(tǒng)):由操作系統(tǒng)自動(dòng)分配釋放仑鸥,存放函數(shù)的參數(shù)值,局部變量值等矗漾。操作方式與數(shù)據(jù)結(jié)構(gòu)中的棧相類似锈候。
緩存方式
堆:使用二級(jí)緩存,生命周期與虛擬機(jī)的GC算法有關(guān)(并不是引用為空就立即被GC)敞贡,調(diào)用速度相對(duì)較低泵琳。
棧:使用一級(jí)緩存,被調(diào)用時(shí)通常處于存儲(chǔ)空間中誊役,調(diào)用后被立即釋放获列。
數(shù)據(jù)結(jié)構(gòu)
堆(數(shù)據(jù)結(jié)構(gòu)):類似于樹(shù)結(jié)構(gòu),可以類比于堆排序
棧(數(shù)據(jù)結(jié)構(gòu)):先進(jìn)后出(FILO)
總結(jié)
JavaScript中有7種數(shù)據(jù)類型蛔垢,分為兩大類:基本類型和引用類型击孩。
堆和棧的概念和區(qū)別,以及JavaScript中兩大數(shù)據(jù)類型的存儲(chǔ)方式鹏漆。