共计 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 尽管其行为不直观,但它是一个有用的操作符。 文章来源: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 模板网!
原文地址:https://www.toymoban.com/diary/js/336.html
如若转载,请注明出处:如若内容造成侵权 / 违法违规 / 事实不符,请联系站长进行投诉反馈,一经查实,立即删除!