Javascript中判断变量是数组还是对象(array还是object)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Javascript中判断变量是数组还是对象(array还是object)相关的知识,希望对你有一定的参考价值。

参考技术A 怎样判断一个javascript变量是array还是obiect?
答案:
1、如果你只是用typeof来检查该变量,不论是array还是object,都将返回‘objec'。
此问题的一个可行的答案是是检查该变量是不是object,并且检查该变量是否有数字长度(当为空array时长度也可能为0)。
然而,参数对象【arguments
object】(传给制定函数的所有参数),也可能会适用于上述方法,技术上来说,参数对象并不是一个array。
此外,当一个对象有a.length属性的时候,这个方法也不成立。
复制代码
代码如下:
//
Real
array
正在的数组
var
my_array
=
[];
//
Imposter!
冒名顶替的!
var
my_object
=
;
my_object.length
=
0;
//
Potentially
faulty
潜在的错误
function
is_this_an_array(param)

if
(typeof
param
===
'object'
&&
!isNaN(param.length))

console.log('Congrats,
you
have
an
array!');

else

console.log('Bummer,
not
an
array');


//
Works
成功
is_this_an_array(my_array);
//
Works,
but
is
incorrect
成功了,但是不正确
is_this_an_array(my_object);
2、回答这个问题的另一个答案是用一个更加隐蔽的方法,调用toString(
)方法试着将该变量转化为代表其类型的string。
该方法对于真正的array可行;参数对象转化为string时返回[object
Arguments]会转化失败;此外,
对于含有数字长度属性的object类也会转化失败。
复制代码
代码如下:
//
Real
array
真正的数组
var
my_array
=
[];
//
Imposter!
冒名顶替的!
var
my_object
=
;
my_object.length
=
0;
//
Rock
solid
坚如磐石(检验函数)
function
is_this_an_array(param)

if
(Object.prototype.toString.call(param)
===
'[object
Array]')

console.log('Congrats,
you
have
an
array!');

else

console.log('Bummer,
not
an
array');


//
Works
成功了
is_this_an_array(my_array);
//
Not
an
array,
yay!
不是数组(array)!
is_this_an_array(my_object);
3、此外,在可能不可靠的多框架DOM环境中,instanceof是个完美合适的操作。
扩展阅读:"Instanceof
Considered
Harmful…"
http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray
复制代码
代码如下:
var
my_array
=
[];
if
(my_array
instanceof
Array)

console.log('Congrats,
you
have
an
array!');

4、对于Javascript
1.8.5(ECMAScript
5),变量名字.isArray(
)可以实现这个目的
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/isArray
复制代码
代码如下:
var
my_array
=
[];
if
(Array.isArray(my_array))

console.log('Congrats,
you
have
an
array!');

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

  因为无论是数组还是对象,对于typeof的操作返回值都为object,所以就有了区分数组类型和对象类型的需要:

方一:通过length属性:一般情况下对象没有length属性值,其值为undefiend,而数组的length值为number类型

  缺点:非常不实用,当对象的属性存在length,且其值为number(比如类数组),则该方法失效,不建议使用,看看即可。

*方二:通过instanceof来判断区分

  

        var arr = [1, 2, 3];
        var obj = {
            name: \'lyl\',
            age: 18,
            1: \'name\'
        }
        console.log(arr instanceof Array); //true
        console.log(obj instanceof Array); //false

*方三:通过constructor

  

     var arr = [1, 2, 3];
        var obj = {
            name: \'lyl\',
            age: 18,
            1: \'name\'
        }
        console.log(arr.constructor === Array); //true
        console.log(obj.constructor === Array); //false

*方四:通过toString()方法,数组原型和对象原型定义的toString()方法不同

  原理参考:http://www.cnblogs.com/ziyunfei/archive/2012/11/05/2754156.html

  

     var arr = [1, 2, 3];
        var obj = {
            name: \'lyl\',
            age: 18,
            1: \'name\'
        }
        console.log(Object.prototype.toString.call(arr) === \'[object Array]\'); //true
        console.log(Object.prototype.toString.call(boj) === \'[object Array]\'); //false

 

方五:随便找一个数组仅有的方法,来判断数组和对象谁有该方法即可(样例以sort来举例)

  

     var arr = [1, 2, 3];
        var obj = {
            name: \'lyl\',
            age: 18,
            1: \'name\'
        }
   console.log(arr.sort
=== Array.prototype.sort); //true console.log(obj.sort === Array.prototype.sort); //false

 

  

   总结:方法应用权重:

    优先使用方四toString,因为该方法几乎无缺陷。

    次之可以使用方二instanceof和方三constructor

    剩下的方法玩玩即可,不实用

  

以上是关于Javascript中判断变量是数组还是对象(array还是object)的主要内容,如果未能解决你的问题,请参考以下文章

js 中判断变量是数组还是对象,和判断对象是否为空

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

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

js里判断变量是数组还是对象的四种方法

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

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