【问题标题】:React const changing value?反应 const 改变值?
【发布时间】:2018-07-20 04:40:27
【问题描述】:

这怎么可能,我正在创建一个常量来从我的聊天中获取旧消息,所以我可以知道是否有来自数据库的新消息或类似的东西,但是我的代码有些奇怪, const 正在改变值

const oldMessages = this.state.messages.slice();

// Console
console.log(oldMessages[oldMessages.length - 1]);
// Prints {name: "André", message: "asds", who: "Y", sending: true, local_key: 232, …}

newMessages.map((message, key) => {
    // Here I don't even call the const
    if (message.local_key != undefined) {
        const i = messages.map((i) => {
            return i.local_key
        }).indexOf(message.local_key);
        if (i >= 0) {
            // messages.splice(i, 1);
            messages[i].id = message.id;
            messages[i].sending = false;
            messages[i].local_key = null;
            newMessages.splice(key, 1);
            //
            // Limpar chave do banco
            //
        } else {
            newMessages[key].local_key = null;
        }
    }
    if (newMessages[key] != undefined) {
        newMessages[key].animate = true;
    }
});

// Console
console.log(oldMessages[oldMessages.length - 1]);
// Prints {name: "André", message: "asds", who: "Y", sending: false, local_key: null, …}

你可以看到,我什至不调用变量,除了在控制台中

与参考有关吗?

PS:messages也是this.state.messages的引用

【问题讨论】:

    标签: javascript reactjs constants


    【解决方案1】:

    关于const 要知道的一点是

    常量是块范围的,很像使用 let 定义的变量 陈述。常量的值不能通过 重新分配,并且不能重新声明。

    在你的情况下,你不是重新分配 const 变量,而是改变它的原始值,这是可能的

    您正在寻找的是 Immutable 数据,它不会更改它的值,但会创建原始数据的新引用并更新它。查看Immutable-JS等库

    【讨论】:

    • 有趣,我不知道,但我没有改变代码中的变量,它被引用改变了?我的意思是,b = 1; const a = b; b = 2 它会改变 a 的值?
    • @SpaceDogCS,不会因为数字和字符串在 javascript 中是不可变的
    【解决方案2】:

    const 并没有按照你的想法去做。

    const 防止重新分配变量:

    const arr = []; 
    
    arr.push(1); // works
    
    console.log(arr); // [1]
    
    arr = []; // whoops
    

    【讨论】:

    • 有趣,我不知道,但我没有改变代码中的变量,它被引用改变了?我的意思是,b = 1; const a = b; b = 2 它会改变 a? 的值?
    • 你必须知道javascript中的对象总是作为引用传递的。所以:const obj = {hello: 1}; const arr = [obj]; const newArray = arr.slice(); newArray[0].hello = 1337; 实际上会改变obj
    • 如何预防?
    • @SpaceDogCS 你必须完全复制对象。
    猜你喜欢
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 2022-06-21
    • 1970-01-01
    • 2020-01-08
    • 2020-04-11
    • 1970-01-01
    相关资源
    最近更新 更多