如何判断一个对象是数组还是对象

一、typeof判断数据类型(判断数组跟对象都返回object)

    console.log(typeof null); // "object"
    console.log(typeof function () {
      return 1;
    }); // "function"
    console.log(typeof ‘梦龙小站‘); // "string"
    console.log(typeof 1); // "number"
    console.log(typeof a); // "undefined"
    console.log(typeof undefined); // "undefined"
    console.log(typeof []); // "object"
    console.log(typeof NaN); // "number"
    console.log(typeof {}); // "object" 

二、instanceof判断对象的原型链是否是指向构造函数的prototype

  var arr = [1,2,3,1];

  console.log(arr instanceof Array)//true

三、对象的constructor属性

  var arr = [1,2,3,1];

  console.log(arr.constructor === Array)//true

四、Object.prototype.toString.call(arr)

  利用对象的toString可以准确判断是什么类型,call()改变this指向,这里是借用Object的方法,然后有人可能会问为什么不直接用arr.toString而要借用Object的方法,

  我们看下面

  

console.log(Object.prototype.toString.call("jerry"));//[object String]
console.log(Object.prototype.toString.call(12));//[object Number]
console.log(Object.prototype.toString.call(true));//[object Boolean]
console.log(Object.prototype.toString.call(undefined));//[object Undefined]
console.log(Object.prototype.toString.call(null));//[object Null]
console.log(Object.prototype.toString.call({name: "jerry"}));//[object Object]
console.log(Object.prototype.toString.call(function(){}));//[object Function]
console.log(Object.prototype.toString.call([]));//[object Array]
console.log(Object.prototype.toString.call(new Date));//[object Date]
console.log(Object.prototype.toString.call(/\d/));//[object RegExp]
console.log(Object.prototype.toString.call(new Person));//[object Object]    
直接用toString
console.log("jerry".toString());//jerry
console.log((1).toString());//1
console.log([1,2].toString());//1,2
console.log(new Date().toString());//Wed Dec 21 2016 20:35:48 GMT+0800 (中国标准时间)
console.log(function(){}.toString());//function (){}
console.log(null.toString());//error
console.log(undefined.toString());//error

  因为toString为Object原型上的方法,而Array、Function都是Object的实例,实例重新改写了原型上的toString方法,不同的对象调用toString方法,调用的是改写之后的方法

  (转成各种类型的字符串),而不会调用Object原型上的toString()方法,因此直接调用不能判断对象类型

var arr=[1,2,3];
console.log(Array.prototype.hasOwnProperty("toString"));//true
console.log(arr.toString());//1,2,3
delete Array.prototype.toString;//delete操作符可以删除实例属性
console.log(Array.prototype.hasOwnProperty("toString"));//false
console.log(arr.toString());//"[object Array]"

  我们可以看到,删除实例上的toString方法后调用的是Object原型上的toString()方法,返回对象类型

五、es6的方法——Array.isArray()

  Array.isArray([]) //true

六、看好多博客说用length判断,这个其实不准确

    var obj={a:1}
    var arr = []
    console.log(obj.length)//undefined
    console.log(arr.length)//0

    obj.length = 1
    console.log(obj.length)//1

对象可以直接添加length这个属性,就无法区分了

原文地址:https://www.cnblogs.com/woniubushinide/p/11231646.html

时间: 2024-08-29 17:10:03

如何判断一个对象是数组还是对象的相关文章

js如何判断一个对象是数组(函数)

js如何判断一个对象是数组(函数) 1.typeof操作符  示例: // 数值 typeof 37 === 'number'; // 字符串 typeof '' === 'string'; // 布尔值 typeof true === 'boolean'; // Symbols typeof Symbol() === 'symbol'; // Undefined typeof undefined === 'undefined'; // 对象 typeof {a: 1} === 'object'

如何判断一个对象是可迭代对象

方法是通过collections模块的iterable类型来判断. >>> from collections import Iterable >>> isinstance('abc',Iterable)#str是否可迭代 True >>> isinstance([1,2,3],Iterable)#list是否可迭代 True >>> isinstance(123,Iterable)#整数是否可迭代 False

vue_如何判断变量是数组还是对象

一.typeof判断数据类型(判断数组跟对象都返回object) console.log(typeof null); // "object" console.log(typeof function () { return 1; }); // "function" console.log(typeof '梦龙小站'); // "string" console.log(typeof 1); // "number" console.

递归判断多维数组中对象是否有值

一个项目需求中,需要判断数组中的对象是否有值,先看下数据结构: let list = [ { value: "1", children: [ { value: "2", }, { value: "3", children: [ { value: "4", }, ] } ] }, { value: "5", } ] 那么如何进行判断多层子集是否有值呢?这里就会用到递归来实现 function ruleVali

判断对象是数组

Object.prototype.toString.call(b).slice(8,-1) 注:返回值为  "Array" Object.prototype.toString.call(b) 注:返回值为  "[object Array]"  slice(8,-1)为开始点为索引8,结束点为倒数第一个即-1 获取对象类型,为什么用 Object.prototype.toString.call(obj) 而不用 obj.toString() 呢? var c = [1

Javascript判断对象是否为数组,并且数组元素对象

常规的有两种方式,第一种是jquery自带的方法,第二个是js原始方法 1. $.isArray(obj) 2. obj instanceof Array 实测发现两者确实可以判断对象是否为数组,但是只能判断简单对象的对象,对于复杂的jquery对象的数组却返回false,要判断jquery对象数组,我目前的做法是 typeof(obj) == "object" && obj.length > 1 //数组属于对象,并且数组length都大于1 另外jQuery封

判断一个变量类型是数组还是对象

因为无论是数组还是对象,对于typeof的操作返回值都为object,所以就有了区分数组类型和对象类型的需要: 方一:通过length属性:一般情况下对象没有length属性值,其值为undefiend,而数组的length值为number类型 缺点:非常不实用,当对象的属性存在length,且其值为number(比如类数组),则该方法失效,不建议使用,看看即可. *方二:通过instanceof来判断区分 var arr = [1, 2, 3]; var obj = { name: 'lyl'

实现一个类型判断函数,需要鉴别出基本类型、function、null、NaN、数组、对象?

只需要鉴别这些类型那么使用typeof即可,要鉴别null先判断双等判断是否为null,之后使用typeof判断,如果是obejct的话,再用Array.isArray判断是否为数组,如果是数字再使用isNaN判断是否为NaN,(需要注意的是NaN并不是JavaScript数据类型,而是一种特殊值)代码如下: function type(ele) { if (ele === null) { return null; } else if (typeof ele === 'object') { if

怎么判断一个对象是不是数组类型?

前面<变量的赋值和对象的赋值>中有用到typeof运算符去判断运算数的类型,结果如下: alert(typeof 1); // 返回字符串"number" alert(typeof "1"); // 返回字符串"string" alert(typeof true); // 返回字符串"boolean" alert(typeof {}); // 返回字符串"object" alert(typeof