foop
Version:
interfaces that describe their intentions.
89 lines (81 loc) • 7.55 kB
JavaScript
var funcToString = require('../native/functionToString')
var hasOwnProperty = require('../util/hasOwnProperty')
var getPrototypeOf = require('../util/getPrototypeOf')
var isObjTag = require('./objTag')
var isObjectLike = require('./objNotNull')
var isFunction = require('./function')
var isNull = require('./null')
/** Used to infer the `Object` constructor. */
var objectConstructorString = funcToString.call(Object)
/**
* Checks if `value` is a plain object, that is, an object created by the
* `Object` constructor or one with a `[[Prototype]]` of `null`.
*
* @since 5.0.0-beta.5
* @memberOf is
*
* @param {*} value The value to check.
* @return {boolean} Returns `true` if `value` is a plain object, else `false`.
*
* @name isObjPlain
* @alias isPlainObject
* @alias isObjectPlain
* @alias isBlankObject
*
* {@link https://github.com/facebook/immutable-js/blob/master/src/fromJS.js#L52 immutable-is-plain-object}
* {@link https://github.com/mobxjs/mobx/blob/master/src/utils/utils.ts#L78 mobx-isobjectplain}
* {@link https://github.com/lodash/lodash/blob/master/isPlainObject.js lodash-isplainobject}
* {@link http://stackoverflow.com/questions/34111902/why-do-lodashs-isobject-isplainobject-behave-differently-than-typeof-x stackoverflow-lodash-isplainobject}
* {@link https://github.com/madrobby/zepto/blob/master/src/zepto.js#L74 zepto-isplainobject}
* {@link https://github.com/canjs/canjs/blob/2.3-legacy/util/object/isplain/isplain.js can-is-plain}
* @see {@link can-is-plain}
* @see {@link zepto-isplainobject}
* @see {@link stackoverflow-lodash-isplainobject}
* @see {@link lodash-isplainobject}
* @see {@link mobx-isobjectplain}
* @see {@link immutable-is-plain-object}
*
* @see is/objNotNull
* @see is/objTag
*
* @func
* @fork 0.8.0
* @category Lang
*
* @example
*
* function Foo() {
* this.a = 1
* }
*
* isPlainObject(new Foo)
* //=> false
*
* isPlainObject([1, 2, 3])
* //=> false
*
* isPlainObject({ 'x': 0, 'y': 0 })
* //=> true
*
* isPlainObject(Object.create(null))
* //=> true
*
*/
function isPlainObject(x) {
if (!isObjectLike(x) || !isObjTag(x)) {
return false
}
// --- get prototype
var proto = getPrototypeOf(x)
if (isNull(proto)) {
return true
}
// --- check if constructor is === `Object.constructor`
var constructor =
hasOwnProperty(proto, 'constructor') &&
proto.constructor
return isFunction(constructor) && constructor instanceof constructor &&
funcToString.call(constructor) === objectConstructorString
}
module.exports = isPlainObject
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqUGxhaW4uanMiLCJzb3VyY2VzIjpbIm9ialBsYWluLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGZ1bmNUb1N0cmluZyA9IHJlcXVpcmUoJy4uL25hdGl2ZS9mdW5jdGlvblRvU3RyaW5nJylcbmNvbnN0IGhhc093blByb3BlcnR5ID0gcmVxdWlyZSgnLi4vdXRpbC9oYXNPd25Qcm9wZXJ0eScpXG5jb25zdCBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL3V0aWwvZ2V0UHJvdG90eXBlT2YnKVxuY29uc3QgaXNPYmpUYWcgPSByZXF1aXJlKCcuL29ialRhZycpXG5jb25zdCBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL29iak5vdE51bGwnKVxuY29uc3QgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJy4vZnVuY3Rpb24nKVxuY29uc3QgaXNOdWxsID0gcmVxdWlyZSgnLi9udWxsJylcblxuLyoqIFVzZWQgdG8gaW5mZXIgdGhlIGBPYmplY3RgIGNvbnN0cnVjdG9yLiAqL1xuY29uc3Qgb2JqZWN0Q29uc3RydWN0b3JTdHJpbmcgPSBmdW5jVG9TdHJpbmcuY2FsbChPYmplY3QpXG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIHRoYXQgaXMsIGFuIG9iamVjdCBjcmVhdGVkIGJ5IHRoZVxuICogYE9iamVjdGAgY29uc3RydWN0b3Igb3Igb25lIHdpdGggYSBgW1tQcm90b3R5cGVdXWAgb2YgYG51bGxgLlxuICpcbiAqIEBzaW5jZSA1LjAuMC1iZXRhLjVcbiAqIEBtZW1iZXJPZiBpc1xuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICpcbiAqIEBuYW1lIGlzT2JqUGxhaW5cbiAqIEBhbGlhcyBpc1BsYWluT2JqZWN0XG4gKiBAYWxpYXMgaXNPYmplY3RQbGFpblxuICogQGFsaWFzIGlzQmxhbmtPYmplY3RcbiAqXG4gKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2ltbXV0YWJsZS1qcy9ibG9iL21hc3Rlci9zcmMvZnJvbUpTLmpzI0w1MiBpbW11dGFibGUtaXMtcGxhaW4tb2JqZWN0fVxuICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9tb2J4anMvbW9ieC9ibG9iL21hc3Rlci9zcmMvdXRpbHMvdXRpbHMudHMjTDc4IG1vYngtaXNvYmplY3RwbGFpbn1cbiAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbG9kYXNoL2xvZGFzaC9ibG9iL21hc3Rlci9pc1BsYWluT2JqZWN0LmpzIGxvZGFzaC1pc3BsYWlub2JqZWN0fVxuICoge0BsaW5rIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQxMTE5MDIvd2h5LWRvLWxvZGFzaHMtaXNvYmplY3QtaXNwbGFpbm9iamVjdC1iZWhhdmUtZGlmZmVyZW50bHktdGhhbi10eXBlb2YteCBzdGFja292ZXJmbG93LWxvZGFzaC1pc3BsYWlub2JqZWN0fVxuICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9tYWRyb2JieS96ZXB0by9ibG9iL21hc3Rlci9zcmMvemVwdG8uanMjTDc0IHplcHRvLWlzcGxhaW5vYmplY3R9XG4gKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2NhbmpzL2NhbmpzL2Jsb2IvMi4zLWxlZ2FjeS91dGlsL29iamVjdC9pc3BsYWluL2lzcGxhaW4uanMgY2FuLWlzLXBsYWlufVxuICogQHNlZSB7QGxpbmsgY2FuLWlzLXBsYWlufVxuICogQHNlZSB7QGxpbmsgemVwdG8taXNwbGFpbm9iamVjdH1cbiAqIEBzZWUge0BsaW5rIHN0YWNrb3ZlcmZsb3ctbG9kYXNoLWlzcGxhaW5vYmplY3R9XG4gKiBAc2VlIHtAbGluayBsb2Rhc2gtaXNwbGFpbm9iamVjdH1cbiAqIEBzZWUge0BsaW5rIG1vYngtaXNvYmplY3RwbGFpbn1cbiAqIEBzZWUge0BsaW5rIGltbXV0YWJsZS1pcy1wbGFpbi1vYmplY3R9XG4gKlxuICogQHNlZSBpcy9vYmpOb3ROdWxsXG4gKiBAc2VlIGlzL29ialRhZ1xuICpcbiAqIEBmdW5jXG4gKiBAZm9yayAwLjguMFxuICogQGNhdGVnb3J5IExhbmdcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMVxuICogfVxuICpcbiAqIGlzUGxhaW5PYmplY3QobmV3IEZvbylcbiAqIC8vPT4gZmFsc2VcbiAqXG4gKiBpc1BsYWluT2JqZWN0KFsxLCAyLCAzXSlcbiAqIC8vPT4gZmFsc2VcbiAqXG4gKiBpc1BsYWluT2JqZWN0KHsgJ3gnOiAwLCAneSc6IDAgfSlcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqIGlzUGxhaW5PYmplY3QoT2JqZWN0LmNyZWF0ZShudWxsKSlcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh4KSB7XG4gIGlmICghaXNPYmplY3RMaWtlKHgpIHx8ICFpc09ialRhZyh4KSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gLS0tIGdldCBwcm90b3R5cGVcbiAgY29uc3QgcHJvdG8gPSBnZXRQcm90b3R5cGVPZih4KVxuICBpZiAoaXNOdWxsKHByb3RvKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvLyAtLS0gY2hlY2sgaWYgY29uc3RydWN0b3IgaXMgPT09IGBPYmplY3QuY29uc3RydWN0b3JgXG5cbiAgY29uc3QgY29uc3RydWN0b3IgPVxuICAgIGhhc093blByb3BlcnR5KHByb3RvLCAnY29uc3RydWN0b3InKSAmJlxuICAgIHByb3RvLmNvbnN0cnVjdG9yXG5cbiAgcmV0dXJuIGlzRnVuY3Rpb24oY29uc3RydWN0b3IpICYmIGNvbnN0cnVjdG9yIGluc3RhbmNlb2YgY29uc3RydWN0b3IgJiZcbiAgICBmdW5jVG9TdHJpbmcuY2FsbChjb25zdHJ1Y3RvcikgPT09IG9iamVjdENvbnN0cnVjdG9yU3RyaW5nXG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNQbGFpbk9iamVjdFxuIl0sIm5hbWVzIjpbImNvbnN0Il0sIm1hcHBpbmdzIjoiQUFBQUEsR0FBSyxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsNEJBQTRCLENBQUM7QUFDMURBLEdBQUssQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLHdCQUF3QixDQUFDO0FBQ3hEQSxHQUFLLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQztBQUN4REEsR0FBSyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO0FBQ3BDQSxHQUFLLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUM7QUFDNUNBLEdBQUssQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQztBQUN4Q0EsR0FBSyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDOzs7QUFHaENBLEdBQUssQ0FBQyx1QkFBdUIsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF3RHpELFNBQVMsYUFBYSxDQUFDLENBQUMsRUFBRTtFQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQ3BDLE9BQU8sS0FBSztHQUNiOzs7RUFHREEsR0FBSyxDQUFDLEtBQUssR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDO0VBQy9CLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO0lBQ2pCLE9BQU8sSUFBSTtHQUNaOzs7O0VBSURBLEdBQUssQ0FBQyxXQUFXO0lBQ2YsY0FBYyxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUM7SUFDcEMsS0FBSyxDQUFDLFdBQVc7O0VBRW5CLE9BQU8sVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLFdBQVcsWUFBWSxXQUFXO0lBQ2xFLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssdUJBQXVCO0NBQzdEOztBQUVELE1BQU0sQ0FBQyxPQUFPLEdBQUcsYUFBYTsifQ==