數(shù)據(jù)類(lèi)型

關(guān)鍵字

TypeOf;Null;Undefine;Boolean;Number;
String:indexOf   toLowerCase   toUpperCase  trim    
substr(start, length)  substring(start, end)座柱;

JavaScript語(yǔ)言的每一個(gè)值,都屬于某一種數(shù)據(jù)類(lèi)型零聚。JavaScript的數(shù)據(jù)類(lèi)型谆吴,共有六種

  • 數(shù)值(number):整數(shù)和小數(shù)(比如1和3.14)
  • 字符串(string):字符組成的文本(比如"Hello World")
  • 布爾值(boolean):true(真)和false(假)兩個(gè)特定值
  • undefined:表示“未定義”或不存在,即此處目前沒(méi)有任何值
  • null:表示空缺坊萝,即此處應(yīng)該有一個(gè)值孵稽,但目前為空
  • 對(duì)象(object):各種值組成的集合

數(shù)值许起、字符串、布爾值稱(chēng)為原始類(lèi)型(primitive type)的值菩鲜,
對(duì)象稱(chēng)為合成類(lèi)型(complex type)的值园细,
一個(gè)對(duì)象往往是多個(gè)原始類(lèi)型的值的合成,可以看作是一個(gè)存放各種值的容器接校。
至于undefined和null猛频,一般將它們看成兩個(gè)特殊值

對(duì)象又可以分成三個(gè)子類(lèi)型蛛勉。

  • 狹義的對(duì)象(object)
  • 數(shù)組(array)
  • 函數(shù)(function)

狹義的對(duì)象和數(shù)組是兩種不同的數(shù)據(jù)組合方式鹿寻,而函數(shù)其實(shí)是處理數(shù)據(jù)的方法
JavaScript把函數(shù)當(dāng)成一種數(shù)據(jù)類(lèi)型诽凌,可以像其他類(lèi)型的數(shù)據(jù)一樣烈和,進(jìn)行賦值和傳遞,這為編程帶來(lái)了很大的靈活性皿淋,體現(xiàn)了JavaScript作為“函數(shù)式語(yǔ)言”的本質(zhì)招刹。

這里需要明確的是,JavaScript的所有數(shù)據(jù)窝趣,都可以視為廣義的對(duì)象疯暑。不僅數(shù)組和函數(shù)屬于對(duì)象,就連原始類(lèi)型的數(shù)據(jù)(數(shù)值哑舒、字符串妇拯、布爾值)也可以用對(duì)象方式調(diào)用。為了避免混淆洗鸵,此后除非特別聲明越锈,本教程的”對(duì)象“都特指狹義的對(duì)象。

typeof運(yùn)算符

JavaScript有三種方法膘滨,可以確定一個(gè)值到底是什么類(lèi)型甘凭。

  • typeof運(yùn)算符
  • instanceof運(yùn)算符
  • Object.prototype.toString方法

typeof運(yùn)算符可以返回一個(gè)值的數(shù)據(jù)類(lèi)型,可能有以下結(jié)果火邓。

  1. 原始類(lèi)型

數(shù)值丹弱、字符串、布爾值分別返回number铲咨、string躲胳、boolean

typeof 123 // "number"
typeof '123' // "string"
typeof false // "boolean"
  1. 函數(shù)

函數(shù)返回function纤勒。

function f() {}
typeof f
// "function"
  1. undefined

undefined返回undefined坯苹。

typeof undefined
// "undefined"

利用這一點(diǎn),typeof可以用來(lái)檢查一個(gè)沒(méi)有聲明的變量摇天,而不報(bào)錯(cuò)粹湃。

v
// ReferenceError: v is not defined

typeof v
// "undefined"

實(shí)際編程中恐仑,這個(gè)特點(diǎn)通常用在判斷語(yǔ)句。

// 錯(cuò)誤的寫(xiě)法
if (v) {
  // ...
}
// ReferenceError: v is not defined

// 正確的寫(xiě)法
if (typeof v === "undefined") {
  // ...
}
  1. 其他

除此以外再芋,其他情況都返回object菊霜。

typeof window // "object"
typeof {} // "object"
typeof [] // "object"
typeof null // "object"

