arrays es6判断是否是数组 - 你如何检查一个变量是否是JavaScript中的数组?




es6判断数组 js判断是否是数组 (21)

这个问题在这里已经有了答案:

我想检查一个变量是JavaScript中的数组还是单个值。

我找到了一个可能的解决方案...

if (variable.constructor == Array)...

这是可以做到的最好的方式吗?


Answers

我注意到有人提到jQuery,但我不知道有一个isArray()函数。 事实证明,它是在1.3版本中添加的。

jQuery按照Peter的说法来实现它:

isArray: function( obj ) {
    return toString.call(obj) === "[object Array]";
},

已经对jQuery产生了很大的信心(特别是他们的跨浏览器兼容技术),我会升级到1.3版本并使用它们的功能(假设升级不会导致太多问题),或者直接在我的码。

非常感谢您的建议。


我个人喜欢Peter的建议: https://.com/a/767499/414784 : Array.isArray()对于ECMAScript 3.对于ECMAScript 5,请使用Array.isArray()

但是,对帖子的评论表明,如果toString()完全改变,那么检查数组的方式将失败。 如果你真的想要具体,并确保toString()没有被改变,并且对象类属性没有问题( [object Array]是一个数组对象的类属性),那么我建议做像这样的东西:

//see if toString returns proper class attributes of objects that are arrays
//returns -1 if it fails test
//returns true if it passes test and it's an array
//returns false if it passes test and it's not an array
function is_array(o)
{
    // make sure an array has a class attribute of [object Array]
    var check_class = Object.prototype.toString.call([]);
    if(check_class === '[object Array]')
    {
        // test passed, now check
        return Object.prototype.toString.call(o) === '[object Array]';
    }
    else
    {
        // may want to change return value to something more desirable
        return -1; 
    }
}

请注意,在JavaScript权威指南第六版7.10中,它说Array.isArray()是使用ECMAScript 5中的Array.isArray()实现的。另外请注意,如果您要担心toString() '如果实施方式发生变化,您也应该担心其他内置方法也在变化。 为什么使用push() ? 有人可以改变它! 这种做法很愚蠢。 上述检查是为那些担心toString()更改的人提供的解决方案,但我相信检查是不必要的。


function isArray(x){
    return ((x != null) && (typeof x.push != "undefined"));
}


我认为使用myObj.constructor == Object和myArray.constructor == Array是最好的方法。 它比使用toString()快近20倍。 如果使用自己的构造函数扩展对象,并希望这些创建被视为“对象”,那么这不起作用,否则其方式更快。 typeof与构造函数方法一样快,但typeof [] =='object'返回true,这通常是不可取的。 http://jsperf.com/constructor-vs-tostring

有一件事要注意的是,null.constructor会抛出一个错误,所以如果你可能正在检查空值,你将不得不首先做(testThing!== null){}


当我发布这个问题时,我使用的JQuery版本没有包含isArray函数。 如果它有,我可能只是用它相信这个实现是执行这个特定类型检查的最佳浏览器独立方式。

既然JQuery现在提供了这个功能,我会一直使用它...

$.isArray(obj);

(从版本1.6.2开始)它仍然使用表单中字符串的比较来实现

toString.call(obj) === "[object Array]"

w3schools

function isArray(myArray) {
    return myArray.constructor.toString().indexOf("Array") > -1;
}

我正在使用这一行代码:

if (variable.push) {
   // variable is array, since AMAIK only arrays have push() method.
}

有各种各样的怪癖的解决方案。 本页面提供了一个很好的概述。 一个可能的解决方案是

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

这是一个古老的问题,但有同样的问题,我发现了一个非常优雅的解决方案,我想分享。

向Array添加原型使其非常简单

Array.prototype.isArray = true;

现在,如果你有一个对象,你想测试一下,看看它的数组是否需要检查新的属性

var box = doSomething();

if (box.isArray) {
    // do something
}

isArray仅在其数组可用时可用


你也可以使用:

if (value instanceof Array) {
  alert('value is Array!');
} else {
  alert('Not an array');
}

这对我来说似乎是一个非常优雅的解决方案,但是对于他自己来说。

编辑:

从ES5开始,现在还有:

Array.isArray(value);

但是,除非你使用polyfills(基本上...... IE8或类似的),否则这将在较旧的浏览器上打破。


通用解决方案如下:

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

从ECMAScript 5开始,一个正式的解决方案是:

Array.isArray(arr)

另外,对于旧的JavaScript库,你可以找到下面的解决方案,虽然它不够准确:

var is_array = function (value) {
    return value &&
    typeof value === 'object' &&
    typeof value.length === 'number' &&
    typeof value.splice === 'function' &&
    !(value.propertyIsEnumerable('length'));
};

解决方案来自http://www.pixelstech.net/topic/85-How-to-check-whether-an-object-is-an-array-or-not-in-JavaScript


我刚想到的东西:

if (item.length) //This is an array else //not an array


对于那些使用高尔夫球的人来说,用最少的字符进行不可靠的测试:

function isArray(a) {
  return a.map;
}

这在遍历/展平层次结构时通常使用:

function golf(a) {
  return a.map?[].concat.apply([],a.map(golf)):a;
}

