【问题标题】:JavaScript: Determining if a variable is an object literal [duplicate]JavaScript:确定变量是否是对象文字
【发布时间】:2018-09-02 04:49:33
【问题描述】:

我正在寻找一种方法来确定给定变量是否是对象文字而不是其他任何东西。在下面的示例中,我只希望 a 返回 true 和任何其他给定对象。

var a = {};
var b = [];
var c = new Set();

console.log('typeof:');
console.log('  Literal: ', typeof a === 'object' );
console.log('  Array: ', typeof b === 'object' );
console.log('  Array: ', typeof b === 'object' && !b.prototype );
console.log('  Array: ', typeof b === 'object' && b instanceof Object );
console.log('  Array: ', typeof b === 'object' && !b instanceof Array );
console.log('  Set: ', typeof c === 'object' );
console.log('  Set: ', typeof c === 'object' && !c.prototype );
console.log('  Set: ', typeof c === 'object' && c instanceof Object );
console.log('  Set: ', typeof c === 'object' && !c instanceof Set );

instanceof 如果使用硬编码类进行检查,似乎可以工作,但这对于我正在尝试做的事情是不可行的。

【问题讨论】:

    标签: javascript


    【解决方案1】:

    一种选择是获取原型构造函数的name

    var a = {};
    var b = [];
    var c = new Set();
    
    const type = obj => Object.getPrototypeOf(obj).constructor.name;
    console.log(type(a));
    console.log(type(b));
    console.log(type(c));
    
    const isPlainObject = obj => Object.getPrototypeOf(obj).constructor.name === 'Object';
    console.log(isPlainObject(a));
    console.log(isPlainObject(b));
    console.log(isPlainObject(c));

    【讨论】:

      【解决方案2】:

      你可以用Object检查对象的constructor属性:

      var a = {};
      var b = [];
      var c = new Set();
      
      console.log('a:', a.constructor === Object);
      console.log('b:', b.constructor === Object);
      console.log('c:', c.constructor === Object);

      【讨论】:

        【解决方案3】:

        我认为这样的函数应该是原生的,就像 Object.isLiteral()

        var a = {};
        var b = [];
        var c = new Set();
        
        Object.prototype.isLiteral = function() {
          return this.constructor === Object || false;
        };
        
        const value = a.isLiteral();
        console.log(value);
        

        【讨论】:

          猜你喜欢
          • 2010-11-13
          • 1970-01-01
          • 2014-07-13
          • 2019-12-05
          • 2011-03-19
          • 1970-01-01
          • 1970-01-01
          • 2016-10-18
          • 1970-01-01
          相关资源
          最近更新 更多