從上面代碼可以看到坚冀,空數(shù)組([])的類(lèi)型也是object济赎,這表示在JavaScript內(nèi)部,數(shù)組本質(zhì)上只是一種特殊的對(duì)象记某。另外司训,null的類(lèi)型也是object,這是由于歷史原因造成的液南,為了兼容以前的代碼壳猜,后來(lái)就沒(méi)法修改了,并不是說(shuō)null就屬于對(duì)象滑凉,本質(zhì)上null是一個(gè)類(lèi)似于undefined的特殊值统扳。

既然typeof對(duì)數(shù)組(array)和對(duì)象(object)的顯示結(jié)果都是object,那么怎么區(qū)分它們呢畅姊?instanceof運(yùn)算符可以做到咒钟。

var o = {};
var a = [];

o instanceof Array // false
a instanceof Array // true

null 和 undefined 的區(qū)別

上面代碼中,a變量分別被賦值為undefined和null若未,這兩種寫(xiě)法的效果幾乎等價(jià)朱嘴。

在if語(yǔ)句中,它們都會(huì)被自動(dòng)轉(zhuǎn)為false粗合,相等運(yùn)算符(==)甚至直接報(bào)告兩者相等萍嬉。

if (!undefined) {
  console.log('undefined is false');
}
// undefined is false

if (!null) {
  console.log('null is false');
}
// null is false

undefined == null
// true

上面代碼說(shuō)明,兩者的行為是何等相似隙疚!Google公司開(kāi)發(fā)的JavaScript語(yǔ)言的替代品Dart語(yǔ)言壤追,就明確規(guī)定只有null,沒(méi)有undefined供屉!

既然含義與用法都差不多大诸,為什么要同時(shí)設(shè)置兩個(gè)這樣的值,這不是無(wú)端增加復(fù)雜度贯卦,令初學(xué)者困擾嗎资柔?這與歷史原因有關(guān)。

1995年JavaScript誕生時(shí)撵割,最初像Java一樣贿堰,只設(shè)置了null作為表示"無(wú)"的值。根據(jù)C語(yǔ)言的傳統(tǒng)啡彬,null被設(shè)計(jì)成可以自動(dòng)轉(zhuǎn)為0羹与。

Number(null) // 0
5 + null // 5

但是故硅,JavaScript的設(shè)計(jì)者Brendan Eich,覺(jué)得這樣做還不夠纵搁。

首先吃衅,null像在Java里一樣,被當(dāng)成一個(gè) 對(duì)象腾誉。但是徘层,JavaScript的數(shù)據(jù)類(lèi)型分成原始類(lèi)型和合
成類(lèi)型兩大類(lèi),Brendan Eich覺(jué)得表示"無(wú)"的值最好不是對(duì)象利职。

因此趣效,Brendan Eich又設(shè)計(jì)了一個(gè)undefined。他是這樣區(qū)分的:null是一個(gè)表示"無(wú)"的對(duì)象猪贪,轉(zhuǎn)為數(shù)值時(shí)為0跷敬;undefined是一個(gè)表示"無(wú)"的原始值,轉(zhuǎn)為數(shù)值時(shí)為NaN热押。

Number(undefined) // NaN
5 + undefined // NaN

typeof null // "object"

但是西傀,這樣的區(qū)分在實(shí)踐中很快就被證明不可行。目前null和undefined基本是同義的桶癣,只有一些細(xì)微的差別拥褂。

上面代碼表示,查詢(xún)null的類(lèi)型鬼廓,JavaScript返回object(對(duì)象)肿仑。

這并不是說(shuō)null的數(shù)據(jù)類(lèi)型就是對(duì)象,而是JavaScript早期部署中的一個(gè)約定俗成碎税,其實(shí)不完全正確尤慰,后來(lái)再想改已經(jīng)太晚了,會(huì)破壞現(xiàn)存代碼雷蹂,所以一直保留至今伟端。

用法和含義

對(duì)于null和undefined,可以大致可以像下面這樣理解匪煌。

null表示空值對(duì)象责蝠。典型用法是:

  • 作為函數(shù)的參數(shù)继阻,表示該函數(shù)的參數(shù)是一個(gè)沒(méi)有任何內(nèi)容的對(duì)象设塔。
  • 作為對(duì)象原型鏈的終點(diǎn)坑资。

undefined表示不存在值峰伙,就是此處目前不存在任何值。典型用法是:

  • 變量被聲明了惑折,但沒(méi)有賦值時(shí)璃哟,就等于undefined采够。
  • 調(diào)用函數(shù)時(shí),應(yīng)該提供的參數(shù)沒(méi)有提供医男,該參數(shù)等于undefined砸狞。
  • 對(duì)象沒(méi)有賦值的屬性,該屬性的值為undefined镀梭。
  • 函數(shù)沒(méi)有返回值時(shí)刀森,默認(rèn)返回undefined
