JavaScript 中的運算 in 符一開始確實令人困惑,因為它的行為方式與大多數(shù)人期望的不同。雖然它看起來應(yīng)該檢查數(shù)組中是否存在值,但它實際上檢查原型鏈中屬性是否存在 - 而不是值本身。
in 是做什么用的?
該 in運算符 檢查對象上是否存在屬性,而不是數(shù)組中是否存在值。例如:
const arr = [1, 2, 3]; console.log(1 in arr); // false console.log('length' in arr); // true
這里in在檢查值時返回 false,1但在檢查length所有數(shù)組都具有的屬性時返回 true。
in 是如何運作的?
在幕后,in正在檢查給定屬性名稱的原型鏈而不是數(shù)組的實際值。JavaScript 數(shù)組具有有用的方法,例如push()在其原型中定義的方法。
當(dāng)我們in在數(shù)組上使用時,即使我們沒有明確地將它們視為鍵,它也會為這些原型方法返回 true:
const methods = []; console.log('push' in methods); // true
總而言之,通過檢查對象的原型鏈in告訴我們哪些操作對對象有效,而不一定是它包含哪些值。
比較in 與 includes()
該includes()方法提供了一種更清晰的方法來檢查數(shù)組中的值:
const fruits = ['apple', 'banana', 'orange']; console.log(fruits.includes('apple')); // true console.log(1 in fruits); // false
雖然includes()直接檢查數(shù)組值,但in僅檢查原型中的可用屬性或方法。
in 使用常見的困惑
因為in其行為與 等方法不同includes(),所以它經(jīng)常會讓人絆倒。他們希望in像其他檢查數(shù)組內(nèi)容的函數(shù)一樣工作,但它是為不同的目的而設(shè)計的 - 驗證原型屬性,而不是值。
何時使用 in
in最適合檢查對象上是否存在屬性或方法而不是其特定值。一些好的用途包括:
訪問前檢查對象鍵
調(diào)用前驗證方法是否存在
使用 for/in 循環(huán)迭代所有屬性
它對于直接檢查數(shù)組值并不理想。為此,請使用includes()、indexOf()等。
回顧和結(jié)論
總之,in 是JavaScript 中的運算符驗證原型屬性而不是對象值。雖然一開始令人困惑,但它具有有用的應(yīng)用程序,例如屬性存在檢查。關(guān)鍵是通過檢查原型鏈而不是直接檢查對象來理解它的工作原理。有了這些知識,in盡管其行為不直觀,但它是一個有用的操作符。文章來源:http://www.zghlxwxcb.cn/article/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 漏洞都圍繞這個問題得到解決。
請謹(jǐn)慎使用并回退Object.hasOwnProperty.call或Object.hasProperty文章來源地址http://www.zghlxwxcb.cn/article/336.html
到此這篇關(guān)于JavaScript 運算符 in 詳細(xì)說明與使用注意事項的文章就介紹到這了,更多相關(guān)內(nèi)容可以在右上角搜索或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!