JavaScript基本概念(2)

上期連接

4. 數(shù)據(jù)類型

ECMAScript中有5中簡(jiǎn)單數(shù)據(jù)類型:Undefined、null、Boolean、Number和String。還有1種復(fù)雜數(shù)據(jù)類型——Object。

4.1 typedof操作符

  • “undefined”這個(gè)值未定義
  • “boolean”這個(gè)值是布爾值
  • “string”這個(gè)值是字符串
  • “number”這個(gè)值是數(shù)值
  • “object”這個(gè)值是對(duì)象或null
  • “function”這個(gè)值是函數(shù)
var message = "some string";
alert(typeof message);  //"string"
alert(typeof(message));  //"string"
alert(typeof 90);  //"number"
alert(typeof null);  //"object",特殊值null被認(rèn)為是一個(gè)空的對(duì)象引用

typeof操作符的操作數(shù)可以使變量,也可以是數(shù)值字面量。注意,typeof是一個(gè)操作符而不是函數(shù),所以例子中的括號(hào)并不是必須使用的

從技術(shù)角度講,函數(shù)在ECMAScript中是對(duì)象,不是一種數(shù)據(jù)類型。然而,函數(shù)確實(shí)有一些特殊的屬性,因此通過(guò)typeof操作符來(lái)區(qū)分函數(shù)和其他對(duì)象是有必要的

4.2 Undefined類型

在使用var生命變量但是并沒(méi)有進(jìn)行賦值時(shí),變量的值是Undefined。

var message;
alert(message == undefined) ;  //true

var message = undefined;
alert(message == undefined);  //true

上述兩個(gè)變量聲明是等價(jià)的,但是并不需要對(duì)變量進(jìn)行顯示undefined初始化。但是包含undefined值的變量與未聲明的變量也并不相同。

//下面message變量并沒(méi)有聲明
//var message;
var age = undefined;
alert(message);  //產(chǎn)生錯(cuò)誤
alert(age);  //"undefined"
//下面message變量并沒(méi)有聲明
//var message;
var age = undefined;
alert(typeof message);  //"undefined"
alert(typeof age);  //"undefined"

即使未初始化的變量會(huì)自動(dòng)被賦予undefined值,但顯示地初始化變量依然是明智的選擇。如果能夠做到這一點(diǎn),那么當(dāng)typeof操作符返回"undefined"值時(shí),我們就知道被監(jiān)測(cè)的變量還沒(méi)有被生命,而不是尚未初始化。

4.3 null類型

var car = null;
alert(typeof car);  //"object"
if(car != null){
    //  對(duì)car對(duì)象執(zhí)行某些操作
}

如果定義的變量準(zhǔn)備在將來(lái)用于保存對(duì)象,那么最好將變量初始化為null而不是其他值。因?yàn)橹灰苯訖z查null值就可以知道相應(yīng)的變量是否已經(jīng)保存了一個(gè)對(duì)象的引用。

undefined值時(shí)派生自null值的,因此ECMA-262規(guī)定對(duì)它們的相等性測(cè)試要返回true

alert(undefined == null);  //true

4.4 Boolean類型

數(shù)據(jù)類型 轉(zhuǎn)換為true的值 轉(zhuǎn)換為false的值
Boolean true false
String 熱河非空字符串 ""(空字符串)
Number 任何非零數(shù)字值(包括無(wú)窮大) 0和NAN
Object 任何對(duì)象 null
Undefined n/a(not applicable不適用) undefined

4.5 Number類型

該類型使用IEEE754格式來(lái)表示整數(shù)和浮點(diǎn)數(shù)值。在進(jìn)行算數(shù)計(jì)算時(shí),所有以八進(jìn)制和十六進(jìn)制表示的數(shù)值最終都將被轉(zhuǎn)換成十進(jìn)制數(shù)值

鑒于JavaScript中保存數(shù)值的方式,可以保存正零(+0)和負(fù)零(-0)。正零和負(fù)零被認(rèn)為是相等,但為了讀者更好地理解上下文,這里特別作此說(shuō)明。

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

保存浮點(diǎn)數(shù)值需要的內(nèi)存空間是保存整數(shù)值的兩倍,因此ECMAScript會(huì)不失時(shí)機(jī)地將浮點(diǎn)數(shù)值轉(zhuǎn)換為整數(shù)值。例如:

