guard-for-in is unable to detect if statement guarding for...in loop
See original GitHub issueTell us about your environment
- ESLint Version: 5.16.0
- Node Version: 10.16.0
- npm Version: 6.9.0 What parser (default, Babel-ESLint, etc.) are you using?
Please show your full configuration:
Configuration
module.exports = {
env: {
browser: true,
es6: true,
},
extends: [
'airbnb-base',
],
globals: {
Atomics: 'readonly',
SharedArrayBuffer: 'readonly',
},
parserOptions: {
ecmaVersion: 2018,
sourceType: 'module',
},
rules: {
'no-continue': 0,
'no-plusplus': 0,
'no-unused-expressions': [
2,
{
'allowShortCircuit': true, // 允许 短路求值
'allowTernary': true // 允许 三目运算符
}
]
},
};
What did you do? Please include the actual source code causing the issue, as well as the command that you used to run ESLint.
class FormValidator extends Schema {
constructor(formEl, rule, cb) {
const r = { ...defaultRule, ...rule };
super(r);
cb && (this.cb = cb);
const form = document.querySelector(formEl);
formItems = form.querySelectorAll('[data-prop]');
// 绑定事件
for (const field in r) {
if (!Object.prototype.hasOwnProperty.call(r, field)) continue;
let rules = r[field];
rules = rules instanceof Array ? rules : [rules];
const triggerRules = rules.filter(item => {
return item.trigger !== void 0;
});
if (triggerRules.length === 0) continue;
for (let i = 0, len = triggerRules.length; i < len; i++) {
const tr = triggerRules[i];
const curEl = [...formItems].find(item => {
return item.dataset.prop === field;
});
curEl.addEventListener(tr.trigger, ev => {
const { value } = ev.target;
const model = {
[field]: value,
};
let s = new Schema({
[field]: tr,
});
s.validate(model, (err, fields) => {
this.finalCallback(err, fields);
});
s = null;
});
}
}
}
}
eslint
What did you expect to happen?
No error
What actually happened? Please include the actual, raw output from ESLint. for…in loops iterate over the entire prototype chain, which is virtually never what you want. Use Object.{keys,values,entries}, and iterate over the resulting array
Are you willing to submit a pull request to fix this bug?
Issue Analytics
- State:
- Created 4 years ago
- Comments:6 (4 by maintainers)
Top Results From Across the Web
guard-for-in doesn't recognize that Object.entries() is returning ...
Looping over objects with a for in loop will include properties that are inherited through the prototype chain. This behavior can lead to ......
Read more >Function throwing eslint.org guard-for-in error - Stack Overflow
hasOwnProperty(key) this check if the property/key exists in the object ... now says: for..in loops iterate over the entire prototype chain, ...
Read more >guard-for-in - ESLint - Pluggable JavaScript Linter
A pluggable and configurable linter tool for identifying and reporting on patterns in JavaScript. Maintain your code quality with ease.
Read more >"for...in" loops should filter properties before acting on them - Jira
The for...in statement allows you to loop through the names of all of the properties of an object. The list of properties includes...
Read more >The body of a for in should be wrapped in an if statement to ...
In ESLint the rule that generates this warning is named guard-for-in . You can disable it by setting it to 0 , or...
Read more >
Top Related Medium Post
No results found
Top Related StackOverflow Question
No results found
Troubleshoot Live Code
Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free
Top Related Reddit Thread
No results found
Top Related Hackernoon Post
No results found
Top Related Tweet
No results found
Top Related Dev.to Post
No results found
Top Related Hashnode Post
No results found
thx, It works @kaicataldo
Here it is. If you believe there is a bug in the rule, feel free to make an issue on that repo. That being said, it looks like the intention here is to not allow that syntax at all, so I believe it’s working correctly.