Skip to content

Instantly share code, notes, and snippets.

@sttk
Last active March 11, 2021 12:27
Show Gist options
  • Save sttk/a1da2f55c1d8ef13f3e4fc356efd4b13 to your computer and use it in GitHub Desktop.
Save sttk/a1da2f55c1d8ef13f3e4fc356efd4b13 to your computer and use it in GitHub Desktop.
The differences of behaviors of `isPlainObject`

The differences of behaviors of isPlainObject

(Node.js v0.11〜)

          PObject   PObj      lodash    @fav      
(1)       true      true      true      true      
(2)       true      true      true      true      
(3)       true      true      true      true      
(4)       true      true      true      true      
(5)       true      false     false     false     
(6)       false     false     false     false     
(7)       false     false     false     false     
(8)       false     false     false     false     
(9)       false     false     false     false     
(10)      false     false     false     false     
(11)      false     false     false     false     
(12)      false     false     false     false     
(13)      false     false     false     false     
(14)      false     false     false     false     
(15)      false     false     false     false     
(16)      false     false     false     false     
(17)      false     false     false     false     
(18)      false     false     false     false     
(19)      true      true      true      true      
(20)      true      true      true      true      
(21)      true      true      true      true      
(22)      true      true      true      true      
(23)      true      true      true      true      
(24)      false     true      true      true      
(25)      false     true      true      true      
(26)      false     true      true      true      
(27)      false     true      true      true      
(28)      false     true      true      true      
(29)      *Error*   true      true      true      
(30)      true      true      true      true      
(31)      *Error*   true      false     true      

(Node.js 〜v0.10)

          PObject   lodash    @fav      
(1)       true      true      true      
(2)       true      true      true      
(3)       true      true      true      
(4)       true      true      true      
(5)       true      false     false     
(6)       false     false     false     
(7)       false     false     false     
(8)       false     false     false     
(9)       false     false     false     
(10)      false     false     false     
(11)      false     false     false     
(12)      false     false     false     
(13)      false     false     false     
(15)      false     false     false     
(16)      false     false     false     
(17)      false     false     false     
(18)      false     false     false     
(19)      true      false     false     
(20)      true      false     false     
(21)      true      false     false     
(22)      true      false     false     
(23)      true      true      true      
(24)      false     true      true      
(25)      false     true      true      
(26)      false     true      true      
(27)      false     true      true      
(28)      false     true      true      
(29)      *Error*   true      true      
(30)      true      true      true      
(31)      *Error*   false     true      
'use strict';

var padRight = require('@fav/text.pad-right');

var funcs = [
  ['PObject', require('is-plain-object').isPlainObject],
  ['PObj',    require('is-plain-obj')],
  ['lodash',  require('lodash.isplainobject')],
  ['@fav',    require('@fav/type.is-plain-object')],
];

var colWidth = 10;

function header() {
  var str = funcs.map(function(fn) {
    return fn[0];
  }).reduce(function(s, r) {
    return s + padRight(r, colWidth);
  }, padRight('', colWidth));
  console.log(str);
}

function test(n, v) {
  var str = funcs.map(function(fn) {
    try {
      return fn[1](v);
    } catch (e) {
      return '*Error*';
    }
  }).reduce(function(s, r) {
    return s + padRight('' + r, colWidth);
  }, padRight('(' + n + ')', colWidth));
  console.log(str);
}


header();
test(1, {});
test(2, { foo: 'bar' });
test(3, Object.create(Object.prototype));
test(4, Object.create(null));
test(5, Object.create({}));
test(6, null);

test(7, true);
test(8, 0);
test(9, 123);
test(10, 'abc');
test(11, new Date(0));
test(12, []);
test(13, ['foo', 'bar']);
test(14, Symbol('foo'));
test(15, function() {});
test(16, function A() {});
test(17, new function() {});
test(18, new function Foo() {});

test(19, JSON.parse('{"__proto__":{}}'));
test(20, JSON.parse('{"__proto__":{"polluted":1}}'));
test(21, JSON.parse('{"__proto__":{"__proto__":{}}}'));
test(22, JSON.parse('{"__proto__":{"__proto__":{"polluted":1}}}'));
test(23, JSON.parse('{"__proto__":null}'));

test(24, JSON.parse('{"constructor":{"prototype":{}}}'));
test(25, JSON.parse('{"constructor":{"prototype":{"polluted":1}}}'));
test(26, JSON.parse('{"constructor":{"prototype":{"__proto__":{}}}}'));
test(27, JSON.parse('{"constructor":{"prototype":{"constructor":{"prototype":{"polluted":1}}}}}'));
test(28, JSON.parse('{"constructor":{"prototype":null}}'));

var a = {};
a.constructor = null;
test(29, a);

a = {};
a.__proto__ = null;
test(30, a);

a = {};
a.__proto__.constructor = null;
test(31, a);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment