gpt4 book ai didi

javascript - 为什么只要重新分配对象,ESlint 就乐于让我修改对象属性?无参数重新分配

转载 作者:行者123 更新时间:2023-11-29 10:58:27 24 4
gpt4 key购买 nike

在 ESLint 中,记录的无参数重新分配规则 here , 禁止您分配函数参数的值。

这是为了避免修改函数的 arguments 对象。

正确的编码方式是将参数重新分配给本地var 并返回var。这对于某些类型来说很好,但对于传递给函数的对象来说似乎毫无意义。

例如,我们以这个函数为例;

function foo(param) {
var copy = param; // This makes the linter happy
copy.bar = 2;
console.log('arg 0: ', arguments[0], 'param:', param, 'copy:', copy);
return copy; // A pointless return, the original object has been modified.
}

let test = { bar: 1 };
foo(test);
console.log(test); // Has been modified
test = foo(test); // a pointless reassignment, foo has already changed test.
console.log(test); // Same effect as previous function call.

公平地说,ESLint 确实允许您使用 /*eslint no-param-reassign: ["error", { "props": false }]* 关闭此功能/;但我想知道为什么

此规则的要点是摆脱可变性并保持 arguments 对象的纯净,但对象的简单重新分配不会做到这一点。

真正做到这一点的唯一方法是深度克隆参数并将其分配给函数范围的变量。

我是不是漏掉了什么?

最佳答案

当您将参数分配给变量时它没有发出警告的可能原因是它需要复杂的数据流分析。假设您有这样的代码:

function foo(param, flag) {
var copy = flag ? param : {...param};
copy.bar = 2;
console.log('arg 0: ', arguments[0], 'param:', param, 'copy:', copy);
return copy; // A pointless return, the original object has been modified.
}

现在它无法判断copy 是否包含与param 相同的对象或克隆,它取决于flag 的值。

或者像这样:

function foo(param) {
var copy = param;
var copy2 = copy;
var copy3 = copy2;
copy3.bar = 2;
console.log('arg 0: ', arguments[0], 'param:', param, 'copy:', copy3);
return copy3;
}

这需要跟踪整个引用链以确定 copy3param 相同。

跟踪这一点并非不可能,优化编译器通常会这样做。但这对于 linter 来说可能有点矫枉过正。

关于javascript - 为什么只要重新分配对象,ESlint 就乐于让我修改对象属性?无参数重新分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52105930/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com