//如果小數(shù)點(diǎn)后沒(méi)有跟任何數(shù)字,或者數(shù)值本身就是一個(gè)整數(shù)的話,會(huì)轉(zhuǎn)換為整數(shù)。
var floatNum1 = 1.;  //小數(shù)點(diǎn)后沒(méi)有數(shù)字——解析為1
var floatNum2 = 10.0;  //整數(shù)——解析為10

數(shù)值極大或極小的數(shù)值,可以使用科學(xué)記數(shù)法,例如:

var floatNum3 = 3.125e7;  //31250000
//ECMAScript會(huì)將那些小數(shù)點(diǎn)后面帶有6個(gè)零以上的浮點(diǎn)值轉(zhuǎn)換為以科學(xué)記數(shù)法表示的值
var floatNum4 = 3e-7;  //0.0000003

浮點(diǎn)數(shù)值的最高精度是17位小數(shù),但在進(jìn)行算數(shù)計(jì)算時(shí)其精確度遠(yuǎn)遠(yuǎn)不如整數(shù)。例如:

//0.1+0.2的結(jié)果不是0.3,而是0.30000000000000004
var a = 0.1;
var b = 0.2;
if(a + b == 0.3)  //0.1+0.2永遠(yuǎn)不可能等于0.3,所以不要寫(xiě)這樣子的判斷語(yǔ)句
{
    alert("you got 0.3!");
}
else
{
    alert(a + b);
}

關(guān)于浮點(diǎn)數(shù)值計(jì)算會(huì)產(chǎn)生舍入誤差的問(wèn)題,有一點(diǎn)需要明確:這是使用基于IEEE754數(shù)值的浮點(diǎn)計(jì)算的通病。

4.5.2 數(shù)值范圍

ECMAScript能夠表示的最小數(shù)值保存在Number.MIN_VALUE中,這個(gè)值是5e-324。最大值保存在Number.MAX_VALUE,這個(gè)值1.7976931348623157e+308。

var minNum = Number.MIN_VALUE;
alert(minNum);  //5e-324
var maxNum = Number.MAX_VALUE;
alert(maxNum);  //1.7976931348623157e+308

如果超出這個(gè)數(shù)值范圍,如果是負(fù)數(shù),會(huì)被轉(zhuǎn)換成-Infinity。如果是正數(shù),會(huì)被轉(zhuǎn)換成Infinity。但是,Infinity是不能參與計(jì)算的,可以使用isInfinity()函數(shù),來(lái)判斷數(shù)值是否是無(wú)窮大的。例如:

var num = 5;
alert(isFinite(num));  //true
var result = Number.MAX_VALUE + Number.MIN_VALUE;
alert(isFinite(result));  //false

訪問(wèn)Number.NEGATIVE_INFINITY和Number.POSITIVE_INFINITY也可以得到負(fù)和正Infinity。

4.5.3 NaN

NaN(not a number)是一個(gè)特殊的數(shù)值。這個(gè)數(shù)值用于表示一個(gè)本來(lái)要返回?cái)?shù)值的操作數(shù)未返回?cái)?shù)值的情況(這樣就不會(huì)拋出錯(cuò)誤了)。
NaN本身有兩個(gè)特點(diǎn)。

  • 任何設(shè)計(jì)NaN的操作(例如NaN/10)都會(huì)返回NaN,這個(gè)特點(diǎn)在多步計(jì)算中有可能導(dǎo)致問(wèn)題
  • NaN與任何值都不相等,包括NaN本身。例如:
    alert(NaN == NaN); //false

ECMAScript定義了isNaN()函數(shù),這個(gè)函數(shù)接收一個(gè)參數(shù),該參數(shù)可以是任何類型,而函數(shù)會(huì)幫我們確定這個(gè)參數(shù)是否”不是數(shù)值“。例如:

alert(isNaN(NaN));  //true
alert(isNaN(10));  //false(10是一個(gè)整數(shù))
alert(isNaN("10"));  //false(可以被轉(zhuǎn)為成數(shù)值10)
alert(isNaN("blue"));  //true(不能被轉(zhuǎn)換成數(shù)值)
alert(isNaN(true));  //false(可以被轉(zhuǎn)換成數(shù)值1)

isNaN()確實(shí)適用于對(duì)象。在基于對(duì)象調(diào)用isNaN()函數(shù)時(shí),會(huì)首先調(diào)用valueOf()方法,然后確定該方法返回的值是否可以轉(zhuǎn)換為數(shù)值。如果不能,則基于這個(gè)返回值再調(diào)用toString()方法,再測(cè)試返回值。

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

