Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何分辨给定对象是数组还是对象?_Javascript_Arrays_Object_Typing - Fatal编程技术网

Javascript 如何分辨给定对象是数组还是对象?

Javascript 如何分辨给定对象是数组还是对象?,javascript,arrays,object,typing,Javascript,Arrays,Object,Typing,好吧,这里没什么特别的,只是一些JSON: var a = ["foo", "bar", "baz"]; var o = {a: "foo", b: "bar", c: "baz"}; 但是当我们这样做的时候会发生什么呢 typeof a; // => "object" 如果我能把命令改成“数组”,我会很高兴的。但我不能。有什么区别的方法吗?使用 请记住,所有数组都是对象(因为对象位于数组的原型链上),所以要区分数组和非数组,必须与数组构造函数进行比较,不能使用对象构造函数 使用 请

好吧,这里没什么特别的,只是一些JSON:

var a = ["foo", "bar", "baz"];

var o = {a: "foo", b: "bar", c: "baz"};
但是当我们这样做的时候会发生什么呢

typeof a; // => "object"
如果我能把命令改成“数组”,我会很高兴的。但我不能。有什么区别的方法吗?

使用

请记住,所有数组都是对象(因为对象位于数组的原型链上),所以要区分数组和非数组,必须与
数组
构造函数进行比较,不能使用
对象
构造函数

使用


请记住,所有数组都是对象(因为对象位于数组的原型链上),所以要区分数组和非数组,必须与
数组
构造函数进行比较,不能使用
对象
构造函数

如果您不在多窗口环境中,您可以检查构造函数

var isArray = possiblyAnArray.constructor == Array;
…或使用
实例

var isArray = possiblyAnArray instanceof Array;
这些函数在多窗口环境中不起作用,因为不同窗口的数组构造函数将持有不同的引用。在这种情况下,你需要以一种更慢的方式来做

var isArray = ({}).toString.call(possiblyAnArray) == "[object Array]";
我也看到了另一种方法,它很容易实现,但根本不能保证严格地告诉您什么是
数组

Array.prototype.isArray = true;
var isArray = [].isArray;

我不建议使用它,但看看它是如何工作的很有趣。

如果您不在多
窗口环境中,您可以检查构造函数

var isArray = possiblyAnArray.constructor == Array;
…或使用
实例

var isArray = possiblyAnArray instanceof Array;
这些函数在多窗口环境中不起作用,因为不同窗口的数组构造函数将持有不同的引用。在这种情况下,你需要以一种更慢的方式来做

var isArray = ({}).toString.call(possiblyAnArray) == "[object Array]";
我也看到了另一种方法,它很容易实现,但根本不能保证严格地告诉您什么是
数组

Array.prototype.isArray = true;
var isArray = [].isArray;

我不建议使用它,但看看它是如何工作的很有趣。

您可以检查对象是否是
数组的实例:

var isArray = a instanceof Array;

您可以检查对象是否是
数组的实例:

var isArray = a instanceof Array;

另一种方法是使用duck类型。这取决于用例

例如,如果要计算数组中的项,而这不是JSON对象中可以做的事情,可以尝试:

if (typeof(obj.length) !=="undefined"){ //do whatever}

这将使您可以选择将代码基于objects属性,而不是它的真实类,在某些情况下,这可能不太相关。

另一种方法是使用duck类型。这取决于用例

例如,如果要计算数组中的项,而这不是JSON对象中可以做的事情,可以尝试:

if (typeof(obj.length) !=="undefined"){ //do whatever}

这将使您可以选择将代码基于objects属性,而不是它的真实类,这在某些情况下可能不太相关。

刚刚发现:它有什么问题吗

var a = [4,5,6,7];
if(typeof a === object) a.type = "object";
if(a.__proto__ === Array.prototype) a.type = "array";

刚刚发现:有什么问题吗

var a = [4,5,6,7];
if(typeof a === object) a.type = "object";
if(a.__proto__ === Array.prototype) a.type = "array";


向数组中添加任何非数字的内容都会使其成为关联(对象)。@Nile-否。JavaScript没有任何称为“关联数组”的内容。向数组中添加非数值并没有什么特别的作用。向数组中添加非数字属性(通常)不是最佳做法,但它不会使其成为对象(因为它已经是对象)。向数组中添加任何非数字属性都会使其成为关联(对象)。@Nile-否。JavaScript没有任何称为“关联数组”的内容。向数组中添加非数值并没有什么特别的作用。将非数值属性添加到数组(通常)不是最佳做法,但它不会使其成为对象(因为它已经是对象)。哦,什么算是多窗口环境?@adlwalrus
iframe
就是一个很好的例子。这是不常见的,但值得了解,如果编写一个通用实用程序函数,则值得使用后者(如果没有,请确保记录它,使其不会跨
窗口
)。噢,多窗口环境算什么?@adlwalrus
iframe
就是一个很好的例子。这是不常见的,但值得了解,如果编写一个通用实用程序函数,则值得使用后者(如果没有,请确保记录它,使其不会跨
窗口
)。是的,
\uuu proto\uuu
是非标准的,在IE中根本不受支持。真的吗?那么,它是如何得到如此广泛的应用/支持的呢?它正在成为标准吗?不,标准是。由于Firefox实现了它,其他浏览器都复制了它(如果您不考虑广泛支持)。这也不是一个很好的方法来检查是否存在其他具有优秀浏览器支持的方法。哦,好的。伟大的什么是基于标准的,相当于为对象的
\uuuuu proto\uuuuu
分配一个新值?值得一提的是
\uuuu proto\uuuuuu
现在正变得标准化。是的,
\uuuuuuu proto\uuuuu
是非标准的,在IE中根本不受支持。真的吗?那么,它是如何得到如此广泛的应用/支持的呢?它正在成为标准吗?不,标准是。由于Firefox实现了它,其他浏览器都复制了它(如果您不考虑广泛支持)。这也不是一个很好的方法来检查是否存在其他具有优秀浏览器支持的方法。哦,好的。伟大的什么是基于标准的等价于为对象的
\uuuuu proto\uuuuu
分配一个新值?值得一提的是
\uuuu proto\uuuuu
现在正变得标准化。JSON对象,你能解释一下那是什么吗?只是对象{}或对象。Underline实现是一个普通的键值map.JSON对象,您能解释一下它是什么吗?只是对象{}或对象。下划线实现是一个简单的键值映射。