JavaScript 基本資料型別以及如何進行判斷
阿新 • • 發佈:2018-12-11
JavaScript 有以下幾種基本資料型別
- Boolean 有兩個值 true 和 false
- Null 只有一個 null 值
- Undefined 一個沒有被賦值的變數會有個預設值 undefined
- Number 表示數字,整數浮點數都行,還有一些帶符號的值 +Infinity,-Infinity 和 NaN(非數值,Not-a-Number)
要檢查值是否大於或小於 +/-Infinity,你可以使用常量 Number.MAX_VALUE 和 Number.MIN_VALUE。另外在 ECMAScript 6 中,你也可以通過 Number.isSafeInteger() 方法還有 Number.MAX_SAFE_INTEGER 和 Number.MIN_SAFE_INTEGER 來檢查值是否在雙精度浮點數的取值範圍內。 超出這個範圍,JavaScript 中的數字不再安全了,也就是隻有 second mathematical interger 可以在 JavaScript 數字型別中正確表現。
-
String 用於表示文字資料,是一組 16 位的無符號整數值的‘‘元素’’,每個字元佔據字串的位置,第一個元素的索引為 0,下一索引為 1,依次類推。
-
Symbol 符號型別是 ES6 新定義的,是唯一的並且不可修改的,並且也可以用來作為 Object 的 key 的值
-
Object 物件可以被看作一組屬性的集合
陣列是一種使用整數作為鍵屬性和長度屬性之間關聯的常規物件
不同資料型別之間怎麼判斷?
- typeof 只能檢測基本資料型別,對 null 有 bug,
typeof null //object
- instanceof 適用於檢測物件,基於原型鏈運作
- constructor 指向的時最初建立者,容易改寫,不適合做型別判斷
- toString 適用內建的 JavaScript 型別。
如果要判斷的時基本資料型別或 JavaScript 內建物件,使用toString
如果要判斷的是自定義型別,使用instanceof
如何判斷陣列是陣列?
- 使用 typeof 操作符來判斷
Value typeof -------------------------- Undefined undefined Null object Boolean boolean Number number String string Symbol symbol Function Object function Any other Object object
陣列,物件,null 等用 typeof 返回的都是 object 型別,我們並沒有辦法具體的區分。
- 使用 instanceof 判斷 instanceof 可以用來判斷某個建構函式的 prototype 屬性所指向的物件是否存在於另外一個要檢測物件的原型鏈上。
const a = [];
const b = {};
console.log(a instanceof Array); //true
console.log(a instanceof Object); //true,在陣列的原型鏈上也能找到 Object 建構函式
console.log(b instanceof Array); //fasle
- 用 constructor 判斷 例項化陣列擁有一個 constructor 屬性,這個屬性指向生成這個陣列的方法。
const a = [];
console.log(a.constructor); // Function Array
以上程式碼說明,陣列是有一個叫 Array 的函式例項化的。
但是,constructor 屬性是可以修改的,如果不小心改寫了 constructor 屬性的話,那麼這種方法就無法真正判斷出陣列。
const a = [];
//改寫 constructor 屬性
a.constructor = Object;
console.log(a.constructor == Array); //false
console.log(a.constructor == Object); //true
console.log(a instanceof Array); //true 真正判斷出
這種方法也不是非常靠譜。
- 用 Object 的 toString() 方法判斷 每一個繼承自 Object 的物件都有 toString 的方法
const a = [1,2,3];
const b = {name:'bob',age:12};
Object.prototype.toString.call(a); //'[object Array]'
Object.prototype.toString.call(b); //'[object Object]'
這樣我們就可以自己寫一個方法來判斷是否為陣列
const isArray = (something)=>{
return Object.prototype.toString.call(something) === '[object Array]';
}
cosnt a = [];
const b = {};
isArray(a);//true
isArray(b);//false
- 用 Array 物件的 isArray 方法判斷 這是目前最靠譜的方法了
const a = [1,2,3];
const b = {name:'bob',age:12};
Array.isArray(a); //true
Array.isArray(b); //false