我认为自己是JS的资深人士,但是就在这之前我第一次意识到for … in循环与in运算符有很大不同:
"length" in []; // true
for (k in []) { if(k == "length") alert(); }; // k will never be "length"
所以这引出我的问题:为什么in …循环中始终存在in运算符?
恕我直言,这完全是一种误导,因为它做了不同的事情.同样,首先使用for操作使JS引擎具有所有可枚举的属性,然后在该子集上使用in运算符的想法是错误的:仅仅是因为in运算符接受所有可能的属性,无论是原型还是拥有的,无论是存取器还是数据,属性.那么,如果for已经减少到可枚举的对象属性,它将如何过滤掉所有内容?
解决方法:
So this brings me to my question: why is the
in
operator at all present in thefor ... in
loop?
不是. for…in循环构造中的in令牌不是运算符,同样它在表达式中也不是一个
x = {in: 5}.in
它只是将for ( … in … )
与for (…; …; …)
循环区分开的标记之一.鉴于没有for(…)语句,因此relational expression中in令牌的作用永远不会与此冲突.