择要
这篇文章报告typeof运算符推断基础范例和援用范例的区分,以及怎样推断数组范例和空对象
typeof
ECMAScript 有 5 种原始范例(primitive type),即 Undefined、Null、Boolean、Number 和 String。我们都晓得能够运用typeof运算符求得一个变量的范例,然则对援用范例变量却只会返回object
,也就是说typeof只能准确辨认基础范例值变量。
var a = "abc";
typeof a;// "string"
var b = 123;
typeof b;// "number"
var c = true;
typeof c;// "boolean"
var d = null;
typeof d;// "object"
var f = undefined;
typeof f;// "undefined"
var g;
typeof g;// "undefined"
typeof x;// "object"
您或许会问,为何 typeof 运算符关于 null 值会返回 “object”。这实际上是 JavaScript 最初完成中的一个毛病,然后被 ECMAScript 沿用了。如今,null 被认为是对象的占位符,从而诠释了这一抵牾,但从技术上来讲,它仍然是原始值。
末了一个比较新鲜,typeof一个不存在的变量x
竟然返回了”object”而不是”undefined”。
我们在来以下代码
var a = function() {};
typeof a; // "function"
var b = [1,2,3];
typeof b; // "object"
var c = {};
typeof c; // "object"
关于数组和对象都返回”object”,因而我们一样平常开辟中一个罕见需求就是怎样推断变量是数组照样对象。
范例推断
范例推断,平常就是推断是不是是数组,是不是是空对象。这是针对这个需求,我一样平常用过或见过的推断要领
推断是不是是数组
有数组:var a = [1,2,3,4,5];
要领一:
toString.call(a); // "[object Array]"
要领二:
a instanceof Array; //true
要领三:
a.constructor == Array; //true
第一种要领比较通用,也就是Object.prototype.toString.call(a)
的简写。
instanceof
和constructor
推断的变量,必需在当前页面声明的,比方,一个页面(父页面)有一个框架,框架中援用了一个页面(子页面),在子页面中声清楚明了一个a,并将其赋值给父页面的一个变量,这时候推断该变量,Array == object.constructor
会返回false
;
推断是不是是空对象
有变量:var obj = {};
要领一:
JSON.stringify(obj); // "{}"
经由过程转换成JSON对象来推断是不是是空大括号
要领二:
if(obj.id){
//假如属性id存在....
}
这个要领比较土,大多数人都能想到,条件是得晓得对象中有某个属性。
要领三:
function isEmptyObject(e) {
var t;
for (t in e)
return !1;
return !0
}
//true
isEmptyObject(obj);
//false
isEmptyObject({
"a":1,
"b":2
});
这个要领是jQuery的isEmptyObject()要领的完成体式格局。
要领四:
运用ES6语法Object.keys(obj)
,返回一个数组,只需要推断数组长度是不是大于0即可。
function isEmptyObject(obj){
if(Object.keys(obj).length > 0) return true;
return false;
引荐运用要领四。
文章出处:
http://dunizb.com原文链接:
http://dunizb.com/2017/07/08/JS-in-the-typeof-and-type-judgment/