js爲了方便操做基本類型值,ECMAscript 提供了3個特殊的引用類型:Boolean、Number 和 String。每當讀取一個基本類型值的時候,後臺就會建立一個對應的基本包裝類型的對象,從而讓咱們可以調用一些方法來操做這些數據。javascript
var s1 = "some text";
// 在這裏建立了一個字符串保存在了變量s1,字符串固然是基本類型值。
// 可是此刻咱們又調用了s1的方法,基本類型值不是對象,理論上不該該有方法。
//其實,爲了讓咱們實現這種直觀的操做,後臺已經幫助咱們完成了一系列的操做。當咱們在第二行代碼中訪問 s1 變量時,訪問過程處於讀取模式,而在讀取模式中訪問字符串時,後臺都會自動完成下列處理。
var s2 = s1.substring(2);
/* 1. 建立 String 類型的一個實例; 2. 在實例上調用指定的方法; 3. 銷燬這個實例。 var s1 = new String("some text"); var s2 = s1.substring(2); s1 = null; */
複製代碼
typeof: 對於基本類型出了null(返回 obejct)之外,都可以正確返回。對於複雜類型除了function(返回 function)之外,一概返回object。前端
instanceof:instanceof 運算符用來測試一個對象在其原型鏈中是否存在一個構造函數的 prototype 屬性。(也就是隻能用來判斷兩個對象是否屬於實例關係,而不能判斷一個對象實例具體屬於哪一種類型)。java
var str = 'text';
str instanceof String; // false (包裝類型)
var arr = [1, 2, 3];
arr instanceof Array; // true
arr instanceof Object; // true
// 會返回 true ,是由於 Object 構造函數的 prototype 屬性存在與 arr 這個數組實例的原型鏈上。
複製代碼
用對象的 constructor 來判斷對象類型(當檢測 null 或者 undefined 類型的 constructor 屬性時,js會報錯!由於 null 和 undefined 根本就沒有 constructor 屬性)git
function cstor(variable) {
if (variable === null || variable === undefined) {
return 'Null or Undefined';
}
var cst = variable.constructor;
switch (cst) {
case Number:
return 'Number'
case String:
return 'String'
case Boolean:
return 'Boolean'
case Array:
return 'Array'
case Object:
return 'Object'
}
}
複製代碼
Object.prototype.toString.call(): 獲取全部對象都擁有的[[Class]]這個內部屬性, 返回字符串"[object class]"
.github
/** * @param type 字符串,要檢測的類型的字符串 * @return 類型檢測函數 * 根據傳入的數據類型,返回該類型的類型檢測函數 * 類型檢測使用 toString 函數 */
function isType(type) {
return function (val) {
if (Object.prototype.toString.call(val) === `[object ${type}]`) {
return true;
}
return false;
};
}
export let isString = isType('String');
export let isArray = isType('Array');
export let isFunction = isType('Function');
export let isObject = isType('Object');
export let isNumber = isType('Number');
複製代碼