var i;
i // undefined

function f(x){console.log(x)}
f() // undefined

var  o = new Object();
o.p // undefined

var x = f();
x // undefined

Boolean

布爾值代表“真”和“假”兩個(gè)狀態(tài)”ㄕ耍“真”用關(guān)鍵字true表示研底,“假”用關(guān)鍵字false表示。布爾值只有這兩個(gè)值笙什。

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

  • 兩元邏輯運(yùn)算符: && (And)飘哨,|| (Or)
  • 前置邏輯運(yùn)算符: ! (Not)
  • 相等運(yùn)算符:===胚想,!==琐凭,==,!=
  • 比較運(yùn)算符:>浊服,>=统屈,<,<=

如果JavaScript預(yù)期某個(gè)位置應(yīng)該是布爾值牙躺,會(huì)將該位置上現(xiàn)有的值自動(dòng)轉(zhuǎn)為布爾值愁憔。轉(zhuǎn)換規(guī)則是除了下面六個(gè)值被轉(zhuǎn)為false,其他值都視為true孽拷。

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

布爾值往往用于程序流程的控制吨掌,請(qǐng)看一個(gè)例子。

if ('') {
  console.log(true);
}
// 沒(méi)有任何輸出

上面代碼的if命令后面的判斷條件脓恕,預(yù)期應(yīng)該是一個(gè)布爾值膜宋,所以JavaScript自動(dòng)將空字符串,轉(zhuǎn)為布爾值false炼幔,導(dǎo)致程序不會(huì)進(jìn)入代碼塊秋茫,所以沒(méi)有任何輸出。

需要特別注意的是乃秀,空數(shù)組([])和空對(duì)象({})對(duì)應(yīng)的布爾值肛著,都是true。

if ([]) { console.log(true); } // true

if ({}) { console.log(true); } // true

Number

JavaScript的數(shù)字類(lèi)型和其它語(yǔ)言有所不同跺讯,沒(méi)有整型和浮點(diǎn)數(shù)的區(qū)別枢贿,統(tǒng)一都是Number類(lèi)型,可以表示十進(jìn)制刀脏、八進(jìn)制局荚、十六進(jìn)制

var a = 10; //十進(jìn)制
var b = 073; //八進(jìn)制
vat c = 0xf3; //十六進(jìn)制

浮點(diǎn)數(shù)

浮點(diǎn)數(shù)是指數(shù)字包含小數(shù)點(diǎn),小數(shù)點(diǎn)后至少有一位數(shù)字(沒(méi)有或者是0會(huì)轉(zhuǎn)為整數(shù))火本,前面可以沒(méi)有

var a = 0.27;
var b = .45;

對(duì)于極大或極小的數(shù)字可以使用科學(xué)計(jì)數(shù)法

var a = 3.1e5; //310000

浮點(diǎn)數(shù)最高精度是17位危队,但是在計(jì)算的時(shí)候精度不如整數(shù)

1 - 0.9; // 0.09999999999999998
0.1 + 0.2; //0.30000000000000004

數(shù)值范圍

JavaScript Number不能表示所有數(shù)字聪建,有個(gè)范圍

  • Number.MIN_VALUE: 5e-324
  • Number.MAX_VALUE: 1.7976931348623157e+308

如果超過(guò)這個(gè)范圍數(shù)字會(huì)被轉(zhuǎn)為特殊的Infinity值表示無(wú)窮,-Infinity表示負(fù)無(wú)窮

isFinite(Number.MAX_VALUE + 1); // true
isFinite(Infinity);  // false
isFinite(NaN);       // false
isFinite(-Infinity); // false

isFinite(0);         // true
isFinite(2e64);      // true

isFinite("0");       // true

NaN

NaN含義是Not a Number茫陆,表示非數(shù)字金麸,NaN和任何值都不相等,包括自己

NaN == NaN; //false

使用isNaN函數(shù)判斷 NaN

數(shù)值轉(zhuǎn)換

有三個(gè)函數(shù)可以把非數(shù)值轉(zhuǎn)換為數(shù)值

  1. Number()
  2. parseInt()
  3. parseFloat()

