JavaScript 數(shù)據(jù)類型

一、數(shù)據(jù)類型

  1. JavaScript 語言的每一個值,都屬于某一種數(shù)據(jù)類型。 JavaScript 共有七種數(shù)據(jù)類型:
  • 數(shù)值(number):包括整數(shù)和小數(shù)(比如13.14
  • 字符串(string):即文本(比如Hello World
  • 布爾值(boolean):表示真?zhèn)蔚膬蓚€特殊值,即truefalse
  • Symbol:ES6 新增,定義對象的唯一屬性名
  • undefined:表示“未定義”或不存在,即由于目前沒有定義,所以此處暫時沒有任何值
  • null:表示空值,即此處的值為空
  • 對象(object):各種值組成的集合
  • 基本(簡單)數(shù)據(jù)類型:數(shù)值、字符串、布爾值、Symbol、undefined、null
    復(fù)雜數(shù)據(jù)類型:對象
  • 對象是最復(fù)雜的數(shù)據(jù)類型,又可以分成三個子類型:狹義的對象(object)、數(shù)組(array)、函數(shù)(function)。
  • 空數(shù)組 [] 的類型也是 object,本質(zhì)上只是一種特殊的對象。
  1. typeof 運(yùn)算符
    用以判斷數(shù)據(jù)類型,返回一個值的數(shù)據(jù)類型。
typeof 123 // "number"
typeof 'abc' // "string"
typeof false // "boolean"
typeof undefined // "undefined"
typeof {} // "object"
  • 兩種特殊情況:nullfunction
function f() {}  // "function"
typeof null // "object"

二、 null 和 undefined

nullundefined都可以表示“沒有”,含義非常相似。

  1. 二者區(qū)別:
  • null 是一個表示“”的對象,轉(zhuǎn)為數(shù)值時為 0.
  • undefined 是一個表示”此處無定義”的原始值,轉(zhuǎn)為數(shù)值時為 NaN.
  1. 常見語法慣例:
  • 變量沒有賦值 —— undefined
  • 聲明一個對象 object,暫時不想給值 var obj = null —— null
    聲明一個非對象,暫時不想給值 var n (= undefined) —— undefined

三、布爾值

布爾值代表“真”和“假”兩個狀態(tài)。
“真”用關(guān)鍵字 true 表示,“假”用關(guān)鍵字 false 表示。

  • 下列運(yùn)算符會返回布爾值:

兩元邏輯運(yùn)算符: && (And),|| (Or)
前置邏輯運(yùn)算符: ! (Not)
相等運(yùn)算符: ===,!==,==!=
比較運(yùn)算符:>,>=,<<=

  • 兩元運(yùn)算符運(yùn)算規(guī)則:
a && b:
true && true = true 、 true && false = false 、 false && false = false
a || b:
true && true = true 、 true && false = true 、 false && false = false
  • 如果 JavaScript 預(yù)期某個位置應(yīng)該是布爾值,會將該位置上現(xiàn)有的值自動轉(zhuǎn)為布爾值。轉(zhuǎn)換規(guī)則是除了下面六個值被轉(zhuǎn)為 false,其他值都視為 true。

undefined、nullfalse、0NaN、""''(空字符串)

  • 布爾值往往用于程序流程的控制。

四、數(shù)值

  1. 整數(shù)和浮點數(shù)
  • JavaScript 內(nèi)部,所有數(shù)字都是以 64 位浮點數(shù)形式儲存,整數(shù)也是。所以 1===1.0,它們是同一個數(shù)。
  • JavaScript 語言的底層根本沒有整數(shù),所有數(shù)字都是小數(shù)(64位浮點數(shù))
  1. 數(shù)值精度
  • JavaScript 浮點數(shù)的 64 個二進(jìn)制位組成(從最左邊開始):

    第 1 位:符號位,0表示正數(shù),1表示負(fù)數(shù)
    第 2 位到第 12 位(共11位):指數(shù)部分
    第 13 位到第 64 位(共52位):小數(shù)部分(即有效數(shù)字)

  • 符號位決定了一個數(shù)的正負(fù),指數(shù)部分決定了數(shù)值的大小,小數(shù)部分決定了數(shù)值的精度。

  • 正常情況下(指數(shù)部分在 0 到 2047 之間),一個數(shù)在 JavaScript 內(nèi)部實際的表示形式:(-1)^符號位 * 1.xx...xx * 2^指數(shù)部分

  • JavaScript 提供的有效數(shù)字最長為 53 個二進(jìn)制位,絕對值小于等于2的53次方的整數(shù),即 -2^53 到 2^53,都可以精確表示。由于 2 的 53 次方是一個 16 位的十進(jìn)制數(shù)值,所以 JavaScript 對 15 位的十進(jìn)制數(shù)都可以精確處理。大于 2 的 53 次方以后,多出來的有效數(shù)字都會無法保存,變成 0.

Math.pow(2, 53)
// 9007199254740992

9007199254740992111
// 9007199254740992000   多出的三個有效數(shù)字,將無法保存
  1. 進(jìn)制

二進(jìn)制:前綴為0b的數(shù)字
八進(jìn)制:前綴為0u的數(shù)字,或以0開頭且只含0~7的數(shù)字
十進(jìn)制:不以0開頭的數(shù)字
十六進(jìn)制:前綴為0x的數(shù)字

  • JavaScript 內(nèi)部會自動默認(rèn)將八進(jìn)制、十六進(jìn)制、二進(jìn)制轉(zhuǎn)為十進(jìn)制。
  • 十進(jìn)制數(shù)值的記法包括整數(shù)、小數(shù) 和 科學(xué)計數(shù)法(1.23e2 = 123)。
  1. 特殊數(shù)值
  • 正 0 和負(fù) 0
    幾乎所有場合,正 0 和負(fù) 0 都會被當(dāng)作正常的 0:+0 === -0 === 0
    唯一有區(qū)別的場合是,+0 或 -0 當(dāng)作分母,返回的值是不相等的。

  • NaN
    NaN是 JavaScript 的特殊值,表示“非數(shù)字”(Not a Number)。
    NaN不是獨(dú)立的數(shù)據(jù)類型,而是一個特殊數(shù)值,它的數(shù)據(jù)類型依然屬于 Number.
    NaN在布爾運(yùn)算時被當(dāng)作 false.
    NaN不等于任何值,包括它本身;0 除以 0 等于NaN;NaN與任何數(shù)(包括它自己)的運(yùn)算,得到的都是 NaN.

  • Infinity
    Infinity 表示“無窮”,用來表示兩種場景:一種是一個正的數(shù)值太大或一個負(fù)的數(shù)值太小,無法表示;另一種是非 0 數(shù)值除以 0,得到 Infinity。

Math.pow(2, 1024)     // Infinity

0 / 0   // NaN
1 / 0   // Infinity

Infinity 有正負(fù)之分,Infinity 表示正的無窮,-Infinity 表示負(fù)的無窮。
InfinityNaN比較,總是返回 false.

五、字符串

  1. 定義
  • 字符串:放在''""之間的 0 個或多個字符。
    ''字符串里面可以用"";""字符串里面可以用''。
  • ''含0 個字符,為“空字符串”,length=0;
    ' '含一個空格,為“空格字符串”,length=1.
  • 很多項目約定 JavaScript 語言的字符串只使用''。
  1. 多行字符串
  • 字符串默認(rèn)只能寫在一行內(nèi),分成多行將會報錯;
  • 如果長字符串必須分成多行,可以在每一行的尾部使用反斜杠\
  • 反斜杠的后面必須是換行符,而不能有空格等其他字符,否則會報錯。
'ab \
cd \
ef'
// abcdef
  • 模板字符串 (template string)(ES6 新增)
    用反引號(`)標(biāo)識,可以用作普通字符串,也可以用來定義多行字符串(length 中包含回車),或在字符串中嵌入變量:
`ab
cd
ef`
// abcdef
  1. 連接運(yùn)算符 +
    + 可以連接多個單行字符串,將長字符串拆成多行書寫,輸出的時候也是單行。
'ab'
+ 'cd'
+ 'ef'
// abcdef
  1. 轉(zhuǎn)義
    反斜杠\在字符串內(nèi)有特殊含義,用來表示一些特殊字符,又稱為轉(zhuǎn)義符。

\0 :null(\u0000)
\b :后退鍵(\u0008)
\f :換頁符(\u000C)
\n :換行符(\u000A)
\r :回車鍵(\u000D)
\t :制表符(\u0009)
\v :垂直制表符(\u000B)
\' :單引號(\u0027)
\" :雙引號(\u0022)
\\ :反斜杠(\u005C)

  • 反斜杠的三種特殊用法:
    (1)\HHH
    \后面緊跟三個八進(jìn)制數(shù)(000到377),代表一個字符。
    (2)\xHH
    \x后面緊跟兩個十六進(jìn)制數(shù)(00到FF),代表一個字符。
    (3)\uXXXX
    \u后面緊跟四個十六進(jìn)制數(shù)(0000到FFFF),代表一個字符。
  1. lenth 屬性
    length屬性返回字符串的長度,該屬性是無法改變的。
var s = 'hello';
s.length   // 5
  1. 字符集
  • JavaScript 引擎內(nèi)部以 Unicode 儲存字符,所有字符都用 Unicode 表示。
  • 程序中可使用 Unicode 碼點表示字符,即將字符寫成\uxxxx的形式:
var a = '\u006F\u006F';
a   // "oo"
  • 每個字符在 JavaScript 內(nèi)部都是以16位(即2個字節(jié))的 UTF-16 格式儲存。即 JavaScript 的單位字符長度固定為16位長度,2個字節(jié)。
    (1)但UTF-16 有兩種長度:碼點在U+0000U+FFFF之間的字符,長度為16位(即2個字節(jié));碼點在U+10000U+10FFFF之間的字符,長度為32位(即4個字節(jié))。
    (2)對于碼點在U+10000U+10FFFF之間的字符,JavaScript 總是認(rèn)為它們是兩個字符(length屬性為2)。因此JavaScript 返回的 length 可能不正確
  • JavaScript 引擎不能自動識別編號大于 0xFFFF 的 Unicode 字符。
  1. Base64 轉(zhuǎn)碼
  • Base64 是一種編碼方法,可以將任意值轉(zhuǎn)成 0~9、A~Z、a-z、+和/這64個字符組成的可打印字符。使不出現(xiàn)特殊字符,簡化程序的處理。

btoa():任意值轉(zhuǎn)為 Base64 編碼
atob():Base64 編碼轉(zhuǎn)為原來的值

var string = 'Hello World!';
btoa(string) // "SGVsbG8gV29ybGQh"
atob('SGVsbG8gV29ybGQh') // "Hello World!"
  • 要將非ASCII碼(比如中文)字符轉(zhuǎn)為Base64編碼,必須中間插入一個轉(zhuǎn)碼環(huán)節(jié)。

六、對象

  1. 定義
  • 對象(object)是一組“鍵值對”(key-value)的集合,是一種無序的復(fù)合數(shù)據(jù)集合(哈希表)。
  • 對象是復(fù)雜類型(其他六類為簡單類型),由其他簡單類型組成。
  • 對想是 JavaScript 語言的核心概念,也是最重要的數(shù)據(jù)類型。
  1. 語法
  • 對象的所有鍵名(屬性)都是字符串(ES6 中 Symbol 值也可以作為鍵名),所以加不加引號都可以;空字符串也可以作為鍵名。
  • 如果鍵名不符合“標(biāo)識符原則”(標(biāo)識符只能包含字母或數(shù)字或漢字或下劃線(“_”)或美元符號(“$”),且不能以數(shù)字開頭),并且也不是數(shù)字,則必須加上引號,否則會報錯。
  • 鍵值可以為各種類型,鍵值的類型也可以為一個“對象”。
  • 對象的屬性之間用逗號分隔。
var person = {
  name: 'Frank',
  age: 26,
  gender: 'female',
  married: true,
  children: {name: 'Micle',age: 3} ,    // 鍵值也可以為對象
  '': 'Frank' ,                          // 屬性名也可以為空字符串
  '9a':'Frank'
}
  1. 屬性的操作
  • 讀取屬性的兩種方法:
    person['name'](屬性名必須放在引號里,''不可省略)
    person.name (特例,當(dāng)屬性名符合標(biāo)識符規(guī)則時才可用)
    注意:數(shù)值鍵名不能使用點運(yùn)算符(會被當(dāng)成小數(shù)點);
    使用方括號運(yùn)算符,可以不加引號,因為會自動轉(zhuǎn)成字符串:
var obj = {
  123: 'Hello'
};

obj.123  // 報錯
obj['123'] // "Hello"
obj[123]  // "Hello"
  • 查看所有屬性:Object.keys方法
Object.keys(person);

// ['name', 'age','gender','married','children','','9a']
  • 刪除屬性:delete
    用于刪除對象的屬性,刪除成功后返回 true.
delete person['name']  // true
person.name   // undefined 

注意:若 delete 一個不存在的屬性, 不報錯且返回 true.

  • in 運(yùn)算符
    檢查對象是否包含某個屬性,包含就返回 true,否則返回 false.
'age' in person     // true
'phone' in person   // false
  • for...in循環(huán)
    遍歷一個對象的全部屬性。
for (var key in person) {
  console.log(key);
}
// name  (順序隨機(jī))
// age
// ......
for (var key in person) {
  console.log(person[key]);
}
// Frank
// 26
// ......

(1)for...in循環(huán)會跳過不可遍歷的屬性。
(2)它不僅遍歷對象自身的屬性,還遍歷繼承的屬性。
(3)循環(huán)不按聲明的順序遍歷屬性,順序隨機(jī)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容