使用typeof obj===‘object’潜在的问题,并不能确定obj是否是一个对象?

更新日期: 2018-05-08阅读量: 2539标签: 数据

js中我们直接这样写typeof obj === ‘object’ 有什么问题呢?例如下列情况下:

typeof [];  //object
typeof {};  //object
typeof null;  //object


可以看出Array, Object等都会返回的是'object',而且js中令人惊讶的null也被认为是一个对象了! 由此可见使用typeof obj===‘object’并不能准确的判断变量是否为object。为了解决上述情况,我们可以这样来写就能保证判断obj是否为一个对象了。


方法一:

if( (obj !== null) && (typeof  obj   === "object") && (toString.call( obj  ) !== "[object Array]")){
    //code
}


方法二:

上面代码就分别判断了obj不能为null,数组的情况,还有一个替代方法对空值,数组和函数返回false,但对于对象则为true的方法。

if( (obj !== null) && (obj.constructor === Object)) {
    //code
}


方法三:

如果你使用jQuery,可以这样写:

if( (obj !== null) && (typeof  obj   === "object") && (! $.isArray( obj  )) ){
    //code
}


方法四:

使用Object.prototype.toString.call(obj) === "[object Object]"  来判断obj是否为对象,这也是我们项目中最常用的方法,先看下上述三种情况:

console.log(Object.prototype.toString.call({})); //[object Object]
console.log(Object.prototype.toString.call([])); //[object Array]
console.log(Object.prototype.toString.call(null)); //[object Null]

可以看出返回是完全不同,可以放心使用了:

if(  Object.prototype.toString.call(obj) ===  "[object Object]"){ 
 //code
}


站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

链接: https://www.fly63.com/article/detial/739

leetcode 1032. Stream of Characters

用字典树即可解决。首先在init的时候,把words中所有word逆置后存入字典树中;在query的时候,也有逆序的方式记录所有历史query过的值,同时判断其前缀是否存在于字典树中即可。

js算法_判断数字是否为素数/质数

质数又称素数。指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。比如100以内共25个,js实现代码如下。

在 JavaScript 中优雅的提取循环内的数据

在本文中,我们将介绍两种提取循环内数据的方法:内部迭代和外部迭代。内部迭代:提取循环内数据的第一个方法是内部迭代,内部迭代的替代方案是外部迭代:我们实现了一个iterable

mock.js模拟数据

开发时,后端还没完成数据输出,前端只好写静态模拟数据。数据太长了,将数据写在js文件里,完成后挨个改url。某些逻辑复杂的代码,加入或去除模拟数据时得小心翼翼。想要尽可能还原真实的数据,要么编写更多代码,要么手动修改模拟数据

ES6-WeakSet数组结构的用法

WeakSet和Set类似,同样是元素不重复的集合,它们的区别是WeakSet内的元素必须是对象,不能是其它类型。成员都是对象;.成员都是弱引用;不能遍历

原生JS数据绑定的实现

双向数据绑定是非常重要的特性 —— 将JS模型与HTML视图对应,能减少模板编译时间同时提高用户体验。我们将学习在不使用框架的情况下,使用原生JS实现双向绑定 —— 一种为Object.observe

js中!!的使用与理解

!!一般用来将后面的表达式转换为布尔型的数据(boolean) 因为javascript是弱类型的语言(变量没有固定的数据类型)所以有时需要强制转换为相应的类型

浏览器保存数据的几种方法

Web产品中很多时候需要在客户端,即浏览器中保存一些必要的数据。而面临这类需求时,你应当知悉对应的解决方案不仅仅只有一种。Cookie这是最早被使用,且至今仍被广泛采用的最简单的浏览器中保存数据方法。

js实现简单的数据监听

主要是用Object.defineProperty实现类似vue的数据绑定。输出的data.name 并不是tom,而是name被读取了,因为defineProperty对data的name字段进行的监听劫持,修改了,name字段本应该返回的值。

Js中的数据传输形式JSON和AJAX技术

今天为大家讲解JavaScript中的数据传输形式JSON和AJAX技术。JSON的全称是JavaScript Object Notation(js对象表示法),它是一种存储和交换文本信息的语法,主要用于序列化对象、数组、字符串、Boolean、数字和null

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!