疑问一
let arr = new Array(5).fill(new Array(5).fill(null)) /* **本意是想创建一个5*5的二维数组,创建成功进行赋值时有个问题 **arr[0][0]='X'会把arr[0-4][0]这5个全部赋值成X **不知道什么原因,难道fill方法不能传入数组作为参数?环境React、node.js **下面这种循环插入就可以正常赋值 */ let arr = []; for (let i = 0; i < 5; i++) { let jarr = [] for (let j = 0; j < 5; j++) { jarr[jarr.length] = null; } arr[arr.length] = jarr; }
经过自己试验思考,以下是个人对于疑问一的见解:
首先JavaScript中数组变量是以引用的形式存在的
let arr = new Array(5).fill(new Array(5).fill(null)) /*fill方法中的new Array(5).fill(null)会实例化出一个数组,假设该数组对应内存是A指向[null,null,null,null,null] 上面这种生成5*5数组的方式应该是会实例化一个[A,A,A,A,A]而不是 [[null,null,null,null,null], [null,null,null,null,null], [null,null,null,null,null], [null,null,null,null,null],
[null,null,null,null,null] ] 也就是说这5个元素都是指向一个数组,所以给数组A赋值如arr[0][0]=1时另外4个数组的值也会改变,因为这5个元素都指向同一个数组,也就出现了疑问一
*/
疑问二
//其实跟疑问一有点类似,也是数组引用的问题 var arr1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] var arr2 = arr1.slice(); arr1[0][0] = 0; console.log(arr2[0][0]) /*结果输出是0而不是1,为什么? 我们把arr1看成[A,B,C] slice这个方法应该是直接复制数组的元素,这边复制了这arr1中三个数组的引用(应该是内存地址值),所以当对于arr1[0][0]进行赋值时arr2[0][0]的值也受到影响 */
容易混淆的slice、splice、split
array.slice(start,end)
该方法是对数组进行部分截取,并返回一个数组副本。(原数组不变)
参数start是截取的开始数组索引(必选,如果省略表示start=0,即返回原数组副本),end参数等于你要取的最后一个字符的位置值加上1(可选)
如果两个参数中的任何一个是负数,array.length会和它们相加,试图让它们成为非负数,array.slice(-1)等效于array.slice(array.length-1)
//如果不传入参数二,那么将从参数一的索引位置开始截取,一直到数组尾 var a=[1,2,3,4,5,6]; var b=a.slice(0,3); //[1,2,3] var c=a.slice(3); //[4,5,6] //如果两个参数中的任何一个是负数,array.length会和它们相加,试图让它们成为非负数,举例说明: //当只传入一个参数,且是负数时,length会与参数相加,然后再截取 var a=[1,2,3,4,5,6]; var b=a.slice(-1); //[6] //当只传入一个参数,是负数时,并且参数的绝对值大于数组length时,会截取整个数组 var a=[1,2,3,4,5,6]; var b=a.slice(-6); //[1,2,3,4,5,6] var c=a.slice(-8); //[1,2,3,4,5,6] //当传入两个参数一正一负时,length也会先于负数相加后,再截取 var a=[1,2,3,4,5,6]; var b=a.slice(2,-3); //[3] //当传入一个参数,大于length时,将返回一个空数组 var a=[1,2,3,4,5,6]; var b=a.slice(6); //[]
String也有slice()方法,用法与数组相同
array.splice(start,deleteCount,item...)
splice方法从array中移除一个或多个元素,并用新的item替换它们。(原数组改变)
参数start是从数组array中移除元素的开始位置。参数deleteCount是要移除的元素的个数。
如果有额外的参数,那么item会插入到被移除元素的位置上,并返回一个包含被移除元素的数组。
var a=['a','b','c']; var b=a.splice(1,1,'e','f');//a=['a','e','f','c'],b=['b']
string.split(separator,limit)
split方法把这个string分割成片段来创建一个字符串数组。
可选参数limit可以限制被分割的片段数量。separator参数可以是一个字符串或一个正则表达式。如果separator是一个空字符,会返回一个单字符的数组。
var a="0123456"; var b=a.split("",3); //b=["0","1","2"]