鍍金池/ 問答/HTML/ 關(guān)于判斷js簡單對象的問題(plain object)

關(guān)于判斷js簡單對象的問題(plain object)

圖片描述

這是redux的實(shí)現(xiàn)方式https://github.com/reactjs/re...,
讓我疑惑的是后面這一通操作,

  let proto = obj
  while (Object.getPrototypeOf(proto) !== null) {
    proto = Object.getPrototypeOf(proto)
  }
  return Object.getPrototypeOf(obj) === proto*

個(gè)人粗見怎么都應(yīng)該是返回的true吧,這一通操作意義是什么呢?

請大神來答疑解惑。

回答
編輯回答
扯機(jī)薄

let proto = obj // proto 默認(rèn)值
while (Object.getprototypeOf(proto) !== null) { // 判斷proto的原型對象是否存在

proto = Object.getprototypeOf(proto) // 存在的話就把proto的原型對象賦值給proto,繼續(xù)判斷

}

return Object.getPrototypeOf(obj) === proto* // 實(shí)際上就是判斷obj的原型鏈有幾層,只有一層就返回true

2017年3月9日 17:36
編輯回答
喜歡你

為什么不用Object.prototype.toString.call(obj)
來判斷呢?

2017年5月15日 15:17
編輯回答
命于你

尋找原型鏈的頂端

let a = {};
isPlainObject(a); // true

class Person{};
let p = new Person();
isPlainObject(p); // false
2018年6月21日 00:36
編輯回答
入她眼

尋找原型鏈的頂端

2017年5月19日 00:41
編輯回答
執(zhí)念

就是找父親
找到null然后停止,開始對比null的兒子和判斷的對象的父親
object的父親是頂級的object對象,祖父是null
父親拿父親比較相等
function的父親是function,祖父是object,曾祖父是null
祖父跟父親比較不相等

2017年6月1日 21:00
編輯回答
眼雜

涉及到原型鏈的繼承,你運(yùn)行下代碼就明白了:

function Foo() {}

// obj不是一個(gè)plain object
var obj = new Foo();

console.log(typeof obj, obj !== null);


let proto = obj
while (Object.getPrototypeOf(proto) !== null) {
  proto = Object.getPrototypeOf(proto)
}

// false
var isPlain = Object.getPrototypeOf(obj) === proto;
console.log(isPlain);
2017年8月19日 22:51
編輯回答
萌面人

那么問題來了,按照jQuery上isPlainObject方法的定義

isPlainObject: function( obj ) {
        var proto, Ctor;
        if ( !obj || toString.call( obj ) !== "[object Object]" ) {
            return false;
        }

        proto = getProto( obj );
        if ( !proto ) {
            return true;
        }
        Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
        return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
}
var o = Object.create(null) 

上面定義的這個(gè)對象用$.isPlainObject判斷是結(jié)果是true,按照redux的isPlainObject方法判斷結(jié)果是false,哪種才是正確的實(shí)現(xiàn)

2017年7月11日 16:32