JavaScript 运算符 in 详细说明与使用注意事项

6,033次阅读
没有评论

共计 1559 个字符,预计需要花费 4 分钟才能阅读完成。

JavaScript 中的运算 in 符一开始确实令人困惑,因为它的行为方式与大多数人期望的不同。虽然它看起来应该检查数组中是否存在值,但它实际上检查原型链中属性是否存在 – 而不是值本身。

in 是做什么用的?

in 运算符 检查对象上是否存在属性,而不是数组中是否存在值。例如:

const arr = [1, 2, 3];
console.log(1 in arr); // false
console.log('length' in arr); // true

这里 in 在检查值时返回 false,1 但在检查 length 所有数组都具有的属性时返回 true。

in 是如何运作的?

在幕后,in 正在检查给定属性名称的原型链而不是数组的实际值。JavaScript 数组具有有用的方法,例如 push() 在其原型中定义的方法。

当我们 in 在数组上使用时,即使我们没有明确地将它们视为键,它也会为这些原型方法返回 true:

const methods = [];
console.log('push' in methods); // true

总而言之,通过检查对象的原型链 in 告诉我们哪些操作对对象有效,而不一定是它包含哪些值。

比较 in 与 includes()

该 includes() 方法提供了一种更清晰的方法来检查数组中的值:

const fruits = ['apple', 'banana', 'orange'];

console.log(fruits.includes('apple')); // true
console.log(1 in fruits); // false

虽然 includes() 直接检查数组值,但 in 仅检查原型中的可用属性或方法。

in 使用常见的困惑

因为 in 其行为与 等方法不同 includes(),所以它经常会让人绊倒。他们希望 in 像其他检查数组内容的函数一样工作,但它是为不同的目的而设计的 – 验证原型属性,而不是值。

何时使用 in

in 最适合检查对象上是否存在属性或方法而不是其特定值。一些好的用途包括:

它对于直接检查数组值并不理想。为此,请使用 includes()、indexOf() 等。

回顾和结论

总之,in 是 JavaScript 中的运算符验证原型属性而不是对象值。虽然一开始令人困惑,但它具有有用的应用程序,例如属性存在检查。关键是通过检查原型链而不是直接检查对象来理解它的工作原理。有了这些知识,in 尽管其行为不直观,但它是一个有用的操作符。

请注意,in 和 for..in 是开放原型污染的常见陷阱:

const pollute = (obj, target, prop, value) => {if (target in obj) {obj[target][prop] = value
  }
}

pollute({}, '__proto__', 'foo', 'bar')
console.debug({}.foo) // 'bar'

许多 js 漏洞都围绕这个问题得到解决。
请谨慎使用并回退 Object.hasOwnProperty.call 或 Object.hasProperty 文章来源地址 https://www.toymoban.com/diary/js/336.html

到此这篇关于 JavaScript 运算符 in 详细说明与使用注意事项的文章就介绍到这了, 更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持 TOY 模板网!

原文地址:https://www.toymoban.com/diary/js/336.html

如若转载,请注明出处:如若内容造成侵权 / 违法违规 / 事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于1970-01-01发表,共计1559字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)