题目:使用 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来判断是否是对象的弊端相关推荐

  1. 扩展typeof来判断js变量的类型

    Javascript 的 typeof可以获取变量的类型,有如下6种返回值:  1)number:  2)string:  3)boolean:  4)object  5)function:  6)u ...

  2. JavaScript数据类型 typeof, null, 和 undefined

    JavaScript 数据类型 在 JavaScript 中有 5 种不同的数据类型: string number boolean object function 3 种对象类型: Object Da ...

  3. 后端返回number类型数据_【JavaScript 教程】标准库—Number 对象

    作者 | 阮一峰 1.概述 Number对象是数值对应的包装对象,可以作为构造函数使用,也可以作为工具函数使用. 作为构造函数时,它用于生成值为数值的对象. var n = new Number(1) ...

  4. JavaScript中typeof的用法

    JavaScript中typeof知多少? typeof运算符介 绍: typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型. 它返回值是一个字符串,该字符串说明运算数的类型. 你 ...

  5. 对象数组参数_【JavaScript 教程】标准库—Array 对象

    作者 | 阮一峰 1.构造函数 Array是 JavaScript 的原生对象,同时也是一个构造函数,可以用它生成新的数组. var arr = new Array(2);arr.length // ...

  6. linq结果转换object_【JavaScript 教程】标准库—Object 对象

    作者 | 阮一峰 1.概述 JavaScript 原生提供Object对象(注意起首的O是大写),本章介绍该对象原生的各种方法. JavaScript 的所有其他对象都继承自Object对象,即那些对 ...

  7. JavaScript 原型总结三 函数和对象的关系

    2019独角兽企业重金招聘Python工程师标准>>> 1.既typeof之后的另一位老朋友! 在咱们的上一节(JavaScript 原型总结二 一切皆对象之typeof)中说道,函 ...

  8. 关于JavaScript中typeof的用法

    一.typeof的作用 在JavaScript中,变量未经声明就使用,系统是会报错的.但是,typeof却是js中有且仅有的一个特例. typeof的作用就是用来区分数据类型的,下面先说说typeof ...

  9. JavaScript基础语法_JavaScript内置对象

    JavaScript内置对象 JavaScript中的对象分为3种:自定义对象,内置对象,浏览器对象 前两种对象是JS基础内容,属于ECMAScript;第三个浏览器对象属于js独有 内置对象就是指J ...

最新文章

  1. Delphi下利用WinIo模拟鼠标键盘详解
  2. 微软警告称Flame病毒利用Windows漏洞
  3. SharePoint 2013 新建网站集图解
  4. 给一个由n个单词组成的字符串排序
  5. JSP,Servlet,JavaBean在WEB应用的角色
  6. PostgreSQL字符集问题
  7. [CF917D]Stranger Trees[矩阵树定理+解线性方程组]
  8. localsandbox 如何响应tile点击事件
  9. android 版本权限差别,android apk 的root 权限和USB adb 权限的区别
  10. python redis pipeline使用方法_python使用pipeline批量读写redis的方法
  11. 判断点是否在给定四边形内的算法
  12. 闭式系统蒸汽管径推荐速度_暖通丨空调水系统的设计
  13. Android LayoutInflater原理分析,带你一步步深入了解View(一) 郭霖学习摘要
  14. 业务需求访谈中需要注意的重要法则(转)
  15. 【P20】PCM1794全平衡解码模块电路
  16. python读取Himawari-8葵花8标准数据(HSD)
  17. 华为路由器配置SSH认证登陆教程
  18. vue-router的参数的传递、懒加载以及嵌套路由的使用
  19. x64dbgpy 自动化控制插件AIP手册
  20. 小米无线路由器服务器用户名和密码忘了,小米路由器密码忘记了怎么办 小米路由器密码忘记解决办法【详解】...

热门文章

  1. 讲述下 :LVM逻辑卷管理遇到的问题
  2. 快速安装配置zabbix_agent端
  3. Acoustic Echo Cancellation (AEC) 回音消除技术探索
  4. 获取传入element在Document中的name相同的elements中的顺序
  5. 用VC++绘制位图按钮
  6. 最重要的 Java EE 最佳实践
  7. hadoop中mapreduce参数优化
  8. Keychain的介绍和使用
  9. Java开发找工作最懵圈的问题:到底啥是分布式系统开发经验?
  10. 使用pytesseract识别简单验证码