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最适合检查对象上是否存在属性或方法而不是其特定值。一些好的用途包括:
访问前检查对象键
调用前验证方法是否存在
使用 for/in 循环迭代所有属性
它对于直接检查数组值并不理想。为此,请使用includes()、indexOf()等。
回顾和结论
总之,in 是JavaScript 中的运算符验证原型属性而不是对象值。虽然一开始令人困惑,但它具有有用的应用程序,例如属性存在检查。关键是通过检查原型链而不是直接检查对象来理解它的工作原理。有了这些知识,in尽管其行为不直观,但它是一个有用的操作符。文章来源:https://www.toymoban.com/diary/js/336.html
请注意,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模板网!