对于某些值,调用hasOwnProperty
会引发错误。
让我们检查以下代码:
null.hasOwnProperty('bar') // Error
undefined.hasOwnProperty('bar') // Error
(0).hasOwnProperty('bar') // Returns false
除了使用调用时抛出错误的
null
和undefined
之外,还有其他变量吗?
设置对象属性的问题相同:
null.bar // Error
undefined.bar // Error
(0).bar === undefined // Returns true
=========
在my Node.js环境中引发错误的另一种情况:
在浏览器中
'use strict';
(0).bar = 0; // Nothing happens
在Node.jsv.10.3.0中:
(0).bar = 0; // Nothing
'use' strict';
(0).bar === undefined; // Returns true
true.bar === undefined; // Returns true
''.bar = '';// STILL NOTHING HAPPENS
(0).bar = 0; //TypeError: Cannot create property 'bar' on number '0'
(true).bar = true; // TypeError: Cannot create property 'bar' on boolean 'true'
========
最后,我发现了一个检查值是否是JavaScript中的对象的方法:
if (obj instanceof Object) obj.hasOwnProperty(...) // Or set a property on it
这个解决方案完全满足了我的需要。
我认为您可以在任何变量上调用它,这些变量不是未定义的
,也不是null
。
js prettyprint-override">console.log([1].hasOwnProperty(0)); // true
console.log([1,2].hasOwnProperty(1)); // true
console.log([1,2].hasOwnProperty(2)); // false
console.log({ a: 's'}.hasOwnProperty('a')); // true
console.log({ b: 's'}.hasOwnProperty('a')); // false
console.log({}.hasOwnProperty('a')); // false
console.log((555).hasOwnProperty('a')); // false
console.log((false).hasOwnProperty('a')); // false
console.log((true).hasOwnProperty('a')); // false
console.log(("skjhkdasj").hasOwnProperty('a')); // false
console.log((1.045).hasOwnProperty('a')); // false
// console.log((null).hasOwnProperty('a')); // error
// console.log((undefined).hasOwnProperty('a')); // error
使用hasOwnProperty作为属性名称:
var foo = {
hasOwnProperty: function() {
return false;
},
bar: 'Here be dragons'
};
foo.hasOwnProperty('bar'); // always returns false
// Use another Object's hasOwnProperty
// and call it with 'this' set to foo
({}).hasOwnProperty.call(foo, 'bar'); // true
// It's also possible to use the hasOwnProperty property
// from the Object prototype for this purpose
Object.prototype.hasOwnProperty.call(foo, 'bar'); // true
还要注意最新的草案:
当使用参数V调用hasOwnProperty方法时,将执行以下步骤:
注意事项
选择步骤1和步骤2的顺序是为了确保在本规范以前版本中步骤1引发的任何异常都将继续引发,即使该值未定义或为null。
太长,读不下去了
Object.prototype.hasOwnProperty
可以直接在
>
Object.prototype
,
在继承链中有Object.prototype
并且在继承链或对象上没有重新定义hasOwnProperty
的对象的子集,以及
BigInt、布尔值、数字、字符串和符号基元值。然而,根据原始值调用它通常是多余的
(primitiveValue).hasOwnProperty(propertyName)
总是返回false
-基元值没有自己的属性。
数据类型
JavaScript目前在ECMAScript 2020规范中支持八种不同的数据类型:
BigInt(在ECMAScript 2020中引入),布尔,空,未定义,数字,字符串,符号(ECMAScript 2015中新增)
和对象。
前七个是基元值而不是对象值——包括数据类型为Null的null
。(是的,typeof null
返回对象而不是null,但这是早期JavaScript引擎设计的工件,无法修复,因为它会破坏网络。)
数字、布尔值和字符串
当与属性值查找语法一起使用时,类型Number、Boolean和String的值将分别自动转换为全局构造函数Number
、Boolean
和String
的“包装器”对象实例。
因此
(1).hasOwnProperty("MAX_SAFE_INTEGER")
返回false,因为该属性是从Number.prototype
继承的。类似地,hasOwnProperty
对布尔值的调用返回false,因为布尔包装器对象本身没有任何固有的属性。但是
("hello folks").hasOwnProperty("length");
返回true
,因为“length”是字符串包装器对象自己的属性。
未定义和空
数据类型为Undefined(Undefined
)或Null(Null
)的基元值在尝试将其作为方法调用时,不会转换为包装对象并生成语法错误:
(undefined).hasOwnProperty("example") // TypeError
(null).hasOwnProperty("example") // TypeError
符号与大
符号和BigInt数据类型值有单独的处理——它们都是在ECMAScript中的新数据类型没有对象包装器的决定之后引入的。
这实际上意味着JavaScript引擎在内部实现了将Symbol.prototype
和BigInt.prototype
方法分别应用于Symbol
和BigInt
数据类型的语法,但只允许对原型方法和属性进行读取访问-任何试图在符号
或bigint
数据类型上设置属性的尝试都会产生错误。
>
无论是Symbol
还是BigInt
全局函数都不允许在调用它们之前使用new
。
Symbol
执行工厂函数并返回新的符号值。
BigInt
是一个类型转换函数,用于将字符串和数字转换为BigInt
数据类型。
与较早的boolean
、number
和string
数据类型的对象包装不同,尝试在符号
或bigint
数据类型上设置属性永远不会成功。
对象
对象(数据类型Object)通常继承hasOwnProperty
从Object.prototype
。如果在继承链的后面某个地方重新定义了hasOwnProperty
,或者在到达Object.prototype
之前在其继承链中使用null
创建了对象,则此继承可能失败...
创建继承链开始处为null
的对象的最简单方法是调用
Object.create( null);
扩展这样的对象还将创建不继承自object.prototype
的对象,因此不能使用hasOwnProperty
。
请注意,将对象的instanceof
应用于其原型链不包括Object的对象。prototype
返回false
。不要使用instanceof
来确定对象数据类型。
在早期版本的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"))
我试图从JSON检查并推送对象细节中的对象。 这就是我的JSON的样子 现在,我尝试读取属性集值[1]ie;“pagenum”。在这里,我试图用name检查更多属性值。如果不存在,则将其推入该属性集中。 由于属性集[0]位于数组中,所以我在将其推入属性集[0]时没有任何问题。这里我得到了属性集中的单个对象[1]。 尝试对属性集[1]执行此操作,但引发错误- 我可以成功地实现上面的代码,如果有一个数
问题内容: 我有其他人编写的此Python工具来刷新某个微控制器,但他为Python 2.6编写了该工具,而我使用的是Python 3.3。 因此,我移植了其中的大部分内容,但此行出现了问题: 该函数在Python 3中不存在,必须替换为。但是然后,作为参数获取的函数将导致异常: 但是到目前为止,我在文档中看到的是,必须将可迭代类型与一个大可迭代类型连接在一起,我是否缺少某些东西? 我要怎么做才能
问题内容: 在我目前正在从事的一个项目中,我遇到了一个角度异常: 在寻找解决方案的搜索中,我直接在浏览器中输入了Web服务的URL,但令人惊讶的是,我没有收到预期的数组。 Web服务类: 当我输入网址时,我希望看到带有JSON对象的JSON数组: 但是,相反,我收到的JSON对象的属性与我期望的JSON对象相同,没有任何数组: 所以我想知道为什么没有数组,当我添加另一个Clazz对象时会发生什么。
因为和不是JavaScript中的对象,我猜它可能是一个全局帮助函数? 示例用法可以是这样的:
问题内容: 我在python 3.3.4中遇到“解码”方法的问题。这是我的代码: 但是我无法解码此问题的代码: 你有什么想法?谢谢 问题答案: 一种 编码 字符串,另一种 解码 字节。 您应该从文件中读取字节并对其进行解码: 幸运的是,有一个编码参数使操作变得简单:
我用的是Spring。我有一个用户表。 当一个人登录系统时,他会向我发送他的凭证(即用户名和密码)。 我用增量生成的uid(即userid是主键)将我的用户存储在数据库中。 我还在数据库中存储了用户名、密码等信息。我需要做的是,当用户连接到Rest连接时,我需要检查数据库是否有这个用户。如果他存在,那么我需要检查密码是否匹配。我需要通过用户名而不是uid进行检查 我的程序中根本没有会话或任何东西(