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

typeof都返回object

在JavaScript中所有数据类型严格意义上都是对象,但实际使用中我们还是有类型之分,如果要判断一个变量是数组还是对象使用typeof搞不定,因为它全都返回object

 代码如下 复制代码

var o = { 'name':'lee' };
var a = ['reg','blue'];
 
document.write( ' o typeof is ' + typeof o);
document.write( ' <br />');
document.write( ' a typeof is ' + typeof a);

执行:

o typeof is object
a typeof is object  

因此,我们只能放弃这种方法,要判断是数组or对象有两种方法

第一,使用typeof加length属性
数组有length属性,object没有,而typeof数组与对象都返回object,所以我们可以这么判断

 代码如下 复制代码

var o = { 'name':'lee' };
var a = ['reg','blue'];
 
var getDataType = function(o){
    if(typeof o == 'object'){
        if( typeof o.length == 'number' ){
            return 'Array'; 
        }else{
            return 'Object';    
        }
    }else{
        return 'param is no object type';
    }
};
 
alert( getDataType(o) );    // Object
alert( getDataType(a) );    // Array
alert( getDataType(1) );    // param is no object type
alert( getDataType(true) ); // param is no object type
alert( getDataType('a') );  // param is no object type

第二,使用instanceof
使用instanceof可以判断一个变量是不是数组,如:

 代码如下 复制代码

var o = { 'name':'lee' };
var a = ['reg','blue'];
 
alert( a instanceof Array );  // true
alert( o instanceof Array );  // false

也可以判断是不是属于object

 代码如下 复制代码
var o = { 'name':'lee' };
var a = ['reg','blue'];
 
alert( a instanceof Object );  // true
alert( o instanceof Object );  // true

但数组也是属于object,所以以上两个都是true,因此我们要利用instanceof判断数据类型是对象还是数组时应该优先判断array,最后判断object

 代码如下 复制代码
var o = { 'name':'lee' };
var a = ['reg','blue'];
 
var getDataType = function(o){
    if(o instanceof Array){
        return 'Array'
    }else if( o instanceof Object ){
        return 'Object';
    }else{
        return 'param is no object type';
    }
};
 
alert( getDataType(o) );    // Object
alert( getDataType(a) );    // Array
alert( getDataType(1) );    // param is no object type
alert( getDataType(true) ); // param is no object type
alert( getDataType('a') );  // param is no object type

如果你不优先判断Array,比如:

 代码如下 复制代码
var o = { 'name':'lee' };
var a = ['reg','blue'];
 
var getDataType = function(o){
    if(o instanceof Object){
        return 'Object'
    }else if( o instanceof Array ){
        return 'Array';
    }else{
        return 'param is no object type';
    }
};
 
alert( getDataType(o) );    // Object
alert( getDataType(a) );    // Object
alert( getDataType(1) );    // param is no object type
alert( getDataType(true) ); // param is no object type
alert( getDataType('a') );  // param is no object type

那么数组也会被判断为object。

 

下面看一国外人写的

参考ECMA-262规范给一个通用的方法:

 代码如下 复制代码

function isArray(obj) {   
return Object.prototype.toString.call(obj) === '[object Array]';    
}

ECMA-262解释:

 代码如下 复制代码

Object.prototype.toString( ) When the toString method is called, the following steps are taken:
   Get the [[Class]] property of this object.
 
Compute a string value by concatenating the three strings “[object “, Result (1), and “]”.
Return Result (2)

该规范定义了Object.prototype.toString的行为:首先,取得对象的一个内部属性[[Class]],然后依据这个属性,返回一个类似于"[object Array]"的字符串作为结果(看过ECMA标准的应该都知道,[[]]用来表示语言内部用到的、外部不可直接访问的属性,称为“内部属性”)。利用这个方法,再配合call,我们可以取得任何对象的内部属性[[Class]],然后把类型检测转化为字符串比较,以达到我们的目的。
在ECMA标准中Array的描述吧:

ECMA-262 写道

 代码如下 复制代码

new Array([ item0[, item1 [,…]]])
The [[Class]] property of the newly constructed object is set to “Array”.

js的原型继承有个缺点,就是子类原来的原型对象被替换了,在获取子类的constructor的时候,实际取的是从父类继承的constructor。
如果不想改变constructor,可以采用以下方法实现继承:

 代码如下 复制代码

