javascript数组赋值操作的坑
描述:数组对象赋值,即arr1=[{},{},{}]这种数据结构的对象赋值,将arr1赋值给arr2;然后删除arr2里的元素
一、最常用的=
arr2 = arr1;
detect(val) {
let temp = [];
let self=this;
temp = self.tableBaseStorage; //这个tableBaseStorage是data(){return{}}全局变量
console.log("tableBaseStorage");
console.log(self.tableBaseStorage);
let userName = this.search;
let count = 0;
for (let i = 0; i < temp.length; i++) {
if (!(temp[i].userName === userName)) {
console.log(temp[i].userName);
temp.splice(i, 1); //这种删除方式会自动更新长度,慎用
i--;
//delete temp[i];
count++;
console.log("删除");
}
}
console.log(count);
self.tableBase = temp;
//console.log(this.tableBase);
},
你会发现当这个函数被第二次调用的时候,按理说this.tableBaseStorage是不会变的,每一次调用这个函数,都是从tableBaseStorage拿到数据那后对其筛选删除;
但奇怪的是这个tableBaseStorage却是变了,第二次调用好像莫名其妙的被掉包了一样;
现象:第一次调用detect()函数删了temp什么元素,tableBaseStorage同样被删除了同样的元素,故第二次再调用detect()函数此时的tableBaseStorage已经变了;
原因:JavaScript中=赋值是指针赋值,删除中间变量temp[ ]里的元素,会一直删到它爹tableBaseStorage
下面有几种解决措施供参考
二、解决措施,避免数组的指针赋值
1.循环赋值
let temp = [];
let self=this;
for(let j=0;j<self.tableBaseStorage.length;j++){
temp[j] = self.tableBaseStorage[j];
}
2.数组的concat方法
说明
返回一个新数组,这个新数组是由两个或更多数组组合而成的。
array1.concat([item1[, item2[, . . . [, itemN]]]])
参数
array1
必选项。其他所有数组要进行连接的 Array 对象。
item1,. . ., itemN
可选项。要连接到 array1 末尾的其他项目。
示例
//temp=self.tableBaseStorage.concat();
3.JSON.parse & JSON.stringify
先stringify再parse成数组对象
temp = JSON.parse(JSON.stringify(self.tableBaseStorage))
4.es6提供的一种方法
//temp = [...self.tableBaseStorage];
javascript数组赋值操作的坑的更多相关文章
- javascript数组赋值操作
最近在司徒正美的<javascript框架设计>,在里面发现了一个段代码 ...... var _len = arr1.length; while (_len) { arr2[--_len ...
- JavaScript数组常见操作
JavaScript数组常见操作 Tip: 右键在新标签中打开查看清晰大图 下面介绍JavaScript中的数组对象遍历.读写.排序等操作以及与数组相关的字符串处理操作 创建数组 一般使用数组字面量[ ...
- Javascript对象赋值操作
首先,我们还是举个例子来说明对象赋值操作的问题吧: ps: 本文默认约定log = console.log function A(){} A.prototype.x = 10; var a1 = ne ...
- JavaScript数组常用操作
前言 相信大家都用惯了jquery或者underscore等这些类库中常用的数组相关的操作,如$.isArray,_.some,_.find等等方法.这里无非是对原生js的数组操作多了一些包装. 这里 ...
- JavaScript数组常用操作总结
我们在日常开发过程中,使用到原生 JavaScript的时候,有时候会频繁的对数组进行操作,今天我把工作以来,经常用到的有关 JavaScript数组的方法总结一下,方便日后工作的时候查找使用! 一. ...
- Javascript 数组相关操作
数组排序问题: sort() arr.sort() 可以直接进行排序,但是排序的方式是按unicode 顺序而来,比如1,1000,200,这个顺序不是我们想要的结果: 所以有了另一种方法,针对num ...
- JavaScript数组的操作
<html> <head> <meta charset="utf-8"> <title>无标题文档</title> &l ...
- NumPy 学习(2): 数组的操作
1. 简单一维数组的操作 一维数组的操作类似于python自身的list类型. In [14]: arr = np.arange(10) In [15]: arr Out[15]: array([0, ...
- Javascript数组操作
使用JS也算有段时日,然对于数组的使用,总局限于很初级水平,且每每使用总要查下API,或者写个小Demo测试下才算放心,一来二去,浪费不少时间:思虑下,堪能如此继续之?当狠心深学下方是正道. 原文链接 ...
随机推荐
- MySQL基础篇——安装、管理
MySQL 安装 所有平台的 MySQL 下载地址为https://dev.mysql.com/downloads/mysql/ .挑选你需要的 MySQL Community Server 版本及对 ...
- 学习日记9、easyui控件两次请求服务器端问题
<select id="BankCard" class="easyui-combobox" style="width: 600px;" ...
- [CSP-S模拟测试]:走格子(模拟+BFS+Dijkstra)
题目描述 $CYJ$想找到他的小伙伴$FPJ$,$CYJ$和$FPJ$现在位于一个房间里,这个房间的布置可以看成一个$N$行$M$列的矩阵,矩阵内的每一个元素会是下列情况中的一种:$1.$障碍区域—这 ...
- ::before和::after的详细介绍
原文传送门: https://www.cnblogs.com/staro... 一.介绍 css3为了区分伪类和伪元素,伪元素采用双冒号写法. 常见伪类--:hover,:link,:active,: ...
- AtCoder Grand Contest 012 B - Splatter Painting(dp)
Time limit : 2sec / Memory limit : 256MB Score : 700 points Problem Statement Squid loves painting v ...
- Getting Started Tutorial from msdn
Getting Started Tutorial The topics contained in this section are intended to give you quick exposur ...
- Packet Tracer基本使用
Cisco Packet Tracer基本使用 1:添加设备:路由器选择1841,交换机选择2960二层交换机,添加PC.服务器Server(End Devices) 2:添加连接:这里指以太网连接, ...
- I/O等待事件-db file scattered read
摘自:http://blog.csdn.net/zq9017197/article/details/7925338
- 双轴按键摇杆控制器控制TFTLCD(使用ADC1双通道DMA传输)
实验使用如下所示的双轴按键摇杆控制器,来控制TFTLCD上显示的直线.首先介绍一下双轴按键摇杆控制器.原理:十字摇杆为一个双向的10K电阻器,随着摇杆方向不同,抽头的阻值随着变化.本模块使用5V供电( ...
- 史上最全 ——LINQ to SQL语句
LINQ to SQL语句(1)之Where 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子句.Where操 ...