TLDR;
Object.prototype.hasOwnProperty
可以直接调用
Object.prototype
,
Object.prototype
在其继承链中具有且未hasOwnProperty
在继承链或对象上重新定义的对象子集,以及
BigInt、布尔值、数字、字符串和符号原始值。在原始值上调用它通常是多余的,但是因为
(primitiveValue).hasOwnProperty(propertyName)
总是返回false
- 原始值没有自己的属性。
数据类型
JavaScript 目前在ECMAScript 2020规范中支持八种不同的数据类型:
BigInt(ECMAScript 2020 中引入)、Boolean、Null、Undefined、Number、String、Symbol(ECMAScript 2015 中的新功能)
和 Object。
其中前七个是原始值而不是对象值 - 包括null
数据类型为 Null 的值。(是的,typeof null
返回“object”而不是“null”,但这是早期 JavaScript 引擎设计的产物,无法修复,因为它会破坏 Web。)
数字、布尔值和字符串
Number
Number 、 BooleanBoolean
和String 类型的值String
在与属性值查找语法一起使用时会自动转换为全局构造函数的“包装”对象实例。
因此
(1).hasOwnProperty("MAX_SAFE_INTEGER")
返回 false,因为该属性继承自Number.prototype
. 类似地hasOwnProperty
,对布尔值的调用返回 false,因为布尔包装对象本身没有任何固有的属性。但
("hello folks").hasOwnProperty("length");
返回true
,因为“长度”是字符串包装对象的一个自己的属性。
未定义和空
undefined
数据类型 Undefined ( ) 或 Null ( ) 的原始值null
不会转换为包装对象,并且在尝试将hasOwnProperty
它们作为方法调用时会产生语法错误:
(undefined).hasOwnProperty("example") // TypeError
(null).hasOwnProperty("example") // TypeError
符号和 BigInt
Symbol 和 BigInt 数据类型值有不同的处理方式——它们都是在 ECMAScript 中的新数据类型没有对象包装器的决定之后引入的。
实际上,这意味着 JavaScript 引擎在内部分别实现了应用 Symbol.prototype
和BigInt.prototype
方法symbol
以及数据类型的语法,但只允许对原型方法和属性进行读取访问 - 任何在 a或数据类型bigint
上设置属性的尝试都会产生错误。symbol
bigint
无论是函数Symbol
还是BigInt
全局函数都不允许对new
它们使用之前的调用。
Symbol
充当工厂函数并返回一个新的符号值。
BigInt
是一个类型转换函数,用于将字符串和数字转换为bigint
数据类型。
boolean
与旧的,number
和数据类型的对象包装器string
不同,尝试在or数据类型上设置属性永远不会悄悄地成功。symbol
bigint
目的
对象(数据类型 Object)通常继承hasOwnProperty
自Object.prototype
. hasOwnProperty
如果在继承链的稍后位置重新定义(不是一个好主意),或者如果null
在到达之前在其继承链中创建对象,则此继承可能会失败Object.prototype
。
null
在继承链的开头创建对象的最简单方法是调用
Object.create( null);
扩展这样的对象也将创建不继承的对象,Object.prototype
因此不能使用hasOwnProperty
.
请注意,应用于instanceof Object
原型链不包含Object.prototype
返回的对象false
。不用于instanceof
确定 Object 数据类型。
包装对象和严格模式。
在 JavaScript 的早期版本中,为从原始值自动创建的包装对象设置属性在语法上是正确的,并且不会产生错误。但是,一旦评估了包装器对象表达式,包装器对象就被丢弃了。尝试在后面的代码中查找自定义属性失败,因为缺少自定义属性的新的不同包装对象用于查找。
如果尝试将属性值分配给任何原始值,则严格模式会生成错误。
可能的检查功能
const checkOwnProperty = (obj, propertyName) =>
(obj && (typeof obj == "object" || typeof obj == "function") &&
Object.prototype.hasOwnProperty.call( obj, propertyName))
? true : false;
// Test:
var o = {name: "foo"};
console.log ( "name " + checkOwnProperty( o, "name"))
console.log ( "foo " + checkOwnProperty( o, "foo"))
console.log ( "0 " + checkOwnProperty( 0, "foo"))
CheckOwnProperty
如果第一个参数是 Object 数据类型并且具有与第二个参数同名的属性,则返回一个布尔值。它为所有原始值返回 false。