Function.prototype.extend = function(parent) {
var cls = new Function();
cls.prototype = parent.prototype;
this.prototype = new cls;
this.prototype.constructor = this;
}
function t(){};
t.extend(Array);
alert(x.constructor);//==t

而instaceof是判断对象的类型,比如:

时间: 2024-08-01 09:14:04

js判断一个变量是对象还是数组的相关文章

js 判断一个变量是否为数组完美解决办法

前端开发中,在做项目的时候,我们经常需要对一个变量进行数组类型的判断,当然即使你暂时没遇到,但是这个问题也是大家去面试时的高频问题,有必要拿出来说一说. 大家都知道js中可以使用typeof来判断变量的基本类型,如:  代码如下 复制代码 alert(typeof '111'); // "string" alert(typeof 22); // "number" alert(typeof a); // "undefined" alert(type

判断一个变量是数组Array类型的方法_javascript技巧

在很多时候,我们都需要对一个变量进行数组类型的判断.JavaScript中如何判断一个变量是数组Array类型呢?我最近研究了一下,并分享给大家,希望能对大家有所帮助. JavaScript中检测对象的方法 1.typeof操作符 这种方法对于一些常用的类型来说那算是毫无压力,比如Function.String.Number.Undefined等,但是要是检测Array的对象就不起作用了. 复制代码 代码如下: alert(typeof null); // "object" alert

JavaScript判断变量是对象还是数组的方法_javascript技巧

typeof都返回object 在JavaScript中所有数据类型严格意义上都是对象,但实际使用中我们还是有类型之分,如果要判断一个变量是数组还是对象使用typeof搞不定,因为它全都返回object 复制代码 代码如下: var o = { 'name':'lee' }; var a = ['reg','blue'];   document.write( ' o typeof is ' + typeof o); document.write( ' <br />'); document.wr

JS判断字符串变量是否含有某个字串的实现方法_javascript技巧

JS判断字符串变量是否含有某个字串的实现方法 varCts = "bblText"; if(Cts.indexOf("Text") > 0 ){ alert('Cts中包含Text字符串'); } indexOf用法: 返回 String 对象内第一次出现子字符串的字符位置. strObj.indexOf(subString[, startIndex]) 参数 strObj 必选项.String 对象或文字. subString 必选项.要在 String 对

JS判断是否为JSON对象及是否存在某字段的方法(推荐)_javascript技巧

实例如下: $.ajax({ type: 'POST', url: url, success(function(data){ //判断是否为JSON对象 if(typeof(data) == "object" && Object.prototype.toString.call(data).toLowerCase() == "[object object]" && !data.length){ alert("is JSON 0

js判断undefined变量类型使用typeof_javascript技巧

js判断undefined变量类型直接用 复制代码 代码如下: if(mydata=='undefined'){ alert("未定义"); } 这是个很低级的错误,这么使: 复制代码 代码如下: if(typeof(mydata)=='undefined'){ alert("未定义"); }

关于利用ajax使同一php文件下js的一个变量值传递给php

问题描述 关于利用ajax使同一php文件下js的一个变量值传递给php 需要引用什么js文件吗?比如我想吧一个var a=2;的值给php的$a,该怎么写程序?麻烦了- 解决方案 php与js变量传递 解决方案二: 直接用ajax把js中的变量传递给php,php接收后赋值就好了,可以用jQuery来进行ajax传值 解决方案三: jquery $.ajax({ url: 'PHP路径', data:{nums:2}, }); php $a=$_GET['nums'];

js判断一个字符串是否包含一个子串的方法_javascript技巧

本文实例讲述了js判断一个字符串是否包含一个子串的方法.分享给大家供大家参考.具体如下: 在我们前端日常开发中,经常会遇到判断一个字符串中是否包含某个子串,这里我们将去探究一些解决此种需求的方法以及正确的使用它们.理想情况下,我们要找的是一个能匹配我们的目的(if x contains y)的方法,并返回true或false. 一.String.prototype.indexOf和String.prototype.lastIndexOf 这两个方法,可能是我们最容易想到的,如果包含子串,则返回大

js判断一个元素是否为另一个元素的子元素的代码_javascript技巧

当然方法有很多,不过个人认为通过判断一个元素是否为另一个元素的子元素是最简单的实现方式之一. 废话少说直接上方法: 复制代码 代码如下: function isParent (obj,parentObj){ while (obj != undefined && obj != null && obj.tagName.toUpperCase() != 'BODY'){ if (obj == parentObj){ return true; } obj = obj.parentN