js中储存对象都是存引用地址,所以浅拷贝会导致两个变量指向同一块内存地址。数组的赋值其实相当于给了索引,改变其中一个变量其他的引用其他都会改变。如下为浅拷贝
// var a = [1,2,3]
// var b = a //此步不是赋值,而是将a的引用赋给b,所以改变b也会改变a
// b[0]=4
// a为[4,2,3]
// b为[4,2,3]
总的来说 :原始参数(比如一个具体的数字)被作为值传递给函数,如果被调用函数改变了这个参数的值,这样的改变不会影响到全局或调用函数。但当你传递一个对象(js里数组也是对象)到一个函数,如果在函数里面改变了这个参数的内容,那么这个改变在外部是可见的,也就是会影响到全局。
深拷贝数组的方法:
(1)slice函数,newArr = arr.slice(0)
(2)concat函数,newArr = [].concat(arr,arr2,...)
(3)assign函数(对象),newObj = object.assign({},obj)
但以上三种方式都是对对象第一层的深拷贝,第二层之后还是浅拷贝,要实现多维数组的深拷贝可以用:
newArr = JSON.parse(JSON.stringify(arr))
数值变量:
[1,2,3]
逻辑值变量:
[true,true,false]
字符变量:
["a","b","c"]
总结:
那句话的意思是:数值变量或逻辑变量数组别放字符串。
就是一句废话,不用琢磨。
首先 你上面定义的是 xcategorise 而底下使用的是 xcategories 看最后两位其次 你的数组定义错误 var a = [] 这样才是定义数组