Number規(guī)則相當(dāng)復(fù)雜而且不合理簿盅,幾乎不使用挥下,常用的是后兩個(gè),兩個(gè)規(guī)則類(lèi)似

  1. 忽略字符串前面的空白字符桨醋,找到第一個(gè)非空白字符
  2. 如果第一個(gè)字符不是-或者數(shù)字返回NaN
  3. 如果是繼續(xù)解析棚瘟,直到非數(shù)值模式為止
  4. 0開(kāi)頭會(huì)當(dāng)做八進(jìn)制,0x開(kāi)頭會(huì)當(dāng)做十六進(jìn)制喜最,但是可以指定第二個(gè)參數(shù)指定基數(shù)

String

String是Unicode字符組成的序列偎蘸,俗稱(chēng)字符串,可以用雙引號(hào)或者單引號(hào)表示瞬内,沒(méi)有區(qū)別迷雪,匹配即可

字符串也有一些轉(zhuǎn)義字符

  • \n: 換行
  • \r: 回車(chē)
  • \t:水平制表符
  • \\:\

字符串的長(zhǎng)度可以通過(guò)length屬性獲得

"123".length; // 3

字符串方法

  1. indexOf:獲取字符位置
"abc".indexOf('b');//1
  1. toLowerCase:轉(zhuǎn)換為小寫(xiě),toUpperCase:轉(zhuǎn)換為大寫(xiě)
"aBcD".toLowerCase(); // "abcd"
"aBcD".toUpperCase(); // "ABCD"
  1. trim:刪除兩端空白字符(IE9+)
" sd f ".trim(); // "sd f"
  1. replace:字符串替換
"abc".replace('b', 'B'); // "aBc"
  1. substr(start, length):獲取子字符串
"abcdef".substr(2,3); // "cde"
  1. substring(start, end):獲取子字符串
"abcdef".substring(2,3); // "c"

Object

對(duì)象(object)是JavaScript的核心概念虫蝶,也是最重要的數(shù)據(jù)類(lèi)型章咧。JavaScript的所有數(shù)據(jù)都可以被視為對(duì)象,這也是我們常說(shuō)的一切皆為對(duì)象能真。

簡(jiǎn)單說(shuō)赁严,所謂對(duì)象,就是一種無(wú)序的數(shù)據(jù)集合粉铐,由若干個(gè)“鍵值對(duì)”(key-value)構(gòu)成疼约。key我們稱(chēng)為對(duì)象的屬性,value可以是任何JavaScript類(lèi)型秦躯,甚至可以是對(duì)象

var o = new Object();
o.name = 'Byron';
o.age = 24;

我們也可以通過(guò)字面量的方式定義對(duì)象忆谓,實(shí)際上這種方法更常用

var o = {
    name: 'Byron',
    age:24
}

key可以使用引號(hào)包裹,也可以直接寫(xiě)踱承,對(duì)象有一個(gè)默認(rèn)的方法toString倡缠,用來(lái)返回對(duì)象的字符串表示

console.log(o); // Object {name: "Byron", age: 24}
console.log(o.toString()); // [object Object]

object的屬性讀取有兩種方式

o.name;
o['name'];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市茎活,隨后出現(xiàn)的幾起案子昙沦,更是在濱河造成了極大的恐慌,老刑警劉巖载荔,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盾饮,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)丘损,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)普办,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人徘钥,你說(shuō)我怎么就攤上這事衔蹲。” “怎么了呈础?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵舆驶,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我而钞,道長(zhǎng)沙廉,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任臼节,我火速辦了婚禮撬陵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘官疲。我一直安慰自己袱结,他們只是感情好亮隙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布途凫。 她就那樣靜靜地躺著,像睡著了一般溢吻。 火紅的嫁衣襯著肌膚如雪维费。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天促王,我揣著相機(jī)與錄音犀盟,去河邊找鬼。 笑死蝇狼,一個(gè)胖子當(dāng)著我的面吹牛阅畴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播迅耘,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼贱枣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了颤专?” 一聲冷哼從身側(cè)響起纽哥,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎栖秕,沒(méi)想到半個(gè)月后春塌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年只壳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了俏拱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吼句,死狀恐怖彰触,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情命辖,我是刑警寧澤况毅,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站尔艇,受9級(jí)特大地震影響尔许,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜终娃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一味廊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧棠耕,春花似錦余佛、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蕊退,卻和暖如春郊楣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瓤荔。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工净蚤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人输硝。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓今瀑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親点把。 傳聞我的和親對(duì)象是個(gè)殘疾皇子橘荠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容