有3個(gè)函數(shù)可以把非數(shù)值轉(zhuǎn)換為數(shù)值:Number(),parseInt()和parseFloat()。轉(zhuǎn)型Number()可以用于任何數(shù)據(jù)類型,而另兩個(gè)函數(shù)則專門用于把字符串轉(zhuǎn)換成數(shù)值。

Number()函數(shù)的轉(zhuǎn)換規(guī)則如下:
  • 如果是Boolean值,true和false將分別轉(zhuǎn)換為1和0
  • 如果是數(shù)字值,只是簡(jiǎn)單的傳入和返回
  • 如果是null值,返回0
  • 如果是undefined,返回NaN
  • 如果是字符串,遵循下列規(guī)則:

①. 如果字符串中只包含數(shù)字(包括前面的正負(fù)號(hào)),將其轉(zhuǎn)換為十進(jìn)制數(shù)值。前導(dǎo)的零會(huì)被忽略。
②. 如果字符串中包含有效的十六進(jìn)制格式,則將其轉(zhuǎn)換為相同大小的十進(jìn)制數(shù)值。
③. 如果字符串是空的(不包含任何字符),則將其轉(zhuǎn)換為0。
④. 如果字符串中包含除上述格式之外的字符則將其轉(zhuǎn)換為NaN。

  • 如果是對(duì)象,則調(diào)用對(duì)象的valueOf()方法,然后依照前面的規(guī)則轉(zhuǎn)換返回的值。如果轉(zhuǎn)換的的結(jié)果是NaN,則調(diào)用對(duì)象的toString()方法,然后再次依照前面的規(guī)則轉(zhuǎn)換返回的字符串值
var num1 = Number(true);  //1
var num2 = Number(50);  //50
var num3 = Number(null) ;  //0
var num4 = Number("0000011");  //11,前導(dǎo)的0都被忽略了
var num5 = Number("0xf");  //15,十六進(jìn)制可以成功轉(zhuǎn)換
var num6 = Number("");  //0,空字符串會(huì)轉(zhuǎn)換為0
var num7 = Number("Hello World!");  //NaN
parseInt()函數(shù)的轉(zhuǎn)換規(guī)則如下:

忽略字符串前面的空格,直至找到第一個(gè)非空格字符。如果第一個(gè)字符不是數(shù)字字符或者負(fù)號(hào),parseInt()會(huì)返回NaN。parseInt()遇到空字符串返回NaN,Number()遇到空字符串返回0**

var num1 = parseInt("1234hello");  //1234
var num2 = parseInt("");  //NaN
var num3 = parseInt("0xA");  //10(十六進(jìn)制)
var num4 = parseInt(22.5);  //22
var num5 = parseInt("070");  //56(八進(jìn)制)
var num6 = parseInt("70");  //70(十進(jìn)制)
var num7 = parseInt("0xf");  //15(十六進(jìn)制)

ECMAScript 3和5存在分歧,例如:

var num = parseInt("070"); 
//ECMAScript 3可以進(jìn)行八進(jìn)制解析,認(rèn)為是56;但是5不行,認(rèn)為是70

為了解決以上問(wèn)題,parseInt()引入第二個(gè)參數(shù)。轉(zhuǎn)換時(shí)的基數(shù)。

var num = parseInt("0xAF",16);  //175
//如果指定16作為第二個(gè)基數(shù),字符串可以不帶前面的"0x"
var num1 = parseInt("AF",16);  //175
vat num2 = parseInt("AF");  //NaN
parseFloat()函數(shù)的轉(zhuǎn)換規(guī)則如下:
  • 始終忽視前導(dǎo)零
  • 第一個(gè)小數(shù)點(diǎn)有效
  • 十六進(jìn)制的字符串始終返回0
  • 只解析十進(jìn)制
  • 如果解析結(jié)果是一個(gè)整數(shù),則返回整數(shù)
var num1 = parseFloat("1234hello");  //1234
var num2 = parseFloat("0xA");  //0
var num3 = parseFloat("22.5");  //22.5
var num4 = parseFloat("22.34.5");  //22.34。
var num5 = parseFloat("0809.5");  //809.5
var num6 = parseFloat("3.125e7");  //31250000
4.6 String類型

單引號(hào)開(kāi)頭的字符串必須以單引號(hào)結(jié)尾,雙引號(hào)開(kāi)頭的字符串也必須以雙引號(hào)結(jié)尾

