1. 程式人生 > >JavaScript 基本資料型別以及如何進行判斷

JavaScript 基本資料型別以及如何進行判斷

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

如何判斷陣列是陣列?

  1. 使用 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 型別,我們並沒有辦法具體的區分。

  1. 使用 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
  1. 用 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 真正判斷出

這種方法也不是非常靠譜。

  1. 用 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
  1. 用 Array 物件的 isArray 方法判斷 這是目前最靠譜的方法了
const a = [1,2,3];
const b = {name:'bob',age:12};
Array.isArray(a); //true
Array.isArray(b); //false