我需要檢查一個變量是否是一個純粹的對象實例。例如:一個HTMLElement是instanceof對象。但是我真的需要檢查一下是否是只有一個對象,比如{a: true, b: false}
是。它不能驗證陣列。檢查是否是一個對象
注意:如果更好,我可以使用Chrome的更新功能。
我需要檢查一個變量是否是一個純粹的對象實例。例如:一個HTMLElement是instanceof對象。但是我真的需要檢查一下是否是只有一個對象,比如{a: true, b: false}
是。它不能驗證陣列。檢查是否是一個對象
注意:如果更好,我可以使用Chrome的更新功能。
檢查構造函數。 Seems to work in all browsers
if (a.constructor === Object)
// Good for arrays
([]).constructor === Object => false
// Good for HTMLElements
document.body.constructor === Object => false
感謝所有回覆......但這對我來說是完美和快速的。謝謝! – 2013-02-27 02:56:52
構造函數屬性可以被設置,所以很容易被欺騙:'var a = []; a.constructor = Object; o.constructor ===對象; // true' – RobG 2013-02-27 03:13:04
@RobG當然,有很多事情可以用JS射擊自己。你也可以欺騙你建議的對象.__ proto__',但我想這實際上會使對象成爲一個東西? – 2013-02-27 03:15:01
var proto = Object.getPrototypeOf(obj);
var protoproto = Object.getPrototypeOf(proto);
if (proto === Object.prototype && protoproto === null) {
//plain object
}
如果您要創建一個null
原型對象,你可以擺脫protoproto
的,只是比較proto
到Object.prototype
或null
。
這樣做的危險是,它不能防止通過Object.prototype
本身,可能導致Object.prototype
意外延期。
略短,更安全的是這樣的:
var proto = Object.getPrototypeOf(obj);
if (proto && Object.getPrototypeOf(proto) === null) {
// plain object
}
*旁註:*分鐘瀏覽器版本要求:Firefox 3.5,Chrome 5,IE 9.請參閱:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/getPrototypeOf – Raptor 2013-02-27 02:46:40
你爲什麼要這麼做? – hugomg 2013-02-27 02:41:03
你真的想看看對象是主機還是本地對象嗎? HTMLElement不一定是內置Object對象的實例。元素是宿主對象,因此不需要遵循任何特定的繼承模式(並且一些瀏覽器不實現任何,也不將它們實現爲對象的實例)。 – RobG 2013-02-27 02:44:30
查看http://api.jquery.com/jQuery.isPlainObject/中jquery的源代碼http://code.jquery.com/jquery-1.9.1.js然後關閉這個問題,直到你失明 – 2013-02-27 02:47:08