ECMAScript 中有6 種原始類型:Boolean、Null、Undefined、Number、String、Symbol (ECMAScript 6 新定義) 以及複雜的數據類型 Object
undefined 和 null 的簡單介紹
在使用 var 聲明變量但未對其加以初始化時,這個變量的值就是 undefined, undefined是一個表示"無"的原始值,轉爲數值時爲NaN;
從邏輯角度來看,null 值表示一個空對象指針,而這也正是使用 typeof 操做符檢測 null 值時會返回"object"的緣由。null是一個表示"無"的對象,轉爲數值時爲0。dom
undefined 不是 JavaScript 的保留字,只是全局變量上的一個屬性,屬性值是原始值 undefined。在 ECMAScript 5 以前,給 window.undefined 賦值會覆蓋該屬性。ECMAScript 5 的標準里加入了變量擁有可寫、可枚舉、可配置屬性。全局的 undefined 的可寫屬性應該是 false 的。函數
Object.getOwnPropertyDescriptor(window, "undefined"); => Object {value: undefined, writable: false, enumerable: false, configurable: false}
void 運算符 對給定的表達式進行求值,而後返回 undefined,因此void 0 代替 undefined。
若是須要判斷變量是否未初始化:this
string類型指針
ECMAScript中的字符串是不可變的,也就是說,字符串一旦建立,它們的值就不能改變。要改變某個變量保存的字符串,首先要銷燬原來的字符串(此過程是在後臺發生的),而後再用另外一個包含新值的字符串填充該變量。
字符串還提供許多能夠調用的方法:code
var s = "hello, world" //定義一個字符串 s.charAt(0) // => "h" 第一個字符 s.charAt(s.length-1) // => "d" 最後一個字符 s.substring(1, 4) // => "ell" 第2-4個字符 s.slice(1,4) // => "ell" 同上 s.slice(-3) // => "rld": 最後三個字符 s.indexOf("l") // => 2 字符l首次出現的位置 s.lastIndexOf("l") // => 10: 字符l最後一次出現的位置 s.indexOf("l", 3) // => 在位置3及以後首次出現字符l的位置 s.split(",") // => ["hello", "world"]分割成子串 s.replace("h", "H") // => "Hello, world": 全文字符替換 s.toUpperCase() // => "HELLO WORLD"
number 類型
在JavaScript的內部採用IEEE754格式來表示數字,因此不區分整數和浮點數,都是用64位浮點數的形式儲存。就是說,在JavaScript內部,就根本沒有小數。可是有些運算必須得須要整數完成,因此JavaScript有時會把64位的浮點數轉換成32位的整數,再進行運算。
js中數值轉換的函數有三個:parseInt()、parseFloat()、number()對象
parseInt ( cString )從字符串cString非空字符開始轉換獲得的整數,遇到小數點或其餘0-9外的字符就中止,如「-1234a」,「-1234.0」都將返回 -1234;若是除第一個符號外一個0-9字符都不是,將返回NaN,如「-a」、「abc」等;ip
Number( cString )從字符串cString轉換獲得的數字,包括Int和Float類型,如:「-123」返回-123,「123」和「00123」都返回 123,「234。56」返回234。56等。cString必須是合法的數字串,不然返回NaN;如「.123」、「1.23.45」、 「--123」、「123a"都返回NaN.ci
總之Number( )更象parseFloat( ),Number對參數更挑剔,稍有不是數字就返回NaN。字符串
parseFloat支持第一個非空字符爲小數點,如parseFloat(".123" )返回0.123。而Number(".123" )返回NaN。get
空字符串或徹底空格串健壯的parseFloat()返回NaN,而Number()返回0,這有點讓人費解。
除了不支持無前導0小數 (如.12三、-.123)和支持多餘的前導0(如-00123返回-123)多少不符合常規外,Number能用來驗證數字串!
Number類型原型上還有一些方法來對數字進度進行取捨,這些方法能夠被 Number 實例對象調用:
方法 描述
toExponential() 返回一個數字的指數形式的字符串
toFixed() 返回指定小數位數的表示形式
toPrecision() 返回一個指定精度的數字
Math.abs(x) 返回x的絕對值
Math.sign(x) 返回x的符號函數, 斷定x是正數,負數仍是0
Math.random() 返回0到1之間的僞隨機數
Math.floor(x) 返回x向上取整後的值
Math.ceil(x) 返回x向上取整後的值
Math.round(x) 返回四捨五入後的整數.
symbol類型
Symbol值經過Symbol函數生成。這就是說,對象的屬性名如今能夠有兩種類型,一種是原來就有的字符串,另外一種就是新增的Symbol類型。凡是屬性名屬於Symbol類型,就都是獨一無二的,能夠保證不會與其餘屬性名產生衝突。
一、注意,Symbol函數前不能使用new命令,不然會報錯。這是由於生成的Symbol是一個原始類型的值,不是對象。也就是說,因爲Symbol值不是對象,因此不能添加屬性。基本上,它是一種相似於字符串的數據類型。
二、Symbol函數能夠接受一個字符串做爲參數,表示對Symbol實例的描述,主要是爲了在控制檯顯示,或者轉爲字符串時,比較容易區分。
三、因爲每個Symbol值都是不相等的,這意味着Symbol值能夠做爲標識符,用於對象的屬性名,就能保證不會出現同名的屬性。這對於一個對象由多個模塊構成的狀況很是有用,能防止某一個鍵被不當心改寫或覆蓋。Symbol值做爲對象屬性名時,不能用點運算符。在對象的內部,使用Symbol值定義屬性時,Symbol值必須放在方括號之中。
let obj = (function () { let key = Symbol('你好'); let obj = { }; obj[key] = '私有變量'; return { get foo () { return this[key]; } }; })(); obj.foo = 'hello world'; console.log(Object.getOwnPropertyNames(obj)); // ['foo'] console.log(Object.getOwnPropertySymbols(obj)); // [Symbol(你好)] let anotherKey = Symbol('你好'); console.log(obj[anotherKey]) // undefined typeof anotherKey // 'symbol'