javascript中把一个数组的内容全部赋值给另外一个数组

如:
var a = [1,2,3,4];
var b= [];
b = a;
这个不是把值赋值过去而是b作为a的引用,b改变的是a
如何b指向的是一个新数组,a把元素值全部赋值过去?

1、普通数组可以使用   var b = [].concat(a);

-----------------------------------------------------------------------------------------------------

2、我遇到一个jquery对象类型的数组是[Object(Array)]类型,其拼接的数组字符串为:

[{
                name: ‘Berlin-new‘,
                type: ‘column‘,
                id: ‘berlin‘, 
                data: [-0.9, 0.6, 3.5, 8.4, 13.5, 17.0, 18.6, 17.9, 14.3, 9.0, 3.9, 1.0]
            },{
                name: ‘Tokyo-new‘,
                type: ‘spline‘, 
                data: [7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6]
            }]

想将array赋给array2,然后将array2中的data截取一部分,返回array2

var array2= [].concat(array);
                $.each(array2, function (i, obj) {
                    var data = obj.data;
                    obj.data = data.slice(data.length - num, data.length);
                });

这样截取成功,但仍然影响array本身的data;

采用 var arr = $.makeArray( obj );后仍不起作用;

最后用循环创建新数组解决

var result = [];

$.each(array, function (i, obj) {

var c = {};

$.each(obj, function (key, val) {

if (key == ‘data‘) {

c[key] = val.slice(val.length - num, val.length);

} else {

c[key]=val;

}

}) ;

result.push(c);

});

一、push与concat

push的定义是:像数组末尾添加一个或更多元素,并返回新的长度。该方法会改变数组的长度。

concat的定义是:连接两个或更多的数组,并返回结果,该方法不会改变现有数组,而仅仅会返回数组的一个副本。

  1. var a = [1,2];
  2. a.push([3,4]);
  3. a.concat(5);
  4. //a为1 2 3,4 5
var a = [1,2];
a.push([3,4]);
a.concat(5);
//a为1 2 3,4 5

二、深拷贝与浅拷贝

1.浅拷贝

JavaScript存储对象都是存地址的,所以浅复制会导致 a 和 b 指向同一块内存地址

数组的赋值其实相当于给了索引,改变其中一个变量其他引用都会改变

  1. var a = [1,2,3];
  2. var b = a;
  3. b[0] = 4;
  4. //a为4 2 3
  5. //b为4 2 3
var a = [1,2,3];
var b = a;
b[0] = 4;
//a为4 2 3
//b为4 2 3

根据上面存储对象的问题,这里就可以解决另一个问题:

原始参数(比如一个具体的数字)被作为值传递给函数;值被传递给函数,如果被调用函数改变了这个参数的值,这样的改变不会影响到全局或调用函数。

你传递一个对象(在js里数组不是简单数据类型,而是对象)到一个函数,如果在函数里面改变了这个参数的内容,在外部这个变化是可见的。

2.深拷贝

(1)slice 函数

(2)concat 函数

(3)assgin

三个函数的原理都是返回数组的一个副本(相当于另外开辟内存空间),所以并不会改变数组本身的的值

但是这里有一点不同,就是assgin与其他两点的不同

虽然说assgin也是深拷贝,但是他只是第一层深拷贝,第二层之后还是进行浅拷贝,例子如下:

  1. var a = {
  2. a1:{
  3. aa1:‘11‘,
  4. aa2:‘22‘
  5. }
  6. }
  7. var b = object.assgin({},a);
  8. var c = object.assgin({},a);
  9. b.a1.aa1 = 33;
  10. /*
  11. b:{
  12. a1:{
  13. aa1:‘33‘,
  14. aa2:‘22‘
  15. }
  16. }
  17. c:{
  18. a1:{
  19. aa1:‘33‘,
  20. aa2:‘22‘
  21. }
  22. }
  23. */
var a = {
	a1:{
		aa1:‘11‘,
		aa2:‘22‘
	}
}
var b = object.assgin({},a);
var c = object.assgin({},a);
b.a1.aa1 = 33;
/*
b:{
	a1:{
		aa1:‘33‘,
		aa2:‘22‘
	}
}
c:{
	a1:{
		aa1:‘33‘,
		aa2:‘22‘
	}
}
*/
时间: 2024-08-28 21:23:00

javascript中把一个数组的内容全部赋值给另外一个数组的相关文章

javascript 获取光标所选中的内容并插入到另一个文本框中(兼容ie和ff)

