在Javascript中,數據類型分爲基本數據類型和引用數據類型兩大類,其中,Array和Function在本質上仍然是一種特殊的對象:javascript
基本類型: String / Number / Boolean / Null / Undefined
引用類型: Object / Array / Functionjava
ES6中引入了一種新的基本數據類型Symbol,表示獨一無二的值,這裏暫不做討論
對於js中數據類型的判斷,能夠用typeof方法:es6
typeof '' // string typeof 1 // number typeof false // boolean typeof null // object typeof undefined // undefined typeof {a: 1} // object typeof [] // object typeof function(){} // function
其中,null做爲基本類型之一,爲何類型返回爲object,這裏作了一些解答。模塊化
另外,也可使用如下方法做爲判斷依據,這裏不作贅述。函數
instanceof // A instanceof B, 檢測A是否爲B的實例 toString // 做爲object的原型方法,經過Object.prototype.toString().call('')返回[object Xxx],可得數據類型 constructor // 當重寫prototype後,原有的constructor引用會丟失,constructor會默認爲object
接下來,對各類js基本數據類型對經常使用處理方法作一下簡要對概述,並重點講一下在ES6中帶來的新的處理方法。ui
字符串是js中最多見的數據類型,一樣,咱們對其運用到的處理方法也是最多的,如下是ES5中,針對string的最經常使用處理方法:prototype
concat( ) / indexOf( ) / replace( ) / slice( ) / split( ) / toUpperCase( )
在ES6中,又爲字符串增添了一些新的方法和API,首先增長了includes( )等三個方法,做爲對以前indexOf( )方法對補充:code
let str = 'need sleep early'; str.includes('d sleep e'); //true str.startsWith('nee'); //true; str.endsWith('earl'); //false;
'hello'.repeat(2) // "hellohello" 'world'.repeat(0) // ""
let str = 'E' str.padStart(5, 'abc') //"abcaE" str.padStart(5, 'abcdefg') //"abcdE" str.padEnd(5, 'abc') //"Eabca" str.padEnd(5, 'abcdefg') //"Eabcd"
for (let singleChar of 'Chunhui') { console.log(singleChar) } // "C" // "h" // "u" // "n" // "h" // "u" // "i"
遍歷字符串接口能夠代替傳統的split( ) + forEach( )的方式,除此以外,ES6中的遍歷器還能夠識別大於0xFFFF的碼點,這是傳統的for循環作不到的。另外,ES6中還給字符串帶來了一些其餘的處理方法,詳情能夠去阮一峯的ECMAScript6入門中索引。對象
衆所周知,相比較於Java,javascript中number類型的使用要方便許多,沒有int,long,float,double等類型,根據IEEE 754標準,js數字始終以64位雙精度浮點數來存儲,其中:索引
值(Fraction/Mantissa) | 指數 | 符號 |
---|---|---|
52 bits(0 - 51) | 1 bit (63) | 11 bits (52 - 62) |
正是由於64位浮點數的精度不足的問題,致使number類型常常會出現一些匪夷所思的計算問題,如
console.log(0.2 + 0.1) // 輸出0.30000000000000004 console.log(0.4 + 0.1) // 輸出0.5 console.log(0.7 + 0.1) // 輸出0.7999999999999999
關於number類型的精度問題,下次會專門寫一篇文章進行分析,此次先講一下在ES5中,number類型的一些經常使用的處理方法:
toString( ) / toFixed( ) / toPrecision( ) / parseInt( ) / parseFloat( )
在ES6中,對number類型的處理方法作了擴展,提供了一些新的方法:
Number.isFinite(10); // true Number.isFinite(NaN); // false Number.isFinite(Infinity); // false Number.isNaN(15) // false Number.isNaN('15') // false Number.isNaN(NaN) // true
它們與傳統的全局方法isFinite()和isNaN()的區別在於,傳統方法先調用Number()將非數值的值轉爲數值,再進行判斷,而這兩個新方法只對數值有效,Number.isFinite()對於非數值一概返回false, Number.isNaN()只有對於NaN才返回true,非NaN一概返回false。ES6將上面的ES5中的這幾個全局方法,移植到Number對象上面,是爲了逐步減小全局性方法,使得語言逐步模塊化。
ES6中提供了Number.isInteger()用來判斷一個數值是否爲整數。值得注意的是,JavaScript 中整數和浮點數採用的是一樣的儲存方法(64位雙精度浮點數),因此15和15.0被視爲同一個值。
Number.isInteger(15) // true Number.isInteger(15.0) // true Number.isInteger(15.1) // false Number.isInteger('15') // false
除此以外,ES6還對與number關係密切的Math( )做了很大的擴展,添加了17個新的方法,這裏不贅述。
布爾值做爲一種比較簡單的基本數據類型,在ES5中就僅有幾種簡單的方法,經過引用構造函數,很清楚的就能知道一些常見值的布爾值:
Boolean(1) // true Boolean(0) // false Boolean(false) // false Boolean('false') // true Boolean(null) // false Boolean(undefined) // false Boolean(NaN) // false
此外,還有一些簡單的經常使用方法:
toString( ) / toSource( ) / valueOf( )
把null和undefined放在一塊兒講是由於這兩種數據類型在js都是很特殊的,而且它們表達的意義很相近,初學者常常會混淆這兩者。null的意思是"nothing",它被看作不存在的事物,理論上講,null應該是一種單獨的數據類型,可是咱們在前面講過,typeof null的結果是object,這不得不說是一件使人困惑的事情。
對於undefined,它表示的意思是"未定義的",它與null雖然類型不一樣(type undefined 爲undefined),可是兩者的值倒是相同的。
typeof null // object typeof undefined // undefined null == undefined //true null === undefined // false
暫時就寫到這裏,下次有時間來聊聊ES6中object新增的處理方法。