每天學點原生JavaScript(三)數(shù)據類型
五種基本數(shù)據類型:Undefined
、Null
、Boolean
慌植、Number
假瞬、String
。
一種復雜數(shù)據類型:Object
喳坠。
注意:
Function
和Array
是一種特殊的Object
鞠评。可以使用typeof
操作符來區(qū)分數(shù)據類型壕鹉。
1. Undefined類型
Undefined類型是有一個特殊的值undefined
剃幌。在使用var
聲明后但未對其進行初始化時,這個變量的值就是undefined晾浴。使用typeof
操作符會返回undefined
负乡。
注意:未聲明和未初始化的變量執(zhí)行
typeof
操作符都返回undefined
。對于未聲明變量脊凰,只能執(zhí)行typeof
這一操作抖棘,其他操作都會報錯。
2. Null類型
Null類型是第二個只有一個值的數(shù)據類型,這個值就是null
钉答。null是一個空對象础芍,所以使用typeof
操作符會返回object
。
注意:undefined值派生自null值数尿,所以相等性測試返回true仑性,即
null == undefined
返回true
。
3. Boolean類型
Boolean類型有兩個字面量:true
和false
右蹦。所有類型的值都會與這兩個Boolean
值有等價的值诊杆,即調用轉型函數(shù)Boolean()
。
轉換規(guī)則:
- Boolean類型:
true
轉換為true
何陆,false
轉換為false
晨汹; - String類型:
非空字符串
轉換為true
,空字符串
轉換為false
贷盲; - Number類型:
非零數(shù)字值
轉換為true
淘这,0
和NaN
轉換為false
; - Object類型:
非空對象
轉換為true
巩剖,null
轉換為false
铝穷; - Undefined類型:
undefined
轉換為false
。
注意:Boolean值是區(qū)分大小寫的佳魔,即True和False都不是Boolean值曙聂。
4. Number類型
Number支持各種數(shù)值類型,包含十進制
鞠鲜、八進制
和十六進制
宁脊,嚴格模式下八進制是無效的。進行算術計算時贤姆,所有八進制和十六進制數(shù)值最終都將被轉換成十進制數(shù)值榆苞。
注意:JavaScript中可以報錯正零
+0
和負零-0
,正零和負零被認為相等霞捡。
浮點數(shù)值
浮點數(shù)值即數(shù)值中必須包含一個小數(shù)點语稠,且小數(shù)點后面至少有一位數(shù)字。雖然小數(shù)點前面可以沒有整數(shù)弄砍,但不推薦這么做仙畦。
由于浮點數(shù)值需要的內存空間是保存整數(shù)數(shù)值的兩倍,所以ECMAScript會在適時的情況下將他轉換成整數(shù)值音婶。對于極大或極小的浮點數(shù)慨畸,會使用科學計數(shù)法進行表示。
var floatNum = .1; // 有效衣式,但不推薦
var floatNum = 10.0; // 解析后為10
var floatNum = 3.125e7; // 等于31250000
注意:浮點數(shù)值得最高精度是17位小數(shù)寸士,但在算術計算時其精確度遠遠不如整數(shù)檐什。浮點數(shù)計算會產生舍入誤差的問題,這是基于IEEE754數(shù)值的浮點計算的通病弱卡。
數(shù)值范圍
由于內存的限制乃正,ECMAScript并不能保存世界上所有的數(shù)值。在大多數(shù)瀏覽器中婶博,最大值和最小值如下:
Number.MIN_VALUE
:5e-324瓮具;
Number.MAX_VALUE
:1.7976931348623157e+308。
如果超過可這個數(shù)值范圍凡人,則會被轉換成負無窮-Infinity
和正無窮+Infinity
名党。可以使用isFinite()
函數(shù)來判斷挠轴,函數(shù)的參數(shù)在最大值和最小值之間會返回true
传睹。
NaN
即非數(shù)值(Not a Number),這個值用來表示一個本來要返回數(shù)值的操作卻未返回數(shù)值的情況岸晦。具有兩個特點:
- 涉及
NaN
的任何操作都會返回NaN
欧啤; -
NaN
的值與任何值都不相等,包含NaN
本身启上。
我們可以使用isNaN()
函數(shù)來判斷是否“不是數(shù)值”堂油。即返回true
說明傳入參數(shù)不是數(shù)值且不能轉換成數(shù)值。
數(shù)值轉換
數(shù)值轉換的函數(shù)有三個:Number()
碧绞、parseInt()
和parseFloat()
。第一個可以用于任何數(shù)據類型吱窝,而另外兩個則專門用于把字符串轉換成數(shù)值讥邻。
Number()
函數(shù)轉換規(guī)則:
- Boolean類型:
true
和false
分別被轉換為1
和0
; - Number類型:只是簡單的傳入和返回院峡;
- Null類型:返回
0
兴使; - Undefined類型:返回
NaN
; - String類型:如果字符串只包含數(shù)字照激,則將其轉換成
十進制數(shù)值
发魄;如果字符串包含有效的浮點數(shù)值,則將其轉換成對應的浮點數(shù)值
俩垃;如果字符串包含有效的十六進制格式励幼,則將其轉換為相等大小的十進制數(shù)值
;如果是空字符串口柳,則轉換為0
苹粟;如果包含上述格式以外的字符,則將其轉換為NaN
跃闹; - Object類型:會調用
valueOf()
方法嵌削,然后依照上面的規(guī)則轉換返回的值毛好;如果轉換的結果是NaN,則調用toString()
方法苛秕,然后再依照前面的規(guī)則返回字符串值肌访。
var num = Number("hello"); // NaN
var num = Number(""); // 0
var num = Number("0011"); // 11
var num = Number(true); // 1
由于Number()
函數(shù)轉換字符串時復雜且不夠合理,因此在處理整數(shù)時更常用parseInt()
函數(shù)艇劫。轉換規(guī)則如下:
- 會忽略字符串前面的空格吼驶,直到找到第一個非空格字符串;
- 如果第一個不是數(shù)字字符或負號港准,就返回
NaN
旨剥; - 空字符串:
parseInt()
返回NaN
;Number
返回0
浅缸; - 從第一個數(shù)字字符開始解析轨帜,直到遇到一個非數(shù)字字符,后面的字符會被忽略衩椒;
- 浮點數(shù):小數(shù)點之后的會被忽略蚌父;
- 參數(shù):
parseInt()
第一個參數(shù)為字符串,第二個參數(shù)為轉換時使用的基數(shù)毛萌,即多少進制苟弛。
var num = parseInt("1234blue"); // 1234
var num = parseInt(""); // NaN
var num = parseInt(22.5); // 22
var num = parseInt("0xA"); // 10(十六進制)
var num = parseInt("070"); // 10(八進制)
var num = parseInt("0xAF", 16); // 175
var num = parseInt("AF", 16); // 175
var num = parseInt("AF"); // NaN
parseFloat()
類似,也是從第一個字符開始解析阁将,字符串中第一個小數(shù)點有效膏秫,其余的無效。
- 字符串中第一個小數(shù)點有效做盅,第二個就無效了缤削;
- 十六進制字符串始終被轉換為
0
; - 只能解析十進制數(shù)值吹榴,因此沒有第二個參數(shù)亭敢;
- 如果字符串包好一個可以解析為整數(shù)的數(shù)值,則會返回整數(shù)图筹。
var num = parseFloat("1234blue"); // 1234
var num = parseFloat("0xA"); // 0
var num = parseFloat("22.5"); // 22.5
var num = parseFloat("22.5.5"); // 22.5
var num = parseFloat("3.125e7"); // 31250000
5. String類型
用于表示由零活多個16位Unicode字符組成的字符序列帅刀,即字符串≡妒#可以由雙引號"
或單引號'
表示扣溺。字符串一旦創(chuàng)建就是不可變的,要改變只能銷毀后重新創(chuàng)建瓜晤〗考耍可以使用length
屬性訪問其長度。
字符字面量
-
\n
:換行活鹰; -
\t
:制表哈恰; -
\b
:退格只估; -
\r
:回車; -
\f
:進紙着绷; -
\\
:斜杠蛔钙; -
\'
:單引號,在單引號表示的字符串中使用荠医; -
\"
:雙引號吁脱,在雙引號表示的字符串中使用; -
\xnn
:以十六進制代碼nn表示一個字符彬向,n為0~F兼贡; -
\unnn
:以十六進制代碼nnnn表示Unicode字符,n為0~F娃胆。
字符串轉換
將一個值轉換成字符串有兩種方式:toString()
和String()
遍希。toString()
和String()
方法的區(qū)別是前置不能轉換null
和undefined
,而后者可以里烦。
toString()
可以傳遞一個參數(shù):輸出數(shù)值的基數(shù)凿蒜,即多少進制。
var num = 10;
num.toString(); // "10"(十進制)
num.toString(2); // "1010"(二進制)
var flag = true;
flag.toString(); // "true"
String()
轉換規(guī)則:
- 如果值有
toString()
方法胁黑,則調用該方法并返回相應的結果废封; - 如果值是
null
,返回"null"
丧蘸; - 如果值是
undefined
漂洋,返回"undefined"
。
6. Object類型
ECMAScript中的對象其實就是一組數(shù)據和功能的集合力喷。在ECMAScript中刽漂,Object類型是所有它的實例的基礎。
Object的每個實例都具有下列屬性和方法:
-
constructor()
:保存著用于創(chuàng)建當前對象的函數(shù)冗懦,即構造函數(shù); -
hasOwnProperty(propertyName)
:用于檢查給定的屬性在當前對象實例中(而不是在實例的原型中)是否存在仇祭。屬性名以字符串格式傳入披蕉; -
isPrototypeOf(object)
:用于檢查傳入的對象是否是當前對象的原型; -
propertyIsEnumerable(propertyName)
:用于檢查給定的屬性是否能夠使用for-in
語句類枚舉乌奇; -
toLocaleString()
:返回對象的字符串表示没讲,該字符串與執(zhí)行環(huán)境的地區(qū)對應; -
toString()
:返回對象的字符串表示礁苗; -
valueOf()
:返回對象的字符串爬凑、數(shù)值或布爾值表示。通常與toString()
返回值相同试伙。
歡迎大佬糾錯指導嘁信,歡迎同行交流學習于样。
GitHub:https://github.com/Code4GL
簡書:http://www.reibang.com/u/7f5541a6b6d2
知乎:https://www.zhihu.com/people/code4gl/activities
公眾號:code_everything
QQ:771841496
郵箱:guanli1991@163.com