js 如何动态添加数组
发布时间:2025-05-22 16:01:47 发布人:远客网络
一、js 如何动态添加数组
1、在JavaScript中,数组的创建可以通过多种方式实现。使用new Array()可以创建一个数组,如果不传入参数,则数组为空。如果传入一个参数,则该参数表示数组的长度。值得注意的是,尽管可以指定长度,但这只是一个初始长度,数组的长度可以动态调整。例如:
2、var arrayObj= new Array();//创建一个空数组
3、var arrayObj= new Array(5);//创建一个长度为5的数组,但实际存储元素不受长度限制
4、var arrayObj= new Array("元素0","元素1","元素2");//创建并赋值数组
5、数组元素可以通过下标访问,例如:
6、var testGetArrValue= arrayObj[1];//获取数组第二个元素
7、arrayObj[1]="这是新值";//修改数组第二个元素
8、添加元素是通过push()、unshift()和splice()方法实现。push()用于在数组尾部添加一个或多个元素,返回数组的新长度:
9、arrayObj.push("新元素1","新元素2");//在数组尾部添加元素
10、unshift()则是在数组头部添加一个或多个元素,同样返回数组的新长度:
11、arrayObj.unshift("新元素1","新元素2");//在数组头部添加元素
12、splice()方法则更灵活,可以插入或删除数组中的元素:
13、arrayObj.splice(insertPos, 0,"新元素1","新元素2");//在指定位置插入元素
14、删除元素也有多种方式,如pop()、shift()和splice()。pop()和shift()分别移除数组尾部和头部元素,并返回被移除的元素:
15、arrayObj.pop();//移除并返回数组尾部元素
16、arrayObj.shift();//移除并返回数组头部元素
17、splice()方法可以同时移除和插入元素,返回被移除的元素:
18、arrayObj.splice(deletePos, deleteCount);//移除指定位置及其后的元素
19、数组截取和合并功能通过slice()和concat()实现。slice()方法可以获取数组的一部分,返回一个新的数组:
20、arrayObj.slice(start, end);//从start到end-1的数组部分
21、concat()方法可以合并多个数组或字符串,返回一个新的数组:
22、arrayObj.concat("字符串", ["数组元素1","数组元素2"]);//合并数组和字符串
23、数组的拷贝通常使用slice()或concat()方法:
24、arrayObj.slice(0);//返回一个新数组
25、arrayObj.concat();//返回一个新数组
26、数组排序使用reverse()和sort()方法,reverse()反转数组,sort()则对数组进行排序:
27、arrayObj.sort();//对数组进行排序
28、最后,数组元素可以通过join()方法转换为字符串,separator为分隔符:
29、arrayObj.join(separator);//使用separator连接数组元素
30、toString()、toLocaleString()和valueOf()方法可以看作是join()的变体,主要用于特定场景。
二、JS数组方法
1.字面量的形式: var arr=[1,2,3];
1.构造函数: var arr1=new Array();//不常用
Array构造函数有一个很大的缺陷,就是不同的参数,会导致它的行为不一致。
1.单个数值作为参数,参数表示数组的元素个数
可以看到,Array作为构造函数,行为很不一致。因此,不建议使用它生成新数组,直接使用数组字面量是更好的做法。
push/pop/unshift/shift//增加、删除元素(数组的方法,所以使用时应调用
无参数时,返回原数组,相当于数组的复制。
一个参数时,从参数作为下标的元素截取,至数组结束。
二个参数时,从第一个参数作为下标(索引)的元素开始截取,到第二个参数作为下标的元素结束,但不包括第二个参数作为下标的函数。(起始元素包含,结尾元素不包含)
多个参数时,前两个参数起效,后边的参数无效。
一个参数时,从参数作为下标的元素截取,至数组结束。
二个参数时,从第一个参数作为下标(索引)的元素开始截取,即表示截取的起始位置,第二个参数表示截取的元素个数。
多个参数时,前两个参数起效,后边的参数从原数组的截取起始位置开始填充,填充到原数组。
arr.reverse();//数组翻转(元素位置颠倒)
arr.sort();从小到大排序,但遵循的是字符串的按位比较规则,所以排序结果容易出现异常。
join()以指定参数作为连接符,将所有数组成员连接为一个字符串返回。如果不提供参数,默认用逗号分隔。
concat();//拼接数组不改变原数组
indexOf(item)返回元素在数组中对应的索引值,找不到的话,返回-1,用以测试元素是否存在于数组中
forEach(function(item,index))遍历数组,没有返回值
map(function(item,index))遍历数组,存在返回值
filter(function(item)){return item>2}返回大于2的元素
some返回布尔值,条件部分成立|| arr.some(function(item){return item>2})
every返回布尔值,条件全部成立&& arr.every(function(item){return item>2})
reduce(对数组中的所有元素调用指定的回调函数。该回调函数的返回值为累积结果,并且此返回值在下一次调用该回调函数时作为参数提供。)arr.reduce(function(a,b){return a+b;});
功能:将数组的每个元素转化为字符串,并且输出用逗号分隔的字符串列表。功能类似join();
功能:搜索整个数组中具有给定值的元素,返回找到的第一个元素的索引或者如果没有找到就返回-1;lastIndexOf为反向搜索。
参数:元素的值,起点索引(可选)
功能:将两类对象转为真正的数组:类似数组的对象和可遍历的对象
参数:待转换的对象,第二个参数可选,作用类似于数组的map方法,用来对每个元素进行处理,将处理后的值放入返回的数组。
功能:在当前数组内部,将指定位置的成员复制到其他位置,返回变化后的数组。
参数:索引(从该位置开始替换数据);索引(从该位置开始读取数据,默认为0,负值表示倒数);索引(到该位置前停止读取,默认为最大索引)
功能:找到第一个符合条件的数组成员。
参数:回调函数,所有数组成员依次执行该函数,直到找到第一个返回值为true的成员。回调函数可以接受三个参数,依次为值,位置,原数组。
输出:find()返回找到的成员;findIndex()返回成员的位置。
功能:使用给定的值,填充一个数组。
参数:第一个参数为待填充的值,第二和第三参数可选,分别表示填充的起始和结束位置(不包括)。
功能:用于遍历数组,可以用for…of循环进行遍历。区别是keys()是对键名的遍历、values是对键值的遍历、entries()是对键值对的遍历。
功能:表示某个数组是否包含给定的值
参数:第一个参数必选(待检查的给定值),第二个参数可选,表示搜索的起始位置,默认为0,负数表示倒数的位置。
注意:和indexOf的区别,indexOf进行了运算符的强比对,会导致对NaN误判。
三、js深拷贝和浅拷贝的区别
1.浅拷贝:复制一份引用,所有引用对象都指向一份数据,并且都可以修改这份数据。
2.深拷贝(复杂):复制变量值,对于非基本类型的变量,则递归至基本类型变量后,再复制。
在使用JavaScript对数组进行操作的时候,我们经常需要将数组进行备份,事实证明如果只是简单的将它赋予其他变量,那么我们只要更改其中的任何一个,然后其他的也会跟着改变,这就导致了问题的发生。
var arr= ["One","Two","Three"]; var arrto= arr; arrto[1]="test"; document.writeln("数组的原始值:"+ arr+"<br/>");//Export:数组的原始值:One,test,Three document.writeln("数组的新值:"+ arrto+"<br/>");//Export:数组的新值:One,test,Three
像上面的这种直接赋值的方式就是浅拷贝,很多时候,这样并不是我们想要得到的结果,其实我们想要的是arr的值不变,不是吗?
var arr= ["One","Two","Three"]; var arrtoo= arr.slice(0); arrtoo[1]="set Map"; document.writeln("数组的原始值:"+ arr+"<br/>");//Export:数组的原始值:One,Two,Three document.writeln("数组的新值:"+ arrtoo+"<br/>");//Export:数组的新值:One,set Map,Three
var arr= ["One","Two","Three"]; var arrtooo= arr.concat(); arrtooo[1]="set Map To"; document.writeln("数组的原始值:"+ arr+"<br/>");//Export:数组的原始值:One,Two,Three document.writeln("数组的新值:"+ arrtooo+"<br/>");//Export:数组的新值:One,set Map To,Three
var a={name:'yy',age:26}; var b=new Object(); b.name=a.name; b.age=a.age; a.name='xx'; console.log(b);//Object{ name="yy", age=26} console.log(a);//Object{ name="xx", age=26}
就是把对象的属性遍历一遍,赋给一个新的对象。
var deepCopy= function(source){ var result={}; for(var key in source){ result[key]= typeof source[key]==='object'? deepCoyp(source[key]): source[key];} return result;}
jQuery.extend= jQuery.fn.extend= function(){//1.将extend方法扩展到JQ(函数)下边:扩展静态方法//2. jQuery.fn.extend把extend扩展到jq.fn下且jQuery.fn= jQuery.prototype扩展实例方法// 1.2.功能相似 var options, name, src, copy, copyIsArray, clone,//定义一些变量 target= arguments[0]||{},//目标元素是【0】第一个元素$.extend( a,{ name:'hello'},{ age: 30}); i= 1,//第一个元素的位置 length= arguments.length,//第一个个对象的元素 deep= false;//是否是深拷贝默认 false不是// Handle a deep copy situation看是不是深拷贝情况 if( typeof target==="boolean"){//是布尔值 deep= target; target= arguments[1]||{};//目标元素是第二个$.extend( true, a, b)// skip the boolean and the target i= 2;}// Handle case when target is a string or something(possible in deep copy)看参数正确不 if( typeof target!=="object"&&!jQuery.isFunction(target)){//当目标不是对象或者不是函数的时候 target={};//变成一个空的jason}// extend jQuery itself if only one argument is passed看是不是插件情况 if( length=== i){//只写了一个对象要把这个对象扩展到jq源码上静态方法或者是实例方法 target= this;//this是$或者$();--i;}//可能有多个对象情况 for(; i< length; i++){// Only deal with non-null/undefined values if((options= arguments[ i ])!= null){//看后边的对象是否都有值// Extend the base object for( name in options){ src= target[ name ]; copy= options[ name ];// Prevent never-ending loop if( target=== copy){//防止循环引用 continue;//跳出本次循环继续执行//$.extend( a,{ name: a}));循环引用 a也是一个对象}// Recurse if we're merging plain objects or arrays深拷贝 if( deep&& copy&&( jQuery.isPlainObject(copy)||(copyIsArray= jQuery.isArray(copy)))){//是深拷贝且需有var b={ name:{ age: 30}};且b必须是对象自变量(jason)或者是个数组//递归 if( copyIsArray){//数组 copyIsArray= false; clone= src&& jQuery.isArray(src)? src: [];//定义一个空数组} else{//jason clone= src&& jQuery.isPlainObject(src)? src:{};//看原有的属性有没有且是不是jason定义一个空jason}// var a={ name:{ job:'it'}};看有没有原有的属性有的话在原有的上边添加// var b={ name:{age: 30}};//$.extend( true, a, b);//a继承b// console.log( a); a{ name:{ job:'it',age: 30}}如果只有一个{}则只有,age: 30// Never move original objects, clone(a) them target[ name ]= jQuery.extend( deep, clone, copy);//调用函数本身进行进一步的递归处理// Don't bring in undefined values浅拷贝} else if( copy!== undefined){ target[ name ]= copy;//直接复制因为里边没有对象}}}}// Return the modified object return target;};