前几天在写代码时遇到一个小问题,具体场景如下:
组件A会对vuex中的某个数组进行修改,然后组件B中的按钮点击响应函数会将这个数组赋值给组件C中的某个数组(其实这个问题跟vuex一点关系没有,但是一开始用到了vuex还以为是vuex的原因)。
问题是组件A中刚对vuex中的数组进行了修改,组件C中的数组就变了,并没有点击组件B中的按钮。
从红宝书第四版的第四章可以知道:js中的变量存储的数据类型分为原始值和引用值,原始值分为Undefined,Null,Boolean,Number,String,Symbol六种,引用值是由多个值构成的对象。通过变量把一个原始值赋值到另一个变量时,原始值会被复制到新变量的位置,而通过变量把一个引用值赋值到另一个变量时,由于原来用来存储引用值的变量中存储的实际是指针,相当于复制了指针,有点像C++中的浅拷贝。这样如果后面对一个变量进行了修改,另一个也会跟着变。
远一点,js中函数的传参也是类似。js中函数外的值会被复制到函数内部的参数中,就是值会被复制到arguments对象中的一个槽位。要看传进去的参数里原来保存的是原始值还是引用值了,不过复制的道理跟上面是一样的。
那么,明白了以上的道理之后,问题也很好解决。通过this.$store.state.xxx.toString()方法,先把这个引用值(数组)转化为String类型的原始值,赋值之后,再用split方法转回数组。