變量用來(lái)臨時(shí)存儲(chǔ)數(shù)據(jù)(如果想要永久的存儲(chǔ)數(shù)據(jù),需要通過(guò)數(shù)據(jù)庫(kù))。而在任何一門編程語(yǔ)言當(dāng)中,數(shù)據(jù)都是分為不同類型的。就如同人類也分為男人和女人一樣。
下面就來(lái)說(shuō)一下在JavaScript中數(shù)據(jù)的不同類型。
在js當(dāng)中數(shù)據(jù)類型分為兩類,一類是原始類型,一類是引用數(shù)據(jù)類型。原始類型又稱之為基礎(chǔ)數(shù)據(jù)類型,引用類型也稱之為對(duì)象類型。
原始類型的數(shù)據(jù)包含有下面幾個(gè):
- Boolean(bu li an)
- Null(no)
- Undefined(ang di fa yin te)
- Number(nan bo)
- String(si zhun)
- Symbol(sen bou)(ES6中新增加的內(nèi)容)
引用類型(復(fù)合類型)的數(shù)據(jù)包含有下面幾個(gè):
- Object(ao bu jie ke te)
- Array(er rui)
- Function(fang ke shen)
在
js當(dāng)中,引用類型也包括Date(dai te)、Math(mai si)和RegExp(正則表達(dá)式)等內(nèi)容。
需要注意的是,
JS當(dāng)中的原始值并不能夠更改,也就意味著一旦一個(gè)原始值創(chuàng)建成功。那么將不能夠進(jìn)行第二次的值得修改,除非重新創(chuàng)建一個(gè)數(shù)據(jù)。
原始類型和引用類型的區(qū)別:
二者在內(nèi)存中存儲(chǔ)的位置不同。原始數(shù)據(jù)類型存儲(chǔ)在棧中,而引用數(shù)據(jù)類型實(shí)際存儲(chǔ)在內(nèi)存的堆中。而如果把某個(gè)引用數(shù)據(jù)類型的數(shù)據(jù)存儲(chǔ)到了一個(gè)變量當(dāng)中,本質(zhì)上是把數(shù)據(jù)在堆中的位置存儲(chǔ)在了變量中,變量存儲(chǔ)在內(nèi)存的棧中。
Boolean
In computer science, a Boolean is a logical data type that can have only the values
trueorfalse. For example, in JavaScript, Boolean conditionals are often used to decide which sections of code to execute (such as in if statements) or repeat (such as in for loops).
在MDN中,對(duì)于JavaScript中的布爾值(Boolean)有上面一段描述,翻譯過(guò)來(lái)的意思大致如下:
在計(jì)算機(jī)科學(xué)中,布爾值是一種邏輯數(shù)據(jù)類型,其值只能為真或假。例如,在JavaScript中,布爾條件
常用于決定執(zhí)行哪一部分代碼(例如在if語(yǔ)句中)或重復(fù)(例如在For循環(huán)中)。
布爾值包含有兩個(gè)值true和false。其中true表示真,false表示假。
例如我們判斷一個(gè)條件,如果這個(gè)條件滿足,那么對(duì)應(yīng)著布爾值true,如果這個(gè)條件不滿足,那么就對(duì)應(yīng)著布爾值false。
下列運(yùn)算符會(huì)返回布爾值:
- 前置邏輯運(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。
undefinednullfalse0NaN-
""或''(空字符串)
Null
In computer science, a null value represents a reference that points, generally intentionally, to a nonexistent or invalid object or address. The meaning of a null reference varies among language implementations.
In JavaScript, null is one of the primitive values.
譯文:
在計(jì)算機(jī)科學(xué)中,空值表示一個(gè)引用,該引用通常有意指向不存在或無(wú)效的對(duì)象或地址??找玫暮x因語(yǔ)言實(shí)現(xiàn)而異。
在JavaScript中,null是一個(gè)基本值(原始數(shù)據(jù))。
Null類型里面只有一個(gè)值,就是null。
關(guān)于null,你可以把它理解為無(wú),它表示一個(gè)空值。
null這個(gè)值專門用來(lái)表示一個(gè)為空的對(duì)象,
使用typeof運(yùn)算符檢查一個(gè)null值時(shí),會(huì)返回object
var a = null;
例如上面的代碼當(dāng)中,你可以理解為此事的變量a表示的值為空。
當(dāng)我們?cè)谝恍┬枰獋鬟f值的地方,如果我們沒(méi)有值進(jìn)行傳遞,那么就可以傳遞一個(gè)
null,表示傳遞的值為空。
undefined
Undefined類型當(dāng)中只有一個(gè)值就是undefined。
在代碼的編寫過(guò)程中,一個(gè)沒(méi)有被賦值的變量的類型就是undefined(未定義)。
var a;
console.log(a); // 會(huì)在瀏覽器的控制臺(tái)中輸出undefined
如果一個(gè)變量聲明但是沒(méi)有被賦值,我們就可以使用typeof運(yùn)算符來(lái)檢查一下結(jié)果.
var a;
console.log(typeof a);// 輸出undefined類型
Number
Number類型即為數(shù)字類型,包括整數(shù)和浮點(diǎn)數(shù)(小數(shù))。
在MDN中關(guān)于Number類型的描述如下:
根據(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)。
JavaScript 內(nèi)部,所有數(shù)字都是以64位浮點(diǎn)數(shù)形式儲(chǔ)存,即使整數(shù)也是如此。所以,1與1.0是相同的,是同一個(gè)數(shù)。
1 === 1.0 // true
這就是說(shuō),JavaScript 語(yǔ)言的底層根本沒(méi)有整數(shù),所有數(shù)字都是小數(shù)(64位浮點(diǎn)數(shù))。容易造成混淆的是,某些運(yùn)算只有整數(shù)才能完成,此時(shí) JavaScript 會(huì)自動(dòng)把64位浮點(diǎn)數(shù),轉(zhuǎn)成32位整數(shù),然后再進(jìn)行運(yùn)算。
由于浮點(diǎn)數(shù)不是精確的值,所以涉及小數(shù)的比較和運(yùn)算要特別小心。
0.1 + 0.2 === 0.3
// false
0.3 / 0.1
// 2.9999999999999996
(0.3 - 0.2) === (0.2 - 0.1)
// false
數(shù)值范圍:
根據(jù)標(biāo)準(zhǔn),64位浮點(diǎn)數(shù)的指數(shù)部分的長(zhǎng)度是11個(gè)二進(jìn)制位,意味著指數(shù)部分的最大值是2047(2的11次方減1)。也就是說(shuō),64位浮點(diǎn)數(shù)的指數(shù)部分的值最大為2047,分出一半表示負(fù)數(shù),則 JavaScript 能夠表示的數(shù)值范圍為21024到2-1023(開區(qū)間),超出這個(gè)范圍的數(shù)無(wú)法表示。JS中可以表示的數(shù)字的最大值Number.MAX_VALUE,
Number.MIN_VALUE則表示0以上的最小值
如果一個(gè)數(shù)大于等于2的1024次方,那么就會(huì)發(fā)生“正向溢出”,即 JavaScript 無(wú)法表示這么大的數(shù),這時(shí)就會(huì)返回Infinity。
如果一個(gè)數(shù)小于等于2的-1075次方(指數(shù)部分最小值-1023,再加上小數(shù)部分的52位),那么就會(huì)發(fā)生為“負(fù)向溢出”,即 JavaScript 無(wú)法表示這么小的數(shù),這時(shí)會(huì)直接返回0。
Math.pow(2, -1075) // 0
下面是一個(gè)實(shí)際的例子。
var x = 0.5;
for(var i = 0; i < 25; i++) {
x = x * x;
}
x // 0
上面代碼中,對(duì)0.5連續(xù)做25次平方,由于最后結(jié)果太接近0,超出了可表示的范圍,JavaScript 就直接將其轉(zhuǎn)為0。
而如果在js小于-1.7976931348623157E+103088 的時(shí)候,就會(huì)表示為-Infinity.
Number當(dāng)中的特殊值:
1、正零和負(fù)零
JavaScript 的64位浮點(diǎn)數(shù)之中,有一個(gè)二進(jìn)制位是符號(hào)位。這意味著,任何一個(gè)數(shù)都有一個(gè)對(duì)應(yīng)的負(fù)值,就連0也不例外。
JavaScript 內(nèi)部實(shí)際上存在2個(gè)0:一個(gè)是+0,一個(gè)是-0,區(qū)別就是64位浮點(diǎn)數(shù)表示法的符號(hào)位不同。它們是等價(jià)的。
-0 === +0 // true
0 === -0 // true
0 === +0 // true
幾乎所有場(chǎng)合,正零和負(fù)零都會(huì)被當(dāng)作正常的0。
+0 // 0
-0 // 0
(-0).toString() // '0'
(+0).toString() // '0'
但是當(dāng)0和-0被充當(dāng)分母的時(shí)候,返回的值是不相等的。
(1 / +0) === (1 / -0) // false
上面的代碼之所以出現(xiàn)這樣結(jié)果,是因?yàn)槌哉愕玫?code>+Infinity,除以負(fù)零得到-Infinity,這兩者是不相等的。
2、NaN
NaN是 JavaScript 的特殊值,表示“非數(shù)字”(Not a Number),主要出現(xiàn)在將字符串解析成數(shù)字出錯(cuò)的場(chǎng)合。
console.log(5 - 'x'); //NaN
需要注意的是,NaN不是獨(dú)立的數(shù)據(jù)類型,而是一個(gè)特殊數(shù)值,它的數(shù)據(jù)類型依然屬于Number,使用typeof運(yùn)算符可以看得很清楚。
需要注意,
NaN是一個(gè)非常狠的角色,它連自己都不認(rèn),也就是說(shuō),如果你判斷NaN是否等于NaN,答案是否定的,也就是false,二者根本不相等。
3、Infinity
Infinity表示為無(wú)窮大。在js中,如果數(shù)值的內(nèi)容超過(guò)了js所能表示的范圍,就會(huì)輸出Infinity或者-Infinity。
Number當(dāng)中的全局方法:
1、parseInt()
parseInt方法用于將字符串轉(zhuǎn)為整數(shù)。
parseInt('123') // 123
如果字符串頭部有空格,空格會(huì)被自動(dòng)去除。
parseInt(' 81') // 81
如果parseInt的參數(shù)不是字符串,則會(huì)先轉(zhuǎn)為字符串再轉(zhuǎn)換。
parseInt(1.23) // 1
// 等同于
parseInt('1.23') // 1
字符串轉(zhuǎn)為整數(shù)的時(shí)候,是一個(gè)個(gè)字符依次轉(zhuǎn)換,如果遇到不能轉(zhuǎn)為數(shù)字的字符,就不再進(jìn)行下去,返回已經(jīng)轉(zhuǎn)好的部分。
parseInt('8a') // 8
parseInt('12**') // 12
parseInt('12.34') // 12
parseInt('15e2') // 15
parseInt('15px') // 15
上面代碼中,parseInt的參數(shù)都是字符串,結(jié)果只返回字符串頭部可以轉(zhuǎn)為數(shù)字的部分。
如果字符串的第一個(gè)字符不能轉(zhuǎn)化為數(shù)字(后面跟著數(shù)字的正負(fù)號(hào)除外),返回NaN。
parseInt('abc') // NaN
parseInt('.3') // NaN
parseInt('') // NaN
parseInt('+') // NaN
parseInt('+1') // 1
所以,parseInt的返回值只有兩種可能,要么是一個(gè)十進(jìn)制整數(shù),要么是NaN。
2、parseFloat()
parseFloat方法用于將一個(gè)字符串轉(zhuǎn)為浮點(diǎn)數(shù)。
parseFloat('3.14') // 3.14
如果字符串符合科學(xué)計(jì)數(shù)法,則會(huì)進(jìn)行相應(yīng)的轉(zhuǎn)換。
parseFloat('314e-2') // 3.14
parseFloat('0.0314E+2') // 3.14
如果字符串包含不能轉(zhuǎn)為浮點(diǎn)數(shù)的字符,則不再進(jìn)行往后轉(zhuǎn)換,返回已經(jīng)轉(zhuǎn)好的部分。
parseFloat('3.14more non-digit characters') // 3.14
parseFloat方法會(huì)自動(dòng)過(guò)濾字符串前導(dǎo)的空格。
parseFloat('\t\v\r12.34\n ') // 12.34
如果參數(shù)不是字符串,或者字符串的第一個(gè)字符不能轉(zhuǎn)化為浮點(diǎn)數(shù),則返回NaN。
parseFloat([]) // NaN
parseFloat('FF2') // NaN
parseFloat('') // NaN
parseFloat('1avc') // 1
parseFloat('a1') // NaN
上面代碼中,尤其值得注意,parseFloat會(huì)將空字符串轉(zhuǎn)為NaN。
這些特點(diǎn)使得parseFloat的轉(zhuǎn)換結(jié)果不同于Number函數(shù)。
parseFloat(true) // NaN
Number(true) // 1
parseFloat(null) // NaN
Number(null) // 0
parseFloat('') // NaN
Number('') // 0
parseFloat('123.45#') // 123.45
Number('123.45#') // NaN
3、isNaN()
isNaN方法可以用來(lái)判斷一個(gè)值是否為NaN。
isNaN(NaN) // true
isNaN(123) // false
但是,isNaN只對(duì)數(shù)值有效,如果傳入其他值,會(huì)被先轉(zhuǎn)成數(shù)值。比如,傳入字符串的時(shí)候,字符串會(huì)被先轉(zhuǎn)成NaN,所以最后返回true,這一點(diǎn)要特別引起注意。也就是說(shuō),isNaN為true的值,有可能不是NaN,而是一個(gè)字符串。
isNaN('Hello') // true
// 相當(dāng)于
isNaN(Number('Hello')) // true
4、isFinite()
isFinite方法返回一個(gè)布爾值,表示某個(gè)值是否為正常的數(shù)值。
isFinite(Infinity) // false
isFinite(-Infinity) // false
isFinite(NaN) // false
isFinite(undefined) // false
isFinite(null) // true
isFinite(-1) // true
除了Infinity、-Infinity、NaN和undefined這幾個(gè)值會(huì)返回false,isFinite對(duì)于其他的數(shù)值都會(huì)返回true。
String
將0個(gè)或者任意多個(gè)字符排列起來(lái)放在單引號(hào)或者雙引號(hào)當(dāng)中,就是一個(gè)字符串(String)。
var a = "hello,world!";
var b = 'hello,JavaScript!';
上面的變量a和b當(dāng)中存儲(chǔ)的數(shù)據(jù)就是字符串,其中一個(gè)使用了單引號(hào),一個(gè)使用了雙引號(hào),兩者都是合法的。
單引號(hào)字符串的內(nèi)部,可以使用雙引號(hào)。雙引號(hào)字符串的內(nèi)部,可以使用單引號(hào)。
'key = "value"'
"It's a long journey"
如果要在單引號(hào)字符串的內(nèi)部,使用單引號(hào),就必須在內(nèi)部的單引號(hào)前面加上反斜杠,用來(lái)轉(zhuǎn)義。雙引號(hào)字符串內(nèi)部使用雙引號(hào),也是如此。
'Did she say \'Hello\'?'
// "Did she say 'Hello'?"
"Did she say \"Hello\"?"
// "Did she say "Hello"?"
由于 HTML 語(yǔ)言的屬性值使用雙引號(hào),所以很多項(xiàng)目約定JavaScript語(yǔ)言的字符串只使用單引號(hào),在這套系列教程中會(huì)遵守這個(gè)約定。當(dāng)然,只使用雙引號(hào)也完全可以。重要的是堅(jiān)持使用一種風(fēng)格,不要一會(huì)使用單引號(hào)表示字符串,一會(huì)又使用雙引號(hào)表示。
字符串默認(rèn)只能寫在一行內(nèi),分成多行將會(huì)報(bào)錯(cuò)。
'a
b
c'
// SyntaxError: Unexpected token ILLEGAL
上面代碼將一個(gè)字符串分成三行,JavaScript 就會(huì)報(bào)錯(cuò)。
如果長(zhǎng)字符串必須分成多行,可以在每一行的尾部使用反斜杠。
var longString = 'Long \
long \
long \
string';
longString
// "Long long long string"
上面代碼表示,加了反斜杠以后,原來(lái)寫在一行的字符串,可以分成多行書寫。但是,輸出的時(shí)候還是單行,效果與寫在同一行完全一樣。注意,反斜杠的后面必須是換行符,而不能有其他字符(比如空格),否則會(huì)報(bào)錯(cuò)。
連接運(yùn)算符(+)可以連接多個(gè)單行字符串,將長(zhǎng)字符串拆成多行書寫,輸出的時(shí)候也是單行。
var longString = 'Long '
+ 'long '
+ 'long '
+ 'string';
Object(對(duì)象)
對(duì)象是一系列命名變量,函數(shù)的集合,其中變量的類型可以是基本類型也可以是復(fù)合類型,對(duì)象中的命名變量稱為屬性,而對(duì)象中的函數(shù)稱為方法。對(duì)象訪問(wèn)屬性和函數(shù)的方法是通過(guò)". "來(lái)實(shí)現(xiàn)的。
JavaScript是基于對(duì)象的腳本語(yǔ)言,它提供了大量的內(nèi)置對(duì)象供用戶使用,比如有以下內(nèi)置類:
Array:數(shù)組類
Date:日期類
Error:錯(cuò)誤類
Function:函數(shù)類
Math;數(shù)學(xué)類,該對(duì)象包含相當(dāng)多的執(zhí)行數(shù)學(xué)運(yùn)算的方法
Number:數(shù)值類
Object:對(duì)象類
String:字符串類
<script type="text/javascript">
var person=new Object();
person.firstname="John";
person.lastname="Doe";
person.age=50;
person.eyecolor="blue";
document.write(person.firstname + " is " + person.age + " years old.");
</script>
宿主對(duì)象
由JS的運(yùn)行環(huán)境提供的對(duì)象,目前來(lái)講主要指瀏覽器提供的對(duì)象,比如BOM、DOM。
自定義對(duì)象
由開發(fā)人員自己創(chuàng)建的對(duì)象。
Array(數(shù)組)
數(shù)組是一系列的變量,數(shù)組中的變量的類型可以不相同。定義一個(gè)數(shù)字有以下三種語(yǔ)法:
Var a = [1,2,3,]
Var b = [ ];
Var c = new Array();
第一種在定義數(shù)組時(shí)已經(jīng)對(duì)數(shù)組進(jìn)行初始化,第二種和第三種都只是創(chuàng)建了一個(gè)空數(shù)組。
<script type="text/javascript">
var a = [3,5,23];
var b = [];
var c = new Array();
b[0] = 'hello';
b[1] = 6;
c[5] = true;
c[7] = null;
document.write(a + "\n" + b + "\n" + c +"<br/>");
document.write("a數(shù)組的長(zhǎng)度為:" +a.length +"<br/>");
document.write("b數(shù)組的長(zhǎng)度為:" +b.length +"<br/>");
document.write("c數(shù)組的長(zhǎng)度為:" +c.length +"<br/>");
</script>
JavaScript作為動(dòng)態(tài)的,弱類型語(yǔ)言,有以下3個(gè)特征:
- JavaScript的數(shù)組長(zhǎng)度可變。數(shù)組長(zhǎng)度總等于所有元素索引最大值+1
- 同一個(gè)數(shù)組中的元素類型可以互不相同
訪問(wèn)數(shù)組元素時(shí)不會(huì)產(chǎn)生數(shù)組越界,訪問(wèn)并未賦值的數(shù)組元素時(shí),該元素的值為undefined。 - JavaScript中的數(shù)組本身就是一個(gè)功能十分強(qiáng)大的“容器”,它不僅僅可以代表數(shù)組,而且可以作為長(zhǎng)度可變的線性表使用,還可以作為棧使用,也可以作為隊(duì)使用。
JavaScript中數(shù)組作為棧使用的兩個(gè)方法如下:
- push(ele):元素入棧,返回入棧后的數(shù)組的長(zhǎng)度。
- pop():元素出棧,返回出棧的數(shù)組元素。
JavaScript中數(shù)組作為隊(duì)列使用的兩個(gè)方法:
- unshift():元素入隊(duì)列,返回入隊(duì)列后數(shù)組的長(zhǎng)度。
- shift():元素出隊(duì)列,返回出隊(duì)列的數(shù)組元素。
<script type="text/javascript">
var stack = [];
stack.push("百度");
stack.push("阿里巴巴");
console.log(stack.pop());
console.log(stack.pop());
var queue = [];
queue.unshift("淘寶");
queue.unshift("京東");
console.log(queue.shift());
console.log(queue.shift());
</script>
此外,Array對(duì)象還定義了如下的方法:
- concat(value,....):為元素添加一個(gè)或多個(gè)元素,該方法返回追加元素后得到的數(shù)組,但原數(shù)組并不改變。
- join():將數(shù)組的多個(gè)元素拼接在一塊,組成字符串返回。
- reverse():反轉(zhuǎn)數(shù)組包含的元素。
- slice(start,end):截取數(shù)組在開始索引和結(jié)束索引之間的子數(shù)組,該方法返回截取得到的數(shù)組,但是原數(shù)組并不改變。
- sort():將數(shù)組元素進(jìn)行排序。
- Splice(start,delcount,value):截取一個(gè)字符串,從開始索引開始,刪除delcount個(gè)元素,再將新的value值追加到數(shù)字中,該方法返回?cái)?shù)組被截取部分組成的新數(shù)組。
function(函數(shù))
JavaScript中的函數(shù)類型有返回值,但是無(wú)返回類型。函數(shù)中可以包含一段可執(zhí)行的代碼,也可以接受調(diào)用者傳入?yún)?shù)。JavaScript的函數(shù)聲明中,參數(shù)列表不需要數(shù)據(jù)類型聲明,函數(shù)的返回值也不需要聲明數(shù)據(jù)類型。
function judgeAge( age ){
if(typeof age === "number"){
if(age > 60){
alert('老年人');
}else if(age > 40){
alert('中年人');
}else if(age > 15){
alert('青年人');
}else{
alert('兒童');
}
}else{
alert('參數(shù)必須為數(shù)值');
}
}
judgeAge(55);
轉(zhuǎn)義字符:
反斜杠()在字符串內(nèi)有特殊含義,用來(lái)表示一些特殊字符,所以又稱為轉(zhuǎn)義符。
需要用反斜杠轉(zhuǎn)義的特殊字符,主要有下面這些。
-
\0:null(\u0000) -
\b:后退鍵(\u0008) -
\f:換頁(yè)符(\u000C) -
\n:換行符(\u000A) -
\r:回車鍵(\u000D) -
\t:制表符(\u0009) -
\v:垂直制表符(\u000B) -
\':?jiǎn)我?hào)(\u0027) -
\":雙引號(hào)(\u0022) -
\\:反斜杠(\u005C)
如果在一個(gè)正常的字符前面加了\,是沒(méi)有效果的。
console.log("\a"); //輸出a