ES6入門(三):資料型別
總結ECMAScript中資料型別:
在ECMAScript中,常用的資料型別有5+1種;即5種基本的資料型別(String、undefined、null、boolean、number),1種複雜的資料型別(object);
基本的資料型別是不可以改變的,只有物件可以改變。
基本資料型別的檢測用typeof 操作符,所有的返回值都是字串;可能有以下幾種:'undefined'、'boolean'、'string'、'number'、'object'、'function'
typeof(null)//==》'object' 這個是js中的一個bug,在進行二進位制轉換過程中,如果前三位都是0,使用typeof時就返回object,而null轉換為二進位制時所用的位都是0;
總結5種基本的資料型別:
1、一個值資料型別:null 、undefined
自定義個變數沒有必要顯示的定義為undefined,但是對於null而言就是不行的,也就是說:只要意在儲存物件但是還沒有真正的儲存物件,就應該明確的讓變數儲存null值。
主要總結二者的異同點:
相同點:都是一個值的資料型別;二者參與判斷時都返回false;二者都沒有方法
不同點:(a)、null 是一個物件,而undefined 不是以個物件;(b)、null 是一個關鍵字,undefined不是關鍵字;(c)、null轉換為數字時為0,而undefined轉換為數字時是NaN;(d)、typeof null返回’object‘,typeof undefined 返回’undefined‘;
alert(null == undefined) ;//true
2、兩個值的資料型別:boolean 即true 和false
主要用途是用於判斷;
正常情況下,只有這六種情況下會轉為false:空字串、null、undefined、0、-0、NaN
把一個數組如何轉換為boolean值可以用兩中方法:Boolean()、 !!()
3、三個值的資料型別:number 即整數、浮點數、NaN(個人分類,不重要)。
使用number時建議:儘量使用十進位制,少用十六進位制,不用八進位制。
在使用浮點數時不要進行資料的比較。0.1+0.2不要與0.3進行比較。原因就是計算機採用二進位制表示資料,0.1的二進位制表示數加上0.2的二進位制表示數不等於0.3的二進位制表示數。
在number中有一個奇葩,自身都不相等。即alert(NaN == NaN) // false;
但是NaN 是資料型別,也就是說 typeof NaN 的返回值是’number‘;
針對上面兩個特性,ECMAScript提供了一個函式isNaN(); 用途是判斷傳入的值能否轉換為數字,返回值是boolean值。
空字串轉換為數字是0;
將一個值轉換為數字型別可以使用Number();
4、String 字串
字串一般用雙引號或者單引號表示,推薦是使用單引號進行字串的表示。
字串的特點:在ECMAScript中的字串是不可變的,也就是說,字串一旦建立,它的值就不被改變,要是改變字串的值,就先銷燬原來字串,然後在用一個包含新值字串填充該變數。
將一個值轉化為字串型別,有兩個方式,一是呼叫toString()方法;另一個就是String();
注意:null、undefined沒有toString()方法。
==========================================無敵分割線==================================================
上面是es5中常用的資料型別,面的JavaScript的資料型別是動態性,就沒有必要引出其他的資料型別,但是在es5中物件的名稱都是字串,容易造成名稱衝突。面對這樣的情形,es6引出了Symbol型別的資料,其表示獨一無二的值。也就是說在es6中大致可以認為有7中資料型別:null 、undefined、string、number、boolean、Symbol、object這7種資料型別。
Symbol的值有兩種。一種是原來的屬性名。一種是有Symbol()生成的屬性名,由於其表示獨一無二,所以該屬性名不會衝突。
使用Symbol時注意:Symbol函式前不能用new操作符(Symbol是一個原始資料型別,不是物件);不能為Symbol新增方法;symbol是類字串形式的基本資料型別;symbol可以轉化為字串(兩種方式,前面已經介紹了。),可以轉換為boolean,但是不能轉化為Number。
使用Symbol()時最好為其傳入引數,不傳入引數時,使用typeof 時都是返回'symbol',加入引數時就會返回'symbol(引數)',容易區分;由於symbol的值是獨一無二的,即使是傳入相同的引數,二者的值也是不等的。
由於Symbol的值是獨一無二的,所以可以作為屬性名存在,但是作為屬性名是,不能進行點(.)操作,所有的Symbol值都放在方括號([])中。
前面介紹Symbol 的值是獨一無二的,即使是傳入相同的引數,二者的值也是不同的,如果想讓兩者相等,可以使用Symbol.for();
let s1 = Symbol.for('abc');
let s2 = Symbol.for('abc');
alert(s1 === s2) //true
對屬性進行遍歷是要注意:
Symbol 作為屬性名,該屬性不會出現在for...in、for...of迴圈中,也不會被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回。
但是,它也不是私有屬性,有一個Object.getOwnPropertySymbols方法,可以獲取指定物件的所有 Symbol 屬性名。
Object.getOwnPropertySymbols方法返回一個數組,成員是當前物件的所有用作屬性名的 Symbol 值。
const obj = {};
let a = Symbol('a');
let b = Symbol('b');
obj[a] = 'Hello';
obj[b] = 'ES6';
const objectSymbols = Object.getOwnPropertySymbols(obj);
objectSymbols
// [Symbol(a), Symbol(b)]