檢驗數據類型的幾個方法 ,如有不對,請大佬指點
- typeof 可以檢測一些基本的數據類型,語法上可以選擇加括號不加都可以的。但是注意 在檢驗 數組、對象、正則、null 的時候返回的都是Object,所以有時要針對對象或數組做些判斷就不是很好了。
請看示例:
console.log(typeof "你好呀"); 輸出結果 String
console.log(typeof 1); 輸出結果 Number
console.log(typeof false); 輸出結果 Boolean
console.log(typeof undefined); 輸出結果 undefined
console.log(typeof /$/); 輸出結果 Object
console.log(typeof null); 輸出結果 Object
console.log(typeof []); 輸出結果 Object
console.log(typeof {}); 輸出結果 Object
console.log(typeof function () {}); 輸出結果 function
- constructor 構造函數,
請看示例:
console.log(("你好").constructor === String); 輸出結果 true
console.log(([]).constructor === Array); 輸出結果 true
console.log(({}).constructor === Object); 輸出結果 true
console.log((1).constructor === Number); 輸出結果 true
console.log((true).constructor === Boolean); 輸出結果 true
console.log((function () {}).constructor === Function); 輸出結果 true
console.log((/$/).constructor === RegExp); 輸出結果 true
// console.log((null).constructor === null); 輸出結果 報錯
// console.log((undefined).constructor === undefined); 輸出結果 報錯
如果不算 null 與 undefined 的話 constructor基本可以應對基本數據類型與引用數據類型的數據類型是啥,但 事實還是有些偏差,constructor並不可靠,容易被修改 即使被修改了,也不會影響代碼的正常運行。
正常開發的時候,constructor不小心被修改了,爲了方便維護,和開發,可以手動更正constructor的指向。
請看示例:
function fn() {}
let f = new fn;
console.log(f.constructor.name); 輸出結果 'fn'
console.log(fn.constructor); 輸出結果 Function(){}
console.log(Function.constructor); 輸出結果 Function(){}
- instanceof 檢測當前實例是否隸屬於某各類。雙目運算符 a instanceof b ,判斷a的構造器是否爲 b,返回值爲布爾值
但是 如果直接對對象字面量創建的基礎數據類型做驗證 返回的卻不是所屬類型,而引用數據類型的驗證卻是正常的。如果我們以new字符去創建基礎數據類型,此時的結果纔是所屬數據類型。對於null 和 undefined 這兩個 我的理解是反正這兩個怎麼玩都是報錯 o(╯□╰)o
請看示例:
console.log(("你好") instanceof String); 輸出結果 false
console.log((1) instanceof Number); 輸出結果 false
console.log((true) instanceof Boolean); 輸出結果 false
console.log(([]) instanceof Array); 輸出結果 true
console.log(({}) instanceof Object); 輸出結果 true
console.log((function () {}) instanceof Function); 輸出結果 true
console.log((/$/) instanceof RegExp); 輸出結果 true
console.log(new String("你好") instanceof String); 輸出結果 true
console.log(new Number(1) instanceof Number); 輸出結果 true
console.log(new Boolean(true) instanceof Boolean); 輸出結果 true
//console.log((null) instanceof null); 輸出結果 報錯
//console.log(new(null) instanceof null); 輸出結果 報錯
//console.log((undefined) instanceof undefined); 輸出結果 報錯
//console.log(new(undefined) instanceof undefined); 輸出結果 報錯
- Object.prototype.toString.call() 我認爲這個是最強大的方法(個人看法,不喜輕噴),就是長了點,當然 如果簡單地就隨意了。並且 我們改變原型也不會有任何影響
請看示例:
let isType = (type) => {
return Object.prototype.toString.call(type);
}
console.log(isType('111')); 輸出結果 [object String]
console.log(isType(111)); 輸出結果 [object Number]
console.log(isType(true)); 輸出結果 [object Boolean]
console.log(isType(['111'])); 輸出結果 [object Array]
console.log(isType({a: '111'})); 輸出結果 [object Object]
console.log(isType(/$/)); 輸出結果 [object RegExp]
console.log(isType(function () {})); 輸出結果 [object Function]
function abc() {};
abc.prototype = new Array();
console.log(isType(abc)); 輸出結果 [object Function]
- isArray 判斷是否爲數組、 isNaN() 判斷是否是NaN,這兩個就簡單示範一下了。
請看示例
console.log(Array.isArray([])); 輸出結果 true
console.log(Array.isArray(new Array())); 輸出結果 true
console.log(isNaN(NaN)); 輸出結果 true
console.log(isNaN(+"12ab")); 輸出結果 true
- hasOwnporperty 檢測當前屬性是否爲對象的私有屬性。語法: obj.hasOwnporperty(“屬性名(K值)”)
請看示例:
let obj = {
name:"xx"
};
console.log(obj.hasOwnProperty('name')); 輸出結果 true
console.log(obj.hasOwnProperty('xxxx')); 輸出結果 false
小汪還是一個小白,如有大佬指點,萬分感謝。