typeof对象但不是数组

时间:2016-12-24 06:57:43

标签: javascript node.js

我正在寻找快速检查来确定这个

function isPlainObject(input){
   return !Array.isArray(input) && typeof input === 'object'
}

是否有一个较短的检查,我可以用来确定输入是这样的

{}

但不是数组

[]

或其他可能仍以结帐'对象'?

结帐的结构

3 个答案:

答案 0 :(得分:5)

检查虚拟值(例如null是一个对象)不是更快,而是更精确。

function isPlainObject(input){
   return input && !Array.isArray(input) && typeof input === 'object';
}

答案 1 :(得分:3)

如果你想检查对象是否是"普通"对象,即直接从 Object.prototype 继承,那么你应该检查它。

E.g。以下第一次测试是否在其原型链的任何地方都有 Object (因此不会为 getPrototypeOf 引发错误),然后检查它的直接[[prototype]]是否是 Object.prototype



function isPlainObject(value) {
  return value instanceof Object &&
         Object.getPrototypeOf(value) == Object.prototype;
}

// Some tests
[[1,2],         // Array
 {},            // Plain object
 null,          // null
 document.createElement('div'),  // host object
 function(){},  // function object
 console        // host objet
 ].forEach(function(value) {
      console.log(value + ': ' + isPlainObject(value));
 });




修改

如果你想测试输入是某个扩展对象而不是功能等,效率低得多,例如针对您要避免的某些对象列表进行测试:



function isJustObj(obj) {
  var notThese = [Function, Array, Date];
  if (obj instanceof Object) {
    return !notThese.some(function(o) {
      return obj instanceof o;
    });
  }
  return false;
}

function Foo(){}

var tests = {'Array: ':[],
             'Object: ' : {},
             'Foo instance:' : new Foo(),
             'Function: ' : function(){},
             'Date: ' : new Date(),
             'Host obj: ' : document.createElement('div')
};

Object.keys(tests).forEach(function(test) {
  console.log(test + isJustObj(tests[test]));
})




请注意,此策略会查看该值是否为某种Object,然后测试它是否是特定构造函数集的实例。这个要排除的事物列表可能变得非常大,因为它不可能以任何合理的方式排除主机对象,这些主机本质上可以根据一些常规测试与内置对象无法区分(参见{ {3}})。

E.g。

console.log instanceof Function // true
console instanceof Object       // true
isPlainObject(console)          // false

因此,您要么检查Object.prototype是否是直接[[Prototype]],要么创建一个要测试的长构造函数列表。鉴于可用的主机环境多种多样,以及实现者扩展它的自由,该列表将很快过时。此外,您需要在尝试使用它之前测试主机对象集的每个成员,因为对于运行代码的特定主机,它可能不存在。

答案 2 :(得分:1)

Javascript数组被认为是对象,因此在数组的情况下,typeof将始终是对象。