当前位置: 首页 > 知识库问答 >
问题:

哪个对象在JavaScript中没有hasOwnProperty?

白云
2023-03-14

对于某些值,调用hasOwnProperty会引发错误。

让我们检查以下代码:

null.hasOwnProperty('bar') // Error
undefined.hasOwnProperty('bar') // Error
(0).hasOwnProperty('bar') // Returns false

除了使用调用时抛出错误的nullundefined之外,还有其他变量吗?

设置对象属性的问题相同:

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

这个解决方案完全满足了我的需要。


共有3个答案

柴彬
2023-03-14

我认为您可以在任何变量上调用它,这些变量不是未定义的,也不是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
苏乐
2023-03-14

使用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. 让P去吧?ToPropertyKey(五)。

注意事项

选择步骤1和步骤2的顺序是为了确保在本规范以前版本中步骤1引发的任何异常都将继续引发,即使该值未定义或为null。

齐晟
2023-03-14

太长,读不下去了

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的值将分别自动转换为全局构造函数NumberBooleanString的“包装器”对象实例。

    因此

    (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.prototypeBigInt.prototype方法分别应用于SymbolBigInt数据类型的语法,但只允许对原型方法和属性进行读取访问-任何试图在符号bigint数据类型上设置属性的尝试都会产生错误。

    >

  • 无论是Symbol还是BigInt全局函数都不允许在调用它们之前使用new

    Symbol执行工厂函数并返回新的符号值。

    BigInt是一个类型转换函数,用于将字符串和数字转换为BigInt数据类型。

    与较早的booleannumberstring数据类型的对象包装不同,尝试在符号bigint数据类型上设置属性永远不会成功。

    对象

    对象(数据类型Object)通常继承hasOwnPropertyObject.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中不存在,必须替换为。但是然后,作为参数获取的函数将导致异常: 但是到目前为止,我在文档中看到的是,必须将可迭代类型与一个大可迭代类型连接在一起,我是否缺少某些东西? 我要怎么做才能

    • 因为和不是JavaScript中的对象,我猜它可能是一个全局帮助函数? 示例用法可以是这样的:

    • 问题内容: 在我目前正在从事的一个项目中,我遇到了一个角度异常: 在寻找解决方案的搜索中,我直接在浏览器中输入了Web服务的URL,但令人惊讶的是,我没有收到预期的数组。 Web服务类: 当我输入网址时,我希望看到带有JSON对象的JSON数组: 但是,相反,我收到的JSON对象的属性与我期望的JSON对象相同,没有任何数组: 所以我想知道为什么没有数组,当我添加另一个Clazz对象时会发生什么。

    • 问题内容: 我在python 3.3.4中遇到“解码”方法的问题。这是我的代码: 但是我无法解码此问题的代码: 你有什么想法?谢谢 问题答案: 一种 编码 字符串,另一种 解码 字节。 您应该从文件中读取字节并对其进行解码: 幸运的是,有一个编码参数使操作变得简单:

    • 我用的是Spring。我有一个用户表。 当一个人登录系统时,他会向我发送他的凭证(即用户名和密码)。 我用增量生成的uid(即userid是主键)将我的用户存储在数据库中。 我还在数据库中存储了用户名、密码等信息。我需要做的是,当用户连接到Rest连接时,我需要检查数据库是否有这个用户。如果他存在,那么我需要检查密码是否匹配。我需要通过用户名而不是uid进行检查 我的程序中根本没有会话或任何东西(