js判斷數據類型幾種方法

JS數據類型的判斷主要有四種方法:typeof、instanceof、constructor、Object.prototype.toString.call()。

數據類型的包括:number、boolean、string、symbol、object、array、undefined、null、function等9種數據類型

7種數據類型有包含:基本類型值和引用類型值 。 基本數據類型指的是簡單的數據段,而引用數據類型指那些可能有多個值組成的對

基本類型(值類型)

  • Undefined 在使用var聲明變量但未對其初始化時,或者使用了一個並未聲明的變量時,又或者使用了一個並不存在的對象屬性時,這個變量的值就是undefined。
  • Null 從邏輯上看,null值表示一個空對象指針,獨一無二。
  • Boolean true、false
  • Number NaN,即非數值(Not a Number)是一個特殊的數值,這個數值用於表示一個本來要返回數值的操作數未返回數值的情況(這樣就不會拋出錯誤了)
  • String 字符串可以由’’ 或 “” 表示。 ES中字符串是不可改變的,也就是說,字符串一旦創建,它們的值就不能改變。要改變某個變量保存的字符串,首先要銷燬原來的字符串,然後再用另一個包含新值的字符串填充該變量。
    這五種基本數據類型是按值訪問的,因爲可以操作保存在變量中的實際的值。

複雜類型(引用類型)

  • Object 對象其實就是一組數據和功能的集合。對象可以通過new操作符後跟要創建的對象類型的名稱來創建。 而創建Object的實例併爲其添加屬性和方法,就可以自定義對象。
    1. Object類型
    2. Array類型
    3. Date類型
    4. RegExp類型
    5. Function類型

引用類型的值是保存在內存中的對象。與其他語言不同,js不允許直接訪問內存中的位置,也就是說不能直接操作對象的內存空間。 操作對象時,實際上是在操作對象的引用而不是實際的對象。(這種說法不太嚴謹,爲對象添加屬性時,操作的是實際的對象)。

值類型與引用類型的差別

  • 基本類型在內存中佔據固定大小的空間,因此被保存在棧內存中
  • 從一個變量向另一個變量複製基本類型的值,複製的是值的副本
  • 引用類型的值是對象,保存在堆內存
  • 包含引用類型值的變量實際上包含的並不是對象本身,而是一個指向該對象的指針
  • 從一個變量向另一個變量複製引用類型的值的時候,複製是引用指針,因此兩個變量最終都指向同一個對象

1.typeof
檢測基本數據類型的最佳選擇是使用typeof
eg:
typeof Symbol(); // symbol 有效
typeof ‘’; // string 有效
typeof 1; // number 有效
typeof true; // boolean 有效
typeof undefined; // undefined 有效
typeof new Function(); // function 有效
typeof null; // object 無效
typeof [] ; // object 無效
typeof new Date(); // object 無效
typeof new RegExp(); // object 無效
返回一個表示數據類型的字符串,返回結果包括:number、boolean、string、symbol、object、undefined、function等7種數據類型,但不能判斷null、array
由結果可知,除了在檢測null時返回 object 和檢測function時放回function。對於引用類型返回均爲object

2.instanceof
檢測引用型數據類型時的最佳選擇是instanceof
eg:
[] instanceof Array; // true
{} instanceof Object; // true
new Boolean instanceof Boolean; // true
new Date() instanceof Date; // true
new RegExp() instanceof RegExp; // true
null instanceof Null; // 報錯
undefined instanceof undefined; // 報錯
用來判斷A是否爲B的實例,A instanceof B, 返回 boolean 值。instanceof 用來測試一個對象在其原型鏈中是否存在一個構造函數的 prototype 屬性,但它不能檢測 null 和 undefined

3.constructor
查看對象對應的構造函數
object的每個實例都具有屬性constructor,保存着用於創建當前對象的函數。
eg:
console.log(bool.constructor === Boolean); // true
console.log(num.constructor === Number); // true
console.log(str.constructor === String); // true
console.log(arr.constructor === Array); // true
console.log(obj.constructor === Object); // true
console.log(fun.constructor === Function); // true
undefined和null沒有contructor屬性
constructor不能判斷undefined和null,並且使用它是不安全的,因爲contructor的指向是可以改變的。

4.Object.prototype.toString.call()
一般數據類型都能夠判斷,最準確最常用的一種
eg:
console.log(Object.prototype.toString.call(bool)); // [object Boolean]
console.log(Object.prototype.toString.call(num)); // [object Number]
console.log(Object.prototype.toString.call(str)); // [object String]
console.log(Object.prototype.toString.call(und)); // [object Undefined]
console.log(Object.prototype.toString.call(nul)); // [object Null]
console.log(Object.prototype.toString.call(arr)); // [object Array]
console.log(Object.prototype.toString.call(obj)); // [object Object]
console.log(Object.prototype.toString.call(fun)); // [object Function]
console.log(Object.prototype.toString.call(new Date())) ; // [object Date]
console.log(Object.prototype.toString.call(new RegExp())) ; // [object RegExp]
console.log(Object.prototype.toString.call(new Error())) ; // [object Error]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章