JavaScript 數據類型

JavaScript 是一種弱類型或者說動態語言。這意味著你不用提前聲明變量的類型,在程序運行過程中,類型會被自動確定。

數據類型

最新的 ECMAScript 標準定義了7種數據類型:

  • 6種基本類型:
    • 數值(number)
    • 字符串(string)
    • 布爾值(boolean)
    • undefined
    • null
    • Symbol
  • 和對象(object)

typeof運算符

typeof運算符可以返回一個值的數據類型,返回一個字符串。

數值

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

在JavaScript語言的底層,根本沒有整數,所有數字都是小數(64位浮點數)。

1 === 1.0 // true

由于浮點數不是精確的值,所以涉及小數的比較和運算要特別小心。

0.1 + 0.2 === 0.3
// false
0.1 + 0.2
// 0.30000000000000004

數值的進制

JavaScript對整數提供四種進制的表示方法:十進制、十六進制、八進制、2進制。

十進制:沒有前導0的數值
八進制:有前綴0o或0O的數值,或者有前導0、且只用到0-7的七個阿拉伯數字的數值。
十六進制:有前綴0x或0X的數值。?
二進制:有前綴0b或0B的數值。

NaN

NaN是JavaScript的特殊值,表示“非數字”(Not a Number),主要出現在將字符串解析成數字出錯的場合。

typeof NaN // 'number'

運算規則

NaN不等于任何值,包括它本身。

NaN === NaN  // false

字符串

字符串就是零個或多個排在一起的字符,放在單引號或雙引號之中。

'abc'
"abc"

如果長字符串必須分成多行,可以在每一行的尾部使用反斜杠。

var longString = "Long \
long \
long \
string";

longString
// "Long long long string"

轉義

反斜杠(\)在字符串內有特殊含義,用來表示一些特殊字符,所以又稱為轉義符。

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

反斜杠還有三種特殊用法。

(1)\HHH

反斜杠后面緊跟三個八進制數(000到377),代表一個字符。HHH對應該字符的Unicode碼點,比如\251表示版權符號。顯然,這種方法只能輸出256種字符。

(2)\xHH

\x后面緊跟兩個十六進制數(00到FF),代表一個字符。HH對應該字符的Unicode碼點,比如\xA9表示版權符號。這種方法也只能輸出256種字符。

(3)\uXXXX

\u后面緊跟四個十六進制數(0000到FFFF),代表一個字符。HHHH對應該字符的Unicode碼點,比如\u00A9表示版權符號。

Base64轉碼

Base64是一種編碼方法,可以將任意字符轉成可打印字符。

JavaScript原生提供兩個Base64相關方法。

btoa():字符串或二進制值轉為Base64編碼
atob():Base64編碼轉為原來的編碼

var string = 'Hello World!';
btoa(string) // "SGVsbG8gV29ybGQh"
atob('SGVsbG8gV29ybGQh') // "Hello World!"

要將非ASCII碼字符轉為Base64編碼,必須中間插入一個轉碼環節,再使用這兩個方法。

function b64Encode(str) {
  return btoa(encodeURIComponent(str));
}

function b64Decode(str) {
  return decodeURIComponent(atob(str));
}

b64Encode('你好') // "JUU0JUJEJUEwJUU1JUE1JUJE"
b64Decode('JUU0JUJEJUEwJUU1JUE1JUJE') // "你好"

布爾值

布爾值只有兩個值:true和false。

除了下面六個值被轉為false,其他值都視為true。

undefined
null
false
0
NaN
""或''(空字符串)

null和undefined

null與undefined都可以表示“沒有”,含義非常相似。將一個變量賦值為undefined或null,老實說,語法效果幾乎沒區別。

null的特殊之處在于,JavaScript把它包含在對象類型(object)之中。

typeof null // "object"

注意,JavaScript的標識名區分大小寫,所以undefined和null不同于Undefined和Null(或者其他僅僅大小寫不同的詞形),后者只是普通的變量名。

null表示空值,即該處的值現在為空。調用函數時,某個參數未設置任何值,這時就可以傳入null。比如,某個函數接受引擎拋出的錯誤作為參數,如果運行過程中未出錯,那么這個參數就會傳入null,表示未發生錯誤。

undefined表示“未定義”。

Symbol

Symbol 是JavaScript的原始數據類型,Symbol實例是唯一且不可改變的.

let s = Symbol();

typeof s
// "symbol"

Symbol函數可以接受一個字符串作為參數,表示對 Symbol 實例的描述。注意,Symbol函數的參數只是表示對當前 Symbol 值的描述,因此相同參數的Symbol函數的返回值是不相等的。

// 沒有參數的情況
var s1 = Symbol();
var s2 = Symbol();

s1 === s2 // false

// 有參數的情況
var s1 = Symbol('foo');
var s2 = Symbol('foo');

s1 === s2 // false

對象

對象(object)是JavaScript的核心概念,也是最重要的數據類型。JavaScript的所有數據都可以被視為對象。
所謂對象,就是一種無序的數據集合,由若干個“鍵值對”(key-value)構成。

var o = {
  p: 'Hello World'
};

p是“鍵名”,字符串Hello World是“鍵值”,鍵名與鍵值之間用冒號分隔。

對象的所有鍵名都是字符串。對象的每一個“鍵名”又稱為“屬性”(property),它的“鍵值”可以是任何數據類型。

檢查變量是否聲明

if ('a' in window) {
  // 變量 a 聲明過
} else {
  // 變量 a 未聲明
}

查看所有屬性

查看一個對象本身的所有屬性,可以使用Object.keys方法。

var o = {
  key1: 1,
  key2: 2
};

Object.keys(o);
// ['key1', 'key2']

(摘自 JavaScript 標準參考教程)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,885評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,312評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,993評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,667評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,410評論 6 411
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,778評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,775評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,955評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,521評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,266評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,468評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,998評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,696評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,095評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,385評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,193評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,431評論 2 378

推薦閱讀更多精彩內容

  • 一、JavaScript 定義了幾種數據類型? 哪些是原始類型?哪些是復雜類型? 最新的 ECMAScript 標...
    zh_yang閱讀 373評論 0 0
  • 強制轉換 強制轉換主要指使用Number、String和Boolean三個構造函數,手動將各種類型的值,轉換成數字...
    燈火闌珊Zone閱讀 464評論 0 3
  • 1. JavaScript 定義了幾種數據類型? 哪些是原始類型?哪些是復雜類型?原始類型和復雜類型的區別是什么?...
    _達斯基閱讀 218評論 0 0
  • 每天一句:每個月要讀一本書,離開學校了,你還要經常保持閱讀的習慣,大學時候,考前的通宵達旦,說明你具備快速學習的能...
    EndEvent閱讀 436評論 0 0
  • 關注邏輯思維的最大感觸是,列清單變成了一種文體。 是啊。嫌麻煩的大家,云里霧里地找。簡單明了地直接給,是叫邏輯思維...
    唐四月閱讀 284評論 0 0