我通常使用此條件來檢查資料值是否為 Object:
// function A
export const isObject = item => {
return item && item.constructor === Object;
};
因為它更容易理解,但我的朋友通常使用這個函式來檢查與上面相同的條件的資料isObject(value) {}:
// function B
export function isObject(value) {
return typeof value === "object" && !Array.isArray(value) && value !== null;
}
當我們想要合并到最新分支時發生沖突時我們感到困惑,所以這里有一個問題,Between function A & B which one is better to cover most case regarding object data?你能解釋一下嗎,這樣我對它有更好的了解。
uj5u.com熱心網友回復:
假設您要識別從 繼承的普通物件Object.prototype,并且不是其他物件的子類:
第一種方法可能會被愚弄,因為該.constructor屬性不一定指用于創建該函式的建構式——一個物件可以為該屬性分配其他東西。
const isObject = item => {
return item && item.constructor === Object;
};
const a = [];
console.log(a.constructor == Array);
a.constructor = Object;
console.log(a.constructor === Object);
console.log(isObject(a));
第二種方法可能會被愚弄,因為除了陣列之外,還有其他種類的東西Object.prototype不是普通物件也不是陣列——比如 HTMLElements 和許多其他東西。
function isObject(value) {
return typeof value === "object" && !Array.isArray(value) && value !== null;
}
console.log(isObject(document.body));
console.log(isObject(new Proxy({}, {})));
所以我更喜歡Object.getPrototypeOf,你可以確信該值的直接內部原型是Object.prototype,并且它沒有什么特別之處。
const isObject = item => Object.getPrototypeOf(item) === Object.prototype;
console.log(isObject([]));
console.log(isObject({}));
console.log(isObject(document));
當然,如果被覆寫,它可能會失敗Object.getPrototypeOf- 但如果你在那個時候,幾乎沒有什么是值得信賴的。
請注意,許多東西都繼承自Object.prototype其中true,例如Number.prototype- 如果您想排除這些型別,您可以檢查.constructor屬性是否存在。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/447651.html
標籤:javascript 目的
