为了账号安全,请及时绑定邮箱和手机立即绑定

react 引导中关于"Immutability"的疑问

react 引导中关于"Immutability"的疑问

炎炎设计 2018-11-15 16:15:17
https://facebook.github.io/re...handleClick(i) {    const squares = this.state.squares.slice();     squares[i] = 'X';    this.setState({squares: squares});   }Determining if a mutated object has changed is complex because changes are made directly to the object. This then requires comparing the current object to a previous copy, traversing the entire object tree, and comparing each variable and value. This process can become increasingly complex.Determining how an immutable object has changed is considerably easier. If the object being referenced is different from before, then the object has changed. That's it.以上摘自React的引导, 有个关于slice()的疑问: 为什么要复制一份数据呢? 使用slice()复制出来的数据对比差异还是要全部遍历
查看完整描述

1 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

文档里说了,如果你不做immutable的话,你就没办法知道有没有改变,因为你改的是对象,举个简单的例子说明:

function blackbox(arr) {

   /**

    * 在这里可以对arr直接做任何处理,也可以不做任何处理

    * 比如:arr[Math.floor(Math.random() * arr.length)] = 2;

    */

   return arr;

}


var array = [5,21,54,43,542,213,43,6,2];

var result = blackbox(arr);


// 我想知道新的result是否发生了改变,该怎么办?

console.log(array === result); // true...直接对比,没办法比较

console.log(array.join() === result.join()); // true ...对比内容,没办法知道

而如果

function blackbox(arr) {

  if(我要改变) {

    let result = arr.slice();

    /**

    * 在这里可以对result直接做任何处理

    */

    return result;

  } else return arr;  

}

这个样子:

var array = [5,21,54,43,542,213,43,6,2];

var result = blackbox(arr);


// 我想知道新的result是否发生了改变,该怎么办?

console.log(array === result); // 如果发生改变,那么就是false。不改变,是true

console.log(array.join() === result.join()); // 如果发生改变,那么就是false。不改变,是true


查看完整回答
反对 回复 2018-12-31
  • 1 回答
  • 0 关注
  • 482 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号