项目中正好用到 做下笔记方便以后查找 ie获取光标的位置使用document.selection.createRange() 火狐下使用document.getElementById(id).selectionStart 和 document.getElementById(id).selectionEnd 假设我们要获得id为txt的Textarea元素里面光标所选择的内容 首先创建一个获得光标所选内容的函数(参数:火狐下需要Dom元素 select_field=document.getElem

javascript中的数组扩展(一)

 javascript中的数组扩展(一) 随着学习的深入,发现需要学习的关于数组的内容也越来越多,后面将会慢慢归纳,有的是对前面的强化,有些则是关于前面的补充. 一.数组的本质    数组是按照次序排列的一组值,本质上,数组是一种特殊的对象            console.log(typeof[1,2,3]);//object    数组是对象但是对象不是数组            var arr = ['a','b','c','d','e'];            console.lo

如何理解并学习javascript中的面向对象(OOP) [转]

如果你想让你的javascript代码变得更加优美,性能更加卓越.或者,你想像jQuery的作者一样,写出属于自己优秀的类库(哪怕是基于 jquery的插件).那么,你请务必要学习javascript面向对象,否则你无法更灵活的使用javascript这门语言. 什么事闭包?到底什么是原型?(知道闭包和原型的,就算得上是javascript的高手了.但真正能够理解,并且灵活运用的人并不多)到底该如何学习javascript中的面向对象呢?在javascript这么语言正如日中天,相信不少人正在为

理解JavaScript中函数的使用

函数是进行模块化程序设计的基础,编写复杂的Ajax应用程序,必须对函数有更深入的了解. JavaScript中的函数不同于其他的语言,每个函数都是作为一个对象被维护和运行的.通过函数对象的性质,可以很方便的将一个函数赋值给一个变量或者将函数作为参数传递.在继续讲述之前,先看一下函数的使用语法: function func1(…){…} var func2=function(…){…}; var func3=function func4(…){…}; var func5=new Function(

Javascript中的函数(三)

一:概述 函数是进行模块化程序设计的基础,编写复杂的Ajax应用程序,必须对函数有更深入的了解.JavaScript中的函数不同于其他的语言,每个函数都是作为一个对象被维护和运行的.通过函数对象的性质,可以很方便的将一个函数赋值给一个变量或者将函数作为参数传递.在继续讲述之前,先看一下函数的使用语法:function func1(…){…}var func2=function(…){…};var func3=function func4(…){…};var func5=new Function(

javascript中的闭包解析

学习javaScript已经有一段时间了,在这段时间里,已经感受到了JavaScript的种种魅力,这是一门神奇的语言,同时也是一门正在逐步完善的语言,相信在大家的逐步修改中,这门语言会逐步的完善下去,在上一篇随笔中,和大家分享了JavaScript中独有的类中的继承方式,今天呢,就跟大家分享一下我这几天一直在搞,却还是搞的不是很透彻的闭包问题,对于一个初学者而言,JavaScript中的闭包无疑是一个难点,而且也是我们必须要掌握的一个重点,那么今天我就跟大家分享一下我在学习闭包的时候的感悟以及

理解javascript中的回调函数(callback)【转】

在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实际上是一种对象,它可以"存储在变量中,通过参数传递给(别一个)函数(function),在函数内部创建,从函数中返回结果值". 因为function是内置对象,我们可以将它作为参数传递给另一个函数,延迟到函数中执行,甚至执行后将它返回.这是在JavaScript中使用回调函数的精髓.本篇文

JavaScript中function的多义性

JavaScript 中的 function 有多重意义.它可能是一个构造器(constructor),承担起对象模板的作用: 可能是对象的方法(method),负责向对象发送消息.还可能是函数,没错是函数,和对象没有任何关系独立存在的可以被调用的函数. 由于语言设计者的妥协,在 JavaScript 加入了一些 class 相关的特性,以使 JavaScript 看起来确实象 Java,可以 “面向对象”.虽然 JavaScript 添加了 new 和 this, 但却没有 class (ES

模拟javascript中的sort排序

一.javascript中sort对数据进行排序的原理 sort() 方法对数组的元素做原地的排序,并返回这个数组. sort 可能不是稳定的.默认按照字符串的Unicode码位点排序; 语法:arr.sort([compareFunction]) 参数 compareFunction 可选.用来指定按某种顺序进行排列的函数.如果省略,元素按照转换为的字符串的诸个字符的Unicode位点进行排序. 如果 compareFunction(a, b) 小于 0 ,那么 a 会被排列到 b 之前:如果