【问题标题】:How to check if an argument is an object (and not an array) in JavaScript如何在 JavaScript 中检查参数是否是对象(而不是数组)
【发布时间】:2012-05-31 06:44:20
【问题描述】:

在测试instasnceof后发现,如果参数是数组或对象字面量,它会返回true。

function test(options){
  if(options instanceof Object){alert('yes')}//this will alert for both arrays and object literals
}
test({x:11})// alerts
test([11])// alerts as well but I do not want it to

有没有办法测试参数“options”是否是一个对象字面量?

附:我正在创建一个允许用户访问其配置选项的模块,并且我想测试参数是否只是 object literal

【问题讨论】:

标签: javascript arguments argument-passing


【解决方案1】:

有没有办法测试参数“options”是否是一个对象字面量?

不,因为它没有任何意义。您可以测试它是否是 object,以及它是如何创建的(通过函数调用中的文字,通过其他地方的文字,通过new Object,通过反序列化 JSON 字符串,... ) 不是维护的信息。

在测试 instasnceof 后,我发现如果参数是数组或对象字面量,它将返回 true

正确。 JavaScript 中的数组是对象(和not really arrays)。

如果你想测试一个对象是否是一个普通的旧对象,你可以这样做:

if (Object.prototype.toString.call(options) === "[object Object]") {
    // It's a plain object
}

但是真的没有理由这样做。这不是你的问题。只要它们传递给您的具有您期望的属性,就不要试图进一步限制对象。

附言我正在制作一个允许用户传递配置选项的模块,我想测试以确保参数只是一个对象文字。

为什么?如果用户想要使用一个没有被声明为文字的对象,那么你为什么要关心呢?如果他们想使用他们通过不同的构造函数创建的对象(例如,而不仅仅是一个普通的对象),那么你为什么要关心?

【讨论】:

  • 那么我应该检查属性以及它们是否有值而不是参数是什么?
  • @codewombat:是的,就是这样。只是测试你想看到的东西。 (这有时被称为“鸭子打字”——例如,它像鸭子一样走路,像鸭子一样嘎嘎叫吗?那么它就是鸭子。)
  • 我不会说 JavaScript 中的数组不是数组……但它们也是对象。
  • @Bergi:我没有说它们不是数组,我说它们不是数组(小写)。请参阅链接了解我为什么这么说。
  • 优秀的答案。在深入研究另一种语言之前,我正在尝试使用 javascript 做更高级的事情我想确保我的“P 和 Q”(即最佳/正确做法)在继续之前是直截了当的,这有助于解决这个问题。
【解决方案2】:
function isPlainObject(o) {
     return Object(o) === o && Object.getPrototypeOf(o) === Object.prototype;
}

但是,您无法测试 o 是否被声明为文字或以其他方式实例化 - 您只能测试它是否是一个 普通对象 没有任何构造函数而不是 Object

【讨论】:

  • 我个人并不关心,但这在测试跨框架/窗口传递的值时不起作用。
  • 是的,没错。但是,无论如何您都无法测试这样的对象,对吗?
  • 是的,you can 但它相当可怕:function isArray(o) { return Object.prototype.toString.call(o) === '[object Array]'; }
  • 我知道那个,但你将如何编码isObject?哦,等等,Object.getPrototypeOf(Object.getPrototypeOf(o))=== null 应该可以工作 - 比 toString-trick 可怕得多:-)
  • 不,只需将基于字符串的版本中的Array 替换为Object
【解决方案3】:

如果你想禁止数组,你可以这样做:

var isObject = options instanceof Object;
var isArray = options instanceof Array;
if(isObject && !isArray)
{
    alert('yes');
}

【讨论】:

  • 查看 Array.isArray() 及其常用的垫片。
猜你喜欢
  • 2011-08-21
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 2017-06-22
相关资源
最近更新 更多