離家不遠

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

疑问一

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"]

 

posted on 2018-09-13 17:01  離家不遠  阅读(132)  评论(0编辑  收藏  举报