4.6.1 字符串面量
字面量 含義
\n 換行
\t 制表
\b 退格
\r 回車
\f 進(jìn)紙
|斜杠
' 單引號(hào)('),在用單引號(hào)表示的字符串中使用.例如:'He said,'hey.''
" 雙引號(hào)("),在用雙引號(hào)表示的字符串中使用.例如:"He said,"hey.""
\xnn 以十六進(jìn)制代碼nn表示的一個(gè)字符(其中n為0~F)。例如,\x41表示"A"
\unnnn 以十六進(jìn)制代碼nnnn表示的一個(gè)Unicode字符(其中n為0~F)。例如,\u03a3表示希臘字母Σ

任何字符串的長(zhǎng)度都可以通過(guò)訪問(wèn)其length屬性取得,如果有雙字節(jié)字符,返回就不會(huì)很精確。

4.6.2 轉(zhuǎn)換字符串

布爾型轉(zhuǎn)換

var found = true;
var foundAsString = found.toString()  //字符串"true"

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

var num = 10;
alert(num.toString());  //"10"
alert(num.toString(2));  //"1010"
alert(num.toString(8));  //"12"
alert(num.toString(10));  //10"
alert(num.toString(16));  //"A"

在不知道要轉(zhuǎn)換的值是不是null或undefined的情況下,可以使用轉(zhuǎn)型函數(shù)String(),注意一下規(guī)則:

  • 如果值有toString()方法,則調(diào)用該方法(沒(méi)有參數(shù))并返回相應(yīng)的結(jié)果
  • 如果值是null,則返回"null"
  • 如果值是undefined,則返回"undefined"
var value1 = 10;
var value2 = true;
var value3 = null;
var value4;
alert(String(value1));  //"10"
alert(String(value2));  //"true"
alert(String(value3));  //"null"
alert(String(value4));  //"undefined"
4.7 Object類型

Object的每個(gè)示例都具有下列屬性和方法:

  • constructor:保存著用于創(chuàng)建當(dāng)前對(duì)象的函數(shù)。對(duì)于前面的例子而言,構(gòu)造函數(shù)(constructor)就是Object()
  • hasOwnProperty(propertyName):用于檢查給定的屬性在當(dāng)前對(duì)象實(shí)例中(而不是在實(shí)例的原型中)是否存在。其中,作為參數(shù)的屬性名(propertyName)必須以字符串形式指定(例如:o.hasOwnProperty("name"))。
  • isPrototypeOf(object):用于檢查傳入的對(duì)象是否是當(dāng)前對(duì)象的原型
  • propertyIsEnumerable(propertyName):用于檢查給定的屬性是否能夠使用for-in語(yǔ)句來(lái)進(jìn)行枚舉。與hasOwnProperty()方法一樣,作為參數(shù)的屬性名必須以字符串形式指定
  • toLocaleString():返回對(duì)象的字符串表示,該字符串與執(zhí)行環(huán)境的地區(qū)對(duì)應(yīng)
  • toString():返回對(duì)象的字符串表示
  • valueOf():返回對(duì)象的字符串、數(shù)值或布爾值表示。通常與toString()方法的返回值相同

下期連接

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

相關(guān)閱讀更多精彩內(nèi)容

  • 什么是 JavaScript 語(yǔ)言? JavaScript 是一種輕量級(jí)的腳本語(yǔ)言。所謂“腳本語(yǔ)言”(script...
    oWSQo閱讀 1,915評(píng)論 0 1
  • 本章內(nèi)容 語(yǔ)法 數(shù)據(jù)類型 流控制語(yǔ)句 理解函數(shù) 3.1 語(yǔ)法 3.1.1 區(qū)分大小寫(xiě) 區(qū)分大小寫(xiě) 3.1.2 標(biāo)識(shí)...
    悶油瓶小張閱讀 798評(píng)論 0 0
  • 不知不覺(jué)已經(jīng)愛(ài)上了用文字表達(dá)自己的心情和當(dāng)下所思所想。 這兩年過(guò)得特別不好,事業(yè)不順心,身邊知心的朋友則越來(lái)越少,...
    周利蓉Amerry閱讀 502評(píng)論 1 0
  • 我是抑郁癥患者 白天啊,總是美好的可憐,我擁擠在人群里搜索想要的安慰。夜晚,我是一個(gè)人如此掙扎煎熬的度過(guò),我總希望...
    i鹿小妖閱讀 692評(píng)論 2 8

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