首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我只能得到最后一个'hasOwnProperty‘调用的结果?

在JavaScript中,对象的原型链是由原型对象组成的,每个对象都有一个指向其原型对象的内部链接。当我们使用对象的属性时,JavaScript引擎会首先在对象本身中查找该属性,如果找不到,它会沿着原型链向上查找,直到找到该属性或者到达原型链的顶端。

在给定的问答内容中,提到了"hasOwnProperty"方法。这是JavaScript中的一个内置方法,用于检查一个对象是否具有指定的属性。该方法只会检查对象本身是否具有该属性,而不会沿着原型链向上查找。

当我们使用"hasOwnProperty"方法时,如果对象本身具有该属性,则返回true;如果对象本身不具有该属性,或者该属性存在于原型链上的其他对象中,则返回false。

现在来解答为什么只能得到最后一个"hasOwnProperty"调用的结果。假设我们有一个对象obj,它的原型链上有多个对象,分别是obj1、obj2、obj3。当我们连续调用多个"hasOwnProperty"方法时,例如:

代码语言:txt
复制
console.log(obj.hasOwnProperty('property1').hasOwnProperty('property2').hasOwnProperty('property3'));

在这个例子中,第一个"hasOwnProperty"方法会检查obj对象本身是否具有"property1"属性。如果具有,则返回true,否则返回false。接下来,第二个"hasOwnProperty"方法会检查上一个方法的返回值(true或false)是否具有"property2"属性。同样,第三个"hasOwnProperty"方法会检查上一个方法的返回值是否具有"property3"属性。

由于每个"hasOwnProperty"方法只会检查其前一个方法的返回值,而不会继续向上查找原型链,所以最后一个"hasOwnProperty"调用的结果是基于obj对象本身的属性检查结果。

需要注意的是,如果我们在原型链上的任何一个对象中具有同名的属性,那么只有最后一个对象中的属性会被访问到。这是因为在原型链中,后面的对象会覆盖前面的对象。

总结起来,只能得到最后一个"hasOwnProperty"调用的结果是因为每个方法只会检查其前一个方法的返回值,而不会继续向上查找原型链。同时,如果原型链上的对象具有同名的属性,只有最后一个对象中的属性会被访问到。

关于云计算、IT互联网领域的名词词汇以及相关产品和介绍链接,由于要求不能提及特定的云计算品牌商,我无法给出具体的推荐。但你可以通过搜索引擎或者腾讯云官方网站来了解相关的概念、分类、优势、应用场景以及腾讯云的相关产品和介绍。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

令人头秃js隐式转换面试题,你能做对吗

- * / 这些运算符只会针对number类型,故转换结果只能是转换成number类型。既然要隐式转换,那到底怎么转换呢,应该有一套转换规则,才能追踪最终转换成什么了。...他只是一个转换标志,转化后结果并不一定是这个参数所值类型,但是转换结果一定是一个原始值(或者报错)。...1、如果输入值已经是一个原始值,则直接返回它2、否则,如果输入值是一个对象,则调用该对象valueOf()方法, 如果valueOf()方法返回值是一个原始值,则返回这个原始值。...故得到最终结果,"[object Object]" + "[object Object]" = "[object Object][object Object]"再来一个指定类型例子:2 * {} =...而后,ToPrimitive(a, Number)首先调用valueOf方法,返回1,得到原始类型1。最后 1 == 1, 返回true。我们再看一段很复杂比较,如下:[] == !{}//1、!

48920

ES1311个超赞新属性

