-
JavaScript笔记 数组总结
2020-09-09 09:02:37数据可以是任意类型,我们习惯一个数组存放同一类型的数据。 数组用它的数组字面量的方法定义。 var arr = [12,”12”,null]; 我们可以通过下标(索引值)来访问数组里面的某一项,下标从0开始的。 也可以通过下标...javascript数组
数组概念
数组(array)是一个有序的数据集合。说白了,数组就是一组数。
var arr = [16,33,23,12,53];
数组的字面量就是方括号,这是定义数组的最简单的方式。至于更多创建数组的方式,我们等到高级JS再学。
里面用逗号隔开了很多值,最后一项没有逗号。
变量a就是一个数组变量,里面存储的不是一个数字,而是一组数。可以使用下标,或称为索引值index来精确访问数组中的某一个项,下标从0开始。console.log(arr[0]); //输出16 console.log(arr[1]); //输出33 console.log(arr[4]); //输出53
数组中并不规定保存相同类型的项,但实际应用中,我们一般还是将相同类型的项保存在其中。
下面的数组中,存储的内容类型都是不一样的是合法的。var arr = [1,"哈哈",true,undefined,"么么哒"];
数组有一个属性,就是length,英语是长度的意思,表示这个数组的项的个数。
先说说什么是“属性”,数组是对象(放心里,后面高级JS课我们就会知道这个事情),对象有属性,属性就是描述这个对象的特点、特性、特征。用点来表示一个对象的属性:arr.length
var arr = [34,563,4576,334,46,433]; alert(arr.length); //6,数组里面一共有6项
数组中有几项,那么就会弹出几。
现在我们发现,数组最后一项的下标,是length-1。
arr[arr.length - 1] //表示数组的最后一项
数组的最大下标是arr.length - 1,尝试输出一个大于这个数字的下标:
arr[100]; //undefined;
尝试比length-1还大的下标,就是undefined。
好玩儿的是,我们可以跳跃着指定数组:
arr[66] = 88;
那么此时其他没有指定的项目就是undefined。数组的 arr.length; //67了,我们设置了下标为66的项,强制“抻长”了数组
写一个小于数组元素数量的值会缩短数组,写0会彻底清空数组。数组我们现在arr.length = 2;
那么它就会有两项a[0]、a[1]其他项就丢失了。数组的遍历
数组里面存放的是一组数,那么我们经常需要对这些数字都进行一些操作。
就需要用for循环语句来遍历它。这是一个经典的for壳子:for(var i = 0 ; i <= arr.length - 1 ; i++){ 就可以对arr[i]来进行操作、判断…… }
数组是一个引用类型
var arr = [1,2,3,4]; console.log(typeof arr); //object
用typeof arr来检测,你会发现数组输出object。数组是对象。
所以保存数组的变量,实际上保存是数组内存地址:var a = [1,2,3,4]; var b = a; b[0] = 88; //修改的是数组b下标为0的项 console.log(a); //数组a的下标为0的项也改为88
都是数组[1,2,3]内容、长度、项的位置完全一样,但是不 == 如下var a = [1,2,3]; var b = [1,2,3]; console.log(a == b);
这是因为引用类型比较的是地址,变量a和变量b指向的位置不一样,不能判相等。
如果a里面存储的是基本类型,那么语句b=a就是把a的值赋值一份给b。如果a里面存储的是引用类型,那么b将指向a现在指向的位置,a的值不会赋值一份,a、b指向同一个地方。
数组的常见方法
数组是对象,现在你要知道对象都有属性和方法。
属性已经介绍了,数组有length属性。属性就是描述对象的特点的,比如“性别”、“姓名”、“身高”
方法就是对象能够执行的事情。比如“吃饭”、“睡觉”、“打dota”
我们现在就要来学数组能执行什么方法。
数组的头尾操作pop()、push()、shift()、unshift()
push()方法,在数组的末尾添加项目,可以添加1个,也可以添加多个。
var arr = ["东","西","南","北"]; arr.push("中","发","白"); //在数组最后添加项 console.log(arr);
push就是推的意思,推入。
pop()方法,删除数组的最后一项,只能删除最后一项,无法删除多项。能够返回被删除的元素。push 尾插 pop 尾删 unshift 头插 shift 头删
数组的合并与拆分 concat()、slice()
concat()方法就是合并两个数组
var arr1 = ["东","西","南","北"]; var arr2 = ["一条","二条"]; arr1.concat(arr2); //这里有一个超级大坑,concat是把arr1和arr2合并为一个新数组返回 console.log(arr1); //不变
所以必须:
arr1 = arr1.concat(arr2);
concat()的参数非常灵活,可以是数组变量、数组字面量、散的值也行:
var arr1 = ["东","西","南","北"]; var arr2 = ["一条","二条"]; arr1 = arr1.concat(arr2,["一筒","八条"],"幺鸡"); console.log(arr1);
slice()方法可从已有的数组中返回选定的元素。arr.slice(start,end)var arr = ["东","西","南","北","中","发","白"]; var arr2 = arr.slice(1,4); //截取下标为1、2、3的为一个新数组返回 console.log(arr2); //["西", "南", "北"]
arr.slice(start,end) 返回一个新的数组,包含从 start 到 end (不包括该元素)的元素。
只有开头:var arr = ["东","西","南","北","中","发","白"]; var arr2 = arr.slice(3); // 从下标为3的项目开始截取后面全部了 console.log(arr2); // ["北", "中", "发", "白"]
slice(a,b)取出了b-a项
多功能splice()插入、删除、替换
我们先确认一个事情,
arr.splice(3,2,"斑马","骆驼");
一旦应用,arr立即改变。并不需要重新复制,换句话说,这个函数不返回新的数组。
var arr = ["A","B","C","D","E","F","G"]; arr.splice(3,2,"X","Y","Z","思密达"); //从数组下标为3开始这项,连数2项,改为…… console.log(arr);
// ***************插入一些项 *************** var arr = ["A","B","C","D","E","F","G"]; arr.splice(2,0,"嘻嘻","哈哈"); //插入到下标为2的项前,不删除项目 console.log(arr);
splice依据参数的多少,和参数是什么,有多功能。现在你要能反应过来。
删除数组的最后8项。arr.pop(); arr.pop(); arr.pop(); arr.pop(); arr.pop(); arr.pop(); arr.pop(); arr.pop();
简化为:
for(var i = 1 ; i <= 8 ; i++){ arr.pop();3 }
也可以:
arr.splice(-8);
逆序reverse();
reverse()方法就是立即让数组倒置:
var arr = ["A","B","C","D","E","F","G"]; arr.reverse(); //不需要赋值 console.log(arr); //["G", "F", "E", "D", "C", "B", "A"]
排序sort()
sort()方法排序
var arr = ["G","A","C","B","I","H","G","I","B"]; arr.sort(); console.log(arr);
//sort函数默认是按照字符顺序排的,隐式将数字转为string //比字符编码顺序 var arr = [23,435,456,23,2,345,2,32,11,324,32,43,65,667,78,43]; arr.sort(); console.log(arr);
sort()里面有一个参数,这个参数是一个函数。arr.sort(function(a,b){ //如果a要放在b前面,那么返回负数 //如果a要放在b后面,那么返回正数 //如果a和b不区分大小,那么返回0 if(a < b){ return -1; }else if(a > b){ return 1; }else if(a == b){ return 0; } });
转为字符串
var arr = [1,2,3,4,5,6,7]; var str = arr.join("★"); console.log(str);
语法var str = arr.join(分隔符);
如果不写分隔符,那么等价于用逗号分开
var arr = [1,2,3,4,5,6,7]; var str = arr.join(); console.log(str);
-
vue中使用data中的数据a给赋值给另外一个变量b,改变a或b的值,另一个对象也变化的解决方法
2020-11-30 17:22:37数组、对象、值都适用参考 在vue中 this.A = this.B,没有进行深层赋值,只是把this.A的地址指向了与this.B相同的地址,所有对于A的修改会影响到B 解决相互影响的思路是在this.A必须是新建的一个对象,这样才能保证...数组、对象、值都适用
参考- 在vue中 this.A = this.B,没有进行深层赋值,只是把this.A的地址指向了与this.B相同的地址,所有对于A的修改会影响到B
- 解决相互影响的思路是在this.A必须是新建的一个对象,这样才能保证不被指向同一地址,属性修改不会相互影响。
this.A=JSON.parse(JSON.stringify(this.B));
- 1
将对象转成字符串剔除对象属性后,再转换成对象赋值,这样能解决指向相同地址修改会相互影响的问题。里面的this.A= JSON.parse(JSON.stringify(this.B)); 如果是直接this.A= this.B的话会把 this.A替换为this.B然后再把this.B赋值给this.A相当于 this.A= this.A所以先转json字符串 再转数组 然后赋值给this.A这样不会相互影响
-
java浅拷贝 和 深拷贝
2019-12-14 12:52:39对于基本数据类型的成员对象,因为基础数据类型是值传递的,所以是直接将属性值赋值给新的对象。基础数据类型的拷贝,其中一个对象修改该值,不会影响另外一个。 对于引用类型,比如数组或者类对象,因为引用类型是...1.浅拷贝
- 对于基本数据类型的成员对象,因为基础数据类型是值传递的,所以是直接将属性值赋值给新的对象。基础数据类型的拷贝,其中一个对象修改该值,不会影响另外一个。
- 对于引用类型,比如数组或者类对象,因为引用类型是引用传递,所以浅拷贝只是把内存地址赋值给了成员变量,它们指向了同一内存空间。改变其中一个,会对另外一个也产生影响。
2.深拷贝
- 对于基本数据类型的成员对象,因为基础数据类型是值传递的,所以是直接将属性值赋值给新的对象。基础类型的拷贝,其中一个对象修改该值,不会影响另外一个(和浅拷贝一样)。
- 对于引用类型,比如数组或者类对象,深拷贝会新建一个对象空间,然后拷贝里面的内容,所以它们指向了不同的内存空间。改变其中一个,不会对另外一个也产生影响。
我们在实际项目中往往会遇到对象拷贝的问题,我们在与数据库交互的类对象往往不会暴露出来,往往会转化为DTO 暴露给我们的前端。
我们一般会采用spring BeanUtils.copyProperties() 进行拷贝。BeanUtils.copyProperties() 遇到的坑
1.copyProperties()利用发射的原理,进行的是浅拷贝。修改目标对象的引用类型,源对象的引用对象的值会发生改变。 2.copyProperties() 不支持泛型,T id 这种数据类型的变量无法进行拷贝。
-
js浅拷贝和深拷贝
2020-09-29 16:55:03(1) 对于基本数据类型的成员对象,因为基础数据类型是值传递的,所以是直接将属性值赋值给新的对象。基础类型的拷贝,其中一个对象修改该值,不会影响另外一个。 (2) 对于引用类型,比如数组或者类对象,因为引用...什么是浅拷贝?
浅拷贝只是拷贝一层, 更深层次对象级别的只拷贝引用(地址)。
浅拷贝的特点
(1) 对于基本数据类型的成员对象,因为基础数据类型是值传递的,所以是直接将属性值赋值给新的对象。基础类型的拷贝,其中一个对象修改该值,不会影响另外一个。
(2) 对于引用类型,比如数组或者类对象,因为引用类型是引用传递,所以浅拷贝只是把内存地址赋值给了成员变量,它们指向了同一内存空间。改变其中一个,会对另外一个也产生影响。
例如:
var obj = { id:1, name:'andy', mes:{ age:18 } }; var o ={}; for(var k in obj){ //k是属性名 obj[k]是属性值 o[k] = obj[k]; } console.log(o); o.mes.age = 20; console.log(obj);
打印结果:
为什么第一个输出的不是18,百度得出结论:因为console.log打印的是当前的值,展开后是最新修改后的值。可以发现,把 obj 的mes属性赋值给 o 的时候赋值的是mes的地址,修改obj或o其中一个的mes,另一个的mes也会发生变化。
示意图:
es6新增的浅拷贝语法糖:Object.assign(o,obj); 等价于上面的for循环内容。什么是深拷贝?
深拷贝拷贝多层,每一级别的数据都会拷贝。
深拷贝的特点
(1) 对于基本数据类型的成员对象,因为基础数据类型是值传递的,所以是直接将属性值赋值给新的对象。基础类型的拷贝,其中一个对象修改该值,不会影响另外一个(和浅拷贝一样)。
(2) 对于引用类型,比如数组或者类对象,深拷贝会新建一个对象空间,然后拷贝里面的内容,所以它们指向了不同的内存空间。改变其中一个,不会对另外一个也产生影响。
(3) 对于有多层对象的,每个对象都需要实现 Cloneable 并重写 clone() 方法,进而实现了对象的串行层层拷贝。
(4) 深拷贝相比于浅拷贝速度较慢并且花销较大。
如:
//深拷贝拷贝多层,每一级别的数据都会拷贝 var obj = { id:1, name:'andy', mes:{ age:18 }, color:['pink','red'], }; var o ={}; //封装函数 function deepCopy(newObj, oldObj){ for(var k in oldObj){ //判断我们的属性值属于哪种数据类型 //1、获取属性值 oldObj[k] var item = oldObj[k]; //2、判断这个值是否是数组 if(item instanceof Array){ newObj[k] = []; deepCopy(newObj[k], item); }else if(item instanceof Object){ //3、判断这个值是否是对象 newObj[k] = {}; deepCopy(newObj[k], item); }else{ //4、属于简单数据类型 newObj[k] = item; } } } deepCopy(o,obj); console.log(o);
示意图如下:
引用类型的值都是 Object 的实例。引用类型有:Object类型,Array类型,Date类型,RegExp类型(正则),function类型。还有基本包装类型,也是一种引用类型。ECMAScript还提供了 3个特殊的引用类型:Boolean、Number和String。
附:
引用类型的值都是 Object 的实例。引用类型有:Object类型,Array类型,Date类型,RegExp类型(正则),function类型。还有基本包装类型,也是一种引用类型。ECMAScript还提供了 3个特殊的引用类型:Boolean、Number和String。 -
(软件构造06)Java深拷贝与浅拷贝
2020-07-11 21:11:01(1)对于基本数据类型的成员对象,因为基础数据类型是值传递的,所以是直接将属性值直接赋给新的对象。基础类型的拷贝,其中一个对象修改该值,不会影响另一个。 (2)对于引用类型,比如数组或者对象,因为引用... -
java课程实验
2012-12-02 16:51:193、在实验2中所实现的Teacher类的基础上,修改Teacher类的代码,要求:由多个Teacher对象所形成的数组可以使用Arrays.sort方法进行排序(编号由低到高排序)。 实验四 1、在main方法中创建一个含有10个元素的int型... -
12道vue高频原理面试题,你能答出几道?
2020-12-26 11:47:58遍历 data 对象来实现对数据的监控的,如果属性值也是对象那么需要深度遍历,显然如果能劫持一个完整的对象是才是更好的选择。 <p>Proxy 可以劫持整个对象,并返回一个新的对象。Proxy 不仅可以代理对象,还可以代理... -
Visual C++程序员实用大全(精华版).(水利水电.邓劲生.张晓明译).part3
2016-06-21 20:50:39162 使用对象数组 163 理解指向数组的指针 164 访问数组元素 165 理解数组运算 166 递增和递减数组变量 167 声明多维数组 第十五章 宏、常量和预处理命令:定义及使用常量 168 理解常量 169 使用预处理命令#define ... -
Visual C++程序员实用大全(精华版).(水利水电.邓劲生.张晓明译).part4
2016-06-21 21:13:27162 使用对象数组 163 理解指向数组的指针 164 访问数组元素 165 理解数组运算 166 递增和递减数组变量 167 声明多维数组 第十五章 宏、常量和预处理命令:定义及使用常量 168 理解常量 169 使用预处理命令#define ... -
Visual C++程序员实用大全(精华版).(水利水电.邓劲生.张晓明译).part1
2016-06-21 21:05:54162 使用对象数组 163 理解指向数组的指针 164 访问数组元素 165 理解数组运算 166 递增和递减数组变量 167 声明多维数组 第十五章 宏、常量和预处理命令:定义及使用常量 168 理解常量 169 使用预处理命令#define ... -
Visual C++程序员实用大全(精华版).(水利水电.邓劲生.张晓明译).part2
2016-06-21 21:09:54162 使用对象数组 163 理解指向数组的指针 164 访问数组元素 165 理解数组运算 166 递增和递减数组变量 167 声明多维数组 第十五章 宏、常量和预处理命令:定义及使用常量 168 理解常量 169 使用预处理命令#define ... -
超级有影响力霸气的Java面试题大全文档
2012-07-18 09:47:04多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 5、String是最基本的数据类型... -
JAVA面试题最全集
2010-03-13 13:09:10被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载 finally?再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,... -
xheditor-1.1.14
2012-08-07 09:25:30参数:可定义多个JSON对象数组,示例如下:{qq:{name:'QQ',count:55,width:25,height:25,line:11},msn:{name:'MSN',count:40,width:22,height:22,line:8}} name:表情分组名 count:表情数量 list:表情列表,例... -
java 面试题 总结
2009-09-16 08:45:34多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 2、String是最基本的数据类型吗? ... -
AIC的Java课程7-12章
2007-07-29 20:55:11第4章 面向对象(封装) 4课时 理解类封装属性(数据成员)和行为(方法成员),区别类和对象。 能够定义类,创建类的对象(实例化类)和通过对象引用访问数据成员和方法成员;形成定义类和使用类的两种不同... -
零基础学ASP.NET 2.0&源代码绝对完整版1
2020-11-19 22:01:574-02.aspx 读出Application的属性值。 4-03.aspx 读出SessionID的值。 4-04.aspx 创建Session对象。 4-05.aspx 读取传递的Session值并显示。 4-06.aspx 使用Response对象的Write()方法。 4-07.aspx 使用... -
net学习笔记及其他代码应用
2010-11-16 18:15:0944.两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? 答:不对,有相同的hash code。 45.swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上? 答:switch(expr1... -
C#高级编程(第9版).(清华出版.李铭译.黄静审校).part2
2016-07-15 20:45:236.1 同一类型和不同类型的多个对象 6.2 简单数组 6.2.1 数组的声明 6.2.2 数组的初始化 6.2.3 访问数组元素 6.2.4 使用引用类型 6.3 多维数组 6.4 锯齿数组 6.5 Array类 6.5.1 创建数组 6.5.2 复制数组 6.5.3 排序... -
C#高级编程(第9版).(清华出版.李铭译.黄静审校).part1
2016-07-15 20:42:376.1 同一类型和不同类型的多个对象 6.2 简单数组 6.2.1 数组的声明 6.2.2 数组的初始化 6.2.3 访问数组元素 6.2.4 使用引用类型 6.3 多维数组 6.4 锯齿数组 6.5 Array类 6.5.1 创建数组 6.5.2 复制数组 6.5.3 排序... -
C#高级编程(第9版).(清华出版.李铭译.黄静审校).part3
2016-07-15 20:48:046.1 同一类型和不同类型的多个对象 6.2 简单数组 6.2.1 数组的声明 6.2.2 数组的初始化 6.2.3 访问数组元素 6.2.4 使用引用类型 6.3 多维数组 6.4 锯齿数组 6.5 Array类 6.5.1 创建数组 6.5.2 复制数组 6.5.3 排序... -
C#开发实战1200例(第一卷+第二卷)+源码下载地址.txt
2019-05-17 09:24:24主要内容有C#开发环境的使用、C#语言基础应用、字符串处理技术、数组和集合的使用、面向对象编程技术、数据结构与算法、Windows窗体基础、特色窗体界面、窗体控制技术、MDI窗体和继承窗体、Windows常用控件的使用、... -
C#开发实例大全(基础卷).软件开发技术联盟(带详细书签) PDF 下载
2018-02-20 01:26:55实例215 修改继承窗体中的控件属性 287 第3篇 控件应用篇 第11章 Windows常用控件的使用 290 11.1 按钮控件的使用 291 实例216 轻松打造绚丽按钮 291 实例217 给Button控件创建快捷键 292 实例218 使Button控件大小... -
C#开发实战1200例(第1卷).(清华出版.王小科.王军.扫描版).part1
2016-06-16 20:55:43实例127 通过泛型查找不同数组中的值 实例128 通过继承泛型类实现输出学生信息 实例129 通过泛型实现子窗体的不同操作 实例130 使用泛型去掉数组中的重复数字 第6章 数据结构与算法 6.1 数据结构的实现 实例... -
C#开发实战1200例(第1卷).(清华出版.王小科.王军.扫描版).part2
2016-06-16 20:59:52实例127 通过泛型查找不同数组中的值 实例128 通过继承泛型类实现输出学生信息 实例129 通过泛型实现子窗体的不同操作 实例130 使用泛型去掉数组中的重复数字 第6章 数据结构与算法 6.1 数据结构的实现 实例... -
C#开发实战1200例(第1卷).(清华出版.王小科.王军.扫描版).part3
2016-06-16 21:02:21实例127 通过泛型查找不同数组中的值 实例128 通过继承泛型类实现输出学生信息 实例129 通过泛型实现子窗体的不同操作 实例130 使用泛型去掉数组中的重复数字 第6章 数据结构与算法 6.1 数据结构的实现 实例... -
ASP.NET开发实战1200例(第1卷).part2
2016-06-11 20:12:37实例083 另一种形式的封装:类属性(非静态属性) 130 实例084 另一种形式的封装:类属性(静态属性) 131 实例085 利用类的封装特性制作一个简单的计算器 132 3.3 子承父业——继承特性 133 实例086 龙生龙,凤生凤(单... -
ASP.NET开发实战1200例(第1卷).part1
2016-06-11 20:07:19实例083 另一种形式的封装:类属性(非静态属性) 130 实例084 另一种形式的封装:类属性(静态属性) 131 实例085 利用类的封装特性制作一个简单的计算器 132 3.3 子承父业——继承特性 133 实例086 龙生龙,凤生凤(单...
-
NIO和IO的区别
-
EDA课程设计 自动售货机
-
小白四轮驱动.PcbLib
-
log(n)怎么理解
-
scrcpy1.17版
-
计算机网络实验 配置路由器的路由选择协议.rar
-
Ubuntu18.04中ros软件的操作实现
-
MySQL 存储过程(创建海量数据实验环境)
-
华为1+X认证——网络系统建设与运维(初级)
-
access应用的3个开发实例
-
Unity RUST 逆向安全开发
-
基于Qt的LibVLC开发教程
-
A7计算n个学生的平均成绩
-
匿名内部类
-
platform设备驱动
-
Unlocker.zip
-
第一个C程序
-
PowerBI重要外部工具详解
-
《文件过滤及内容编辑处理命令》
-
2021年软考系统规划与管理师-上午历年真题解析视频课程