JavaScript 用typeof来判断是否是对象的弊端
题目:使用 typeof bar === "object"
来确定 bar
是否是对象的潜在陷阱是什么?如何避免这个陷阱?
1:使用typeof
首先看下面的代码:
var carr=[];
var cobj={};
function cfun(){console.log('cc');
}
console.log(typeof carr=='object'); //true
console.log(typeof cobj=='object'); //true
console.log(typeof cfun=='function'); //true
console.log(typeof null=='object'); //true
可以看到,typeof null也为‘object’,这一般不是我们所希望的。至于Array和Function是否希望被判断为object就要因情况而定了。
当希望排除掉null和函数是可以这样写:
var carr=[];
var cobj={};
function cfun(){console.log('cc');
}//判断是否是对象
function isObject(bar)
{if((typeof bar==='object')&&(bar!==null))return true;elsereturn false;
}
console.log(isObject(carr)); //true
console.log(isObject(cobj)); //true
console.log(isObject(cfun)); //false
console.log(isObject(null)); //false
当希望排除掉null,函数,Array的时候可以这样写:
var carr=[];
var cobj={};
function cfun(){console.log('cc');
}//判断是否是对象
function isObject(bar)
{if((typeof bar==='object')&&(bar!==null)&&(Object.prototype.toString.call(bar))!=='[object Array]')return true;elsereturn false;
}console.log(isObject(carr)); //false
console.log(isObject(cobj)); //true
console.log(isObject(cfun)); //false
console.log(isObject(null)); //false
2:使用toString()
检测对象类型
可以通过toString()
来获取每个对象的类型。为了每个对象都能通过 Object.prototype.toString()
来检测,需要以 Function.prototype.call()
或者 Function.prototype.apply()
的形式来调用,传递要检查的对象作为第一个参数。结果显而易见了。
var carr=[];
var cobj={};
function cfun(){console.log('cc');
}var toString = Object.prototype.toString;console.log(toString.call(new Date)); // [object Date]
console.log(toString.call(new String)); // [object String]
console.log(toString.call(Math)); // [object Math]console.log(toString.call(undefined)); // [object Undefined]
console.log(toString.call(null)); // [object Null]console.log(toString.call(carr)); // [object Array]
console.log(toString.call(cobj)); // [object Object]
console.log(toString.call(cfun)); // [object Function]
3:更全面的检测对象的方式(jQuery中的方法)
当然如果你觉得上述方法仍然不够全面,那么我们来看看jQuery中是如何判断对象类型的。jQuery全面考虑到了各种情况及浏览器版本的兼容性。
jQuery(版本1.11.1)中部分代码:
var class2type = {};
var toString = class2type.toString;
var hasOwn = class2type.hasOwnProperty;
jQuery.extend({//检测isPlainObject方法被用来检测是否为“朴素对象”//不是DOM,原型链上直接继承Object.prototype的对象,称为“朴素对象”isPlainObject: function( obj ) {var key;//排除非object类型,然后是DOM对象,window对象if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {return false;}try {// Not own constructor property must be Objectif ( obj.constructor &&!hasOwn.call(obj, "constructor") &&!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {return false;}} catch ( e ) {// IE8,9 Will throw exceptions on certain host objects #9897return false;}//兼容老版本浏览器// Support: IE<9// Handle iteration over inherited properties before own properties.if ( support.ownLast ) {for ( key in obj ) {return hasOwn.call( obj, key );}}// Own properties are enumerated firstly, so to speed up,// if last one is own, then all properties are own.for ( key in obj ) {}return key === undefined || hasOwn.call( obj, key );},type: function( obj ) {if ( obj == null ) {return obj + "";}return typeof obj === "object" || typeof obj === "function" ?class2type[ toString.call(obj) ] || "object" :typeof obj;},});// Populate the class2type map
jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {class2type[ "[object " + name + "]" ] = name.toLowerCase();
});
JavaScript 用typeof来判断是否是对象的弊端相关推荐
- 扩展typeof来判断js变量的类型
Javascript 的 typeof可以获取变量的类型,有如下6种返回值: 1)number: 2)string: 3)boolean: 4)object 5)function: 6)u ...
- JavaScript数据类型 typeof, null, 和 undefined
JavaScript 数据类型 在 JavaScript 中有 5 种不同的数据类型: string number boolean object function 3 种对象类型: Object Da ...
- 后端返回number类型数据_【JavaScript 教程】标准库—Number 对象
作者 | 阮一峰 1.概述 Number对象是数值对应的包装对象,可以作为构造函数使用,也可以作为工具函数使用. 作为构造函数时,它用于生成值为数值的对象. var n = new Number(1) ...
- JavaScript中typeof的用法
JavaScript中typeof知多少? typeof运算符介 绍: typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型. 它返回值是一个字符串,该字符串说明运算数的类型. 你 ...
- 对象数组参数_【JavaScript 教程】标准库—Array 对象
作者 | 阮一峰 1.构造函数 Array是 JavaScript 的原生对象,同时也是一个构造函数,可以用它生成新的数组. var arr = new Array(2);arr.length // ...
- linq结果转换object_【JavaScript 教程】标准库—Object 对象
作者 | 阮一峰 1.概述 JavaScript 原生提供Object对象(注意起首的O是大写),本章介绍该对象原生的各种方法. JavaScript 的所有其他对象都继承自Object对象,即那些对 ...
- JavaScript 原型总结三 函数和对象的关系
2019独角兽企业重金招聘Python工程师标准>>> 1.既typeof之后的另一位老朋友! 在咱们的上一节(JavaScript 原型总结二 一切皆对象之typeof)中说道,函 ...
- 关于JavaScript中typeof的用法
一.typeof的作用 在JavaScript中,变量未经声明就使用,系统是会报错的.但是,typeof却是js中有且仅有的一个特例. typeof的作用就是用来区分数据类型的,下面先说说typeof ...
- JavaScript基础语法_JavaScript内置对象
JavaScript内置对象 JavaScript中的对象分为3种:自定义对象,内置对象,浏览器对象 前两种对象是JS基础内容,属于ECMAScript;第三个浏览器对象属于js独有 内置对象就是指J ...
最新文章
- Delphi下利用WinIo模拟鼠标键盘详解
- 微软警告称Flame病毒利用Windows漏洞
- SharePoint 2013 新建网站集图解
- 给一个由n个单词组成的字符串排序
- JSP,Servlet,JavaBean在WEB应用的角色
- PostgreSQL字符集问题
- [CF917D]Stranger Trees[矩阵树定理+解线性方程组]
- localsandbox 如何响应tile点击事件
- android 版本权限差别,android apk 的root 权限和USB adb 权限的区别
- python redis pipeline使用方法_python使用pipeline批量读写redis的方法
- 判断点是否在给定四边形内的算法
- 闭式系统蒸汽管径推荐速度_暖通丨空调水系统的设计
- Android LayoutInflater原理分析,带你一步步深入了解View(一) 郭霖学习摘要
- 业务需求访谈中需要注意的重要法则(转)
- 【P20】PCM1794全平衡解码模块电路
- python读取Himawari-8葵花8标准数据(HSD)
- 华为路由器配置SSH认证登陆教程
- vue-router的参数的传递、懒加载以及嵌套路由的使用
- x64dbgpy 自动化控制插件AIP手册
- 小米无线路由器服务器用户名和密码忘了,小米路由器密码忘记了怎么办 小米路由器密码忘记解决办法【详解】...