使用in来判断某个对象是否拥有某个私有属性 这个新属性名字其实叫做Ergonomic Brand Checks for Private Fields,原谅才疏学浅,实在不知道怎么翻译,所以大概将它作用表达了出来...(obj, 'color') 当hasOwnProperty需要被多次调用时候,我们可以通过将这部分逻辑抽象成一个方法来减少重复代码: function objHasOwnProp(obj, propertyKey...,例如找到数组里面最后一个偶数,这个时候还用find()和findIndex()的话得到结果是错误: const nums = [7, 14, 3, 8, 10, 9]; // 返回了14, 结果应该是...另一个问题是findIndex()得到索引后我们还要做一些额外计算才能得到元素原数组位置,具体做法是: const nums = [7, 14, 3, 8, 10, 9]; // 在调用reverse...nums].reverse(); // 这次返回对了,是10 const lastEven = reversed.find((value) => value % 2 === 0); // findIndex得到结果还是不对

39120
  • JS 原生方法原理探究(七):如何实现 Object.assign()?

    Object.assign() 基本用法 要实现 Object.assign(),首先了解它大概用法: 接受一个参数表示目标对象(浅拷贝结果),如果是 null 或者 undefined,直接报错...下面这两种情况容易理解: Object.assign({a:1},"cd") // 把 "cd" 可枚举属性 0 和 1 添加到目标对象上,最后得到 {a:1,0:“c”,1:"d"} Object.assign...("cd",{a:1}) // 把 {a:1} 可枚举属性 a 添加到目标对象上,最后得到 String{“cd”,a:1} 但如果是这种情况: Object.assign("ab","cd")...比如,Objetc.myAssign([1,2,3],[8,9]) 结果将不是期望得到 [8,9,3],而是 [8,9],因为目标对象长度被覆盖了。...但是为什么不直接使用 obj.hasOwnProperty(key) 呢? 这是因为,我们对源对象情况并不了解。

    4K20

    ECMAScript13 中11个令人惊叹 JavaScript 新特性

    #lastName); 3.await顶层操作 在 JavaScript 中,await运算符用于暂停执行,直到 一个Promise被解决(执行或拒绝)。 以前只能在async中使用此运算符。...(null) 创建对象),那么试图调用该方法将会产生错误。...console.log(obj.hasOwnProperty('color')); 为了克服这些问题,我们可以利用属性调用方法Object.prototype.hasOwnProperty.call(...尽管find()和findIndex()都是从数组一个元素开始搜索,但在某些情况下,从最后一个元素开始搜索可能会更有效。 有些情况下,我们知道从数组末尾进行查找可能会获得更好性能表现。...举个例子,假设我们要查找数字列表中最后一个偶数,使用find()或findIndex()方法可能会导致错误结果: const nums = [7, 14, 3, 8, 10, 9]; // 给出 14

    25220

    Javascript之其实觉得原型链没有难那么夸张!

    还有Global不能直接访问,Arguments仅在函数调用时由JS引擎创建,Math和JSON是以对象形式存在。   这么多构造器可以创建对象,怎么知道它是由谁创建怎么知道是谁呢?...擦嘞,好像有点意思诶?其实得到这里,大家就都懂了。...上一个不能返回symbol,这回这个只能返回symbol。...注意:应当直接在 Object 构造器对象上调用此方法,而不是在任意一个 Object 类型实例上调用。默认情况下,使用 Object.defineProperty() 添加属性值是不可修改。...toString() 方法,当该对象被表示为一个文本值时,或者一个对象以预期字符串方式引用时自动调用

    65020

    Javascript之其实觉得原型链没有难那么夸张!

    哦...原来是这样,也就是说,实际上Object有两种结果...一个object,一个function。那我怎么区分呢?怎么知道到底是object还是function。怎么知道它是对象还是函数?...typeof结果里不是还有个function么?是的。其实函数也是对象。 注意:这里有一个问题,就是值类型到底算不算是对象!首先,觉得值类型也算是对象。...还有Global不能直接访问,Arguments仅在函数调用时由JS引擎创建,Math和JSON是以对象形式存在。   这么多构造器可以创建对象,怎么知道它是由谁创建怎么知道是谁呢?...上一个不能返回symbol,这回这个只能返回symbol。... toString() 方法,当该对象被表示为一个文本值时,或者一个对象以预期字符串方式引用时自动调用

    74030

    理解原型与原型链

    __proto__),控制台打印结果是function(){},为什么Person原型是function呢?这是因为Person是一个构造函数,它本质就是一个函数。...__proto__ => function(){} 由此可见,原型链记录了原型对象创建整个过程,因此,给原型链添加一个概念:原型链是原型对象创建过程历史记录。...为什么?因为C原型是B,B原型是A。...所以最后结果是 4 3 1 2。这就解释了原型链继承时查找属性过程是先查找自身属性,当自身属性不存在时,会在原型链中逐级查找。...(c["a"]) //属性 a 不是自身属性,不会执行这一步 } hasOwnProperty 函数只能检查对象是否拥有某个属性,那如何遍历对象自身属性?

    56120

    面试常考手写代码学习技巧总结

    起名字与具体功能考虑 起名字 手写函数时候,每次给参数或者函数起名字都要犹豫那么几秒。面试官还以为不会写嘞!...对象深拷贝 肯定需要返回一个一个拷贝后对象,在初期会声明一个空对象,最后返回这个处理过对象。...也就是说,for...of 循环内部调用是数据结构 Symbol.iterator 方法。..., null 判定有误差,得到结果 如果使用 typeof null得到结果是object 操作符对对象类型及其子类型,例如函数(可调用对象)、数组(有序索引对象)等进行判定,则除了函数都会得到...(判断一个值是否是NaN,只能使用isNaN( ) 来判断) (3)如果两个都是字符串,每个位置字符都一样,那么相等,否则不相等。

    1K20

    jQuery中isPlainObject()方法 实现原理

    () 方法会返回一个布尔值,指示对象自身属性中是否具有指定属性 //相当于 Object.prototype.hasOwnProperty var hasOwn = class2type.hasOwnProperty...; //因为 hasOwn 是一个函数,所以这里调用是内置对象 Function toString() 方法 //相当于 Function.prototype.toString var fnToString...proto) { return true; } //最后判断是不是通过 "{}" 或 "new Object" 方式创建对象 //如果 proto 有 constructor属性...") && proto.constructor; //如果 Ctor 类型是 "function" ,并且调用Function.prototype.toString 方法后得到字符串 与 "function...只能区分基本类型,比如数组,typeof 返回还是 “object” 字符串 var arr = []; var obj = {}; typeof arr; //"object" typeof

    1.3K50

    为了面试能通过,要看完这75道面试题(下)

    调用函数,可以使用哪些方法? 67. 什么是缓存及它有什么作用? 68. 手动实现缓存方法 69. 为什么typeof null返回 object? 如何检查一个值是否为 null?...NaN表示“非数字”是 JS 中一个值,该值是将数字转换或执行为非数字值运算结果,因此结果为NaN。...然后我们比较最后结果是。 最后得到一个二进制数001,对应十进制数,即1。 function isEven(num) { } 59. 如何检查对象中是否存在某个属性?...缓存是建立一个函数过程,这个函数能够记住之前计算结果或值。使用缓存函数是为了避免在最后一次使用相同参数计算中已经执行函数计算。...为什么typeof null 返回 object? 如何检查一个值是否为 null? typeof null == 'object'总是返回true,因为这是自 JS 诞生以来null实现。

    2.4K10

    解析赋值、浅拷贝和深拷贝

    实际操作是对象内存地址,最后使两个变量具有相同引用,都指向同一个对象,因此这两个变量相互之间有影响 3.2 浅拷贝 定义: 浅拷贝即 swallow copy,它会创建一个新对象,这个对象有着原始对象属性值一份精确拷贝...Object.assign() Object.assign() 方法用于将所有可枚举属性值从一个或多个源对象复制到目标对象,最后再将目标对象返回。...为了实现正常报错,我们必须在内部使用严格模式。 为什么要用 Object.prototype.hasOwnProperty.call()? 通过 for...in.....得到是源对象自身及其原型链上可枚举属性,但浅拷贝只需要拷贝自身可枚举属性,所以需要用 hasOwnProperty() 筛选,但是直接调用这个方法是不行。...,因此不具有 hasOwnProperty() 方法,在调用时候会报错。

    59420

    详解Object.create(null)

    在Vue和Vuex源码中,作者都使用了Object.create(null)来初始化一个新对象。为什么不用更简洁{}呢?...1523414268433 这次就和使用{}创建对象一模一样了。至此,相信大家已经对两者区别十分清楚了。...Object.create(null)使用场景 再回到文章开头问题,为什么很多源码作者会使用Object.create(null)来初始化一个新对象呢?这是作者习惯,还是一个最佳实践?...(a,'toString')){ ... } //为什么不能直接用a.hasOwnProperty('toString')?...总结: 你需要一个非常干净且高度可定制对象当作数据字典时候; 想节省hasOwnProperty带来一丢丢性能损失并且可以偷懒少些一点代码时候 用Object.create(null)吧!

    87240

    看完这几道 JavaScript 面试题,让你与考官对答如流(下)

    调用函数,可以使用哪些方法? 67. 什么是缓存及它有什么作用? 68. 手动实现缓存方法 69. 为什么typeof null返回 object? 如何检查一个值是否为 null?...NaN表示“非数字”是 JS 中一个值,该值是将数字转换或执行为非数字值运算结果,因此结果为NaN。...然后我们比较最后结果是。 最后得到一个二进制数001,对应十进制数,即1。 function isEven(num) { } 59. 如何检查对象中是否存在某个属性?...缓存是建立一个函数过程,这个函数能够记住之前计算结果或值。使用缓存函数是为了避免在最后一次使用相同参数计算中已经执行函数计算。...为什么typeof null 返回 object? 如何检查一个值是否为 null? typeof null == 'object'总是返回true,因为这是自 JS 诞生以来null实现。

    2K10

    4个Javascript 中 for 循环

    有趣是,每个 Array 对象都有一个 length 属性,这使得它行为更像其他语言中数组。 但是为什么遍历Array对象时候不输出length属性呢?...:返回一个元素满足回调函数新数组 map:在返回之前处理原始数组中元素 reduce:依次处理数组中元素,将上一次处理结果作为下一次处理输入,最终得到最终结果。...在不同浏览器下测试结果是forEach没有for快。如果将测试代码放在控制台中,可能会得到不同结果。主要原因是控制台执行环境与真实代码执行环境不同。...最后一个例子: const arr = [‘a’, ‘b’, ‘c’]; const iter = arr[Symbol.iterator](); iter.next() // { value: ‘a’...以后有时间写一篇关于它文章。

    47540

    前端day19-JS高级(函数调用的上下文模式)学习笔记

    console.log(max);//91 案例04:万能检测数据类型 之前我们都是通过typeof检测数据类型,但是我们会发现当我们去检测null或者数组时无法得到准确结果...为什么数组调用toString和对象调用toString得结果不一样?...()和ObjecttoString() 结果不一样 原因:数组原型也有自己toString() : 调用数组join方法返回一个字符串 Object.prototype...: 原型链最终都会指向Object.prototype,意味着所有的对象可以访问他成员变量 hasOwnProperty():判断对象是否拥有某个成员 isPrototypeOf():判断一个对象是否是另一个对象原型...(1)自己成员 (2)原型成员 疑惑:为什么hasOwnProperty与propertyIsEnumerable看起来好像作用一样 数组length属性属于数组对象成员,但是for-in循环无法枚举

    1.2K10
    领券