input: [1,2,[3,4,[5],6],[7,[8,[9]]]]
output: [1, 2, 3, 4, 5, 6, 7, 8, 9]

我创建了一小段代码,可以返回真实类型。

我还不确定表现如何,但它是试图正确识别这种类型的表现。

https://github.com/valtido/better-typeOf在这里也有一点关于它的博客http://www.jqui.net/jquery/better-typeof-than-the-javascript-native-typeof/

它的工作原理类似于现在的类型。

var user = [1,2,3]
typeOf(user); //[object Array]

它认为它可能需要一些微调,并考虑到事情,我还没有碰到或测试过它。 所以欢迎进一步的改进,无论是性能方面,还是错误地重新移植typeOf。


在现代浏览器(以及一些传统浏览器)中,您可以这样做

Array.isArray(obj)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray Chrome 5,Firefox 4.0,IE 9,Opera 10.5和Safari 5支持)

如果您需要支持较早版本的IE,则可以使用es5-shimes5-shim Array.isArray; 或添加以下内容

# only implement if no native implementation is available
if (typeof Array.isArray === 'undefined') {
  Array.isArray = function(obj) {
    return Object.prototype.toString.call(obj) === '[object Array]';
  }
};

如果你使用jQuery,你可以使用jQuery.isArray(obj)或者$.isArray(obj) 。 如果你使用下划线,你可以使用_.isArray(obj)

如果你不需要检测在不同帧中创建的数组,你也可以使用instanceof

obj instanceof Array

注意 :可用于访问函数参数的arguments关键字不是数组,即使它(通常)的行为如下所示:

var func = function() {
  console.log(arguments)        // [1, 2, 3]
  console.log(arguments.length) // 3
  console.log(Array.isArray(arguments)) // false !!!
  console.log(arguments.slice)  // undefined (Array.prototype methods not available)
  console.log([3,4,5].slice)    // function slice() { [native code] } 
}
func(1, 2, 3)

由于.length属性对于JavaScript中的数组非常特殊,因此您可以简单地说

obj.length === +obj.length // true if obj is an array

Underscorejs和其他几个库使用这个简单而简单的技巧。


有几种检查变量是否是数组的方法。 最好的解决方案就是你选择的那个。

variable.constructor === Array

这是Chrome上最快的方法,并且很可能是所有其他浏览器。 所有数组都是对象,因此检查构造函数属性对于JavaScript引擎来说是一个快速过程。

如果您在查找对象属性是否为数组时遇到问题,则必须先检查属性是否存在。

variable.prop && variable.prop.constructor === Array

其他一些方法是:

variable instanceof Array

作为第一个例子,该方法的运行速度约为1/3 。 如果你只是关于漂亮的代码而不是性能上的话,它仍然非常坚固,看起来更干净。 请注意,检查数字不起作用,因为variable instanceof Number始终返回false更新: instanceof现在以2/3的速度!

Array.isArray(variable)

最后一个在我看来是最丑的,而且是最慢的一个。 作为第一个例子,以约1/5的速度运行。 Array.prototype实际上是一个数组。 你可以在这里阅读更多关于它的信息https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray

所以又一次更新

Object.prototype.toString.call(variable) === '[object Array]';

这家伙是尝试检查数组最慢的人。 不过,这是您寻找任何类型的一站式商店。 但是,由于您正在寻找一个数组,只需使用上面最快的方法。

此外,我跑了一些测试: http://jsperf.com/instanceof-array-vs-array-isarray/33 : http://jsperf.com/instanceof-array-vs-array-isarray/33所以有一些乐趣,并检查出来。

注意:由于jsperf.com关闭,@EscapeNetscape创建了另一个测试。 http://jsben.ch/#/QgYAV我想确保每当jsperf恢复在线时原始链接都会保留。



我喜欢Brian的回答:

function is_array(o){
    // make sure an array has a class attribute of [object Array]
    var check_class = Object.prototype.toString.call([]);
    if(check_class === '[object Array]')    {
        // test passed, now check
        return Object.prototype.toString.call(o) === '[object Array]';
    } else{
        // may want to change return value to something more desirable
        return -1; 
    }
}

但你可以这样做:

return Object.prototype.toString.call(o) === Object.prototype.toString.call([]);

你有1到9个数组,你想删除5使用下面的代码。

var numberArray = [1, 2, 3, 4, 5, 6, 7, 8, 9];

var newNumberArray = numberArray.filter(m => {
  return m !== 5;
});

console.log("new Array, 5 removed", newNumberArray);

如果你想要多个值ex: - 1,7,8

var numberArray = [1, 2, 3, 4, 5, 6, 7, 8, 9];

var newNumberArray = numberArray.filter(m => {
  return (m !== 1) && (m !== 7) && (m !== 8);
});

console.log("new Array, 5 removed", newNumberArray);

如果要删除数组ex中的数组值: - [3,4,5]

var numberArray = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var removebleArray = [3,4,5];

var newNumberArray = numberArray.filter(m => {
    return !removebleArray.includes(m);
});

console.log("new Array, [3,4,5] removed", newNumberArray);

包括支持的浏览器是link





javascript arrays variables