【问题标题】:'object' is never reassigned. Use 'const' instead'object' 永远不会被重新分配。改用'const'
【发布时间】:2020-05-27 01:57:43
【问题描述】:

我有这段代码:

    sliderData () {
        let sliderData = this.product.slider; 

        sliderData.title = 'test';

        // {{ $t('related_product_slider_header', { category: 'hello', designer: 'hey' }) }}
        return sliderData;
    }

然后 es-lint(prefer-const) 警告我并告诉我:

'sliderData' is never reassigned. Use 'const' instead.eslint(prefer-const)

但那是谎言,不是吗?我确实将对象重新分配到下一行。

我真的不明白。

【问题讨论】:

  • 您实际上并没有重新分配对象。在这种情况下,sliderData 的引用是恒定的,您只是在更改一个属性值。如果你切换到 const 你的程序将运行正常
  • 你的 binding (阅读:变量)是不变的。您无需将其更改为指向不同的对象。您只需更改对象的形状。

标签: javascript ecmascript-6 eslint


【解决方案1】:

您不会重新分配sliderData。你改变了一个属性。就 JS 而言,“分配”一个对象只是指将其用作赋值运算符的左手项,如下所示:

sliderData = someObject;

所以:

const sliderData = this.product.slider; 

sliderData.title = 'test'; //This is fine

sliderData = new Object(); //error

注意:这是因为“sliderData”的值是一个引用,其中包含对象的地址,而不是对象本身:这也是两个对象之间的等价失败的原因,除非一个对象被分配对方的价值。

【讨论】:

    【解决方案2】:

    您并没有重新分配 sliderData 存储的地址,您只是在改变该对象。

    您可以而且应该使用const 而不是let,因为您没有重新分配sliderData 变量。例如,如果您要写sliderData = 3,这是重新分配,sliderData.something = 3 不是重新分配。

    【讨论】:

      【解决方案3】:

      只要您不重新分配sliderData,它就会被视为一个常量。尽管您将对象声明为 const,但您可以在其中添加属性和编辑值。请看下面:

      const car = {type:"Fiat", model:"500", color:"white"};
      
      // You can change a property:
      car.color = "red";
      
      // You can add a property:
      car.owner = "Johnson";
      

      【讨论】:

        猜你喜欢
        • 2018-07-20
        • 2014-12-29
        • 1970-01-01
        • 1970-01-01
        • 2020-02-23
        • 2012-10-27
        • 2013-10-12
        • 2012-03-27
        • 2013-08-29
        相关资源
        最近更新 更多