在JavaScript遇到的坑(一)
2015-08-26 15:56
681 查看
这几年,一直在前端开发,JavaScript虽然是很好的语言,但是在其中有些坑,你遇到了,就被坑了。
最后猜猜看,输出了是什么呢?
最后输出的是:[1,3]。
为什么呢?因为javascript分原始类型与引用类型(与java、c#类似)。Array是引用类型。b得到的是引用,所以对b的修改会影响到a。现在要分清楚了:
原始类型:number,string等,即是:var a = 1,b="2"等
引用类型:obejct等,即是:array,json等
解决方案:
1. 使用slice()
可使用slice()进行复制,因为slice()返回也是数组。
2. 使用concat()
注意concat()返回的并不是调用函数的Array,而是一个新的Array,所以可以利用这一点进行复制。
注意:这些只是指当数组中仅仅包含了原始类型,并没有包括其他引用类型的情况方可如此处理,如果包含其他情况,请看下面的处理方案。
增加Array属性clone方法,添加判断,Object等对象的clone方法,代码如下:
一、数组赋值(复制)引起的坑
var a = [1,2]; var b = a; b[1] = 3; console.log(a);
最后猜猜看,输出了是什么呢?
最后输出的是:[1,3]。
为什么呢?因为javascript分原始类型与引用类型(与java、c#类似)。Array是引用类型。b得到的是引用,所以对b的修改会影响到a。现在要分清楚了:
原始类型:number,string等,即是:var a = 1,b="2"等
引用类型:obejct等,即是:array,json等
解决方案:
1. 使用slice()
可使用slice()进行复制,因为slice()返回也是数组。
var array1 = new Array("1","2","3"); var array2; array2 = array1.slice(0); array1.length = 0; alert(array2); //返回1、2、3
2. 使用concat()
注意concat()返回的并不是调用函数的Array,而是一个新的Array,所以可以利用这一点进行复制。
var array1 = new Array("1","2","3"); var array2; array2 = array1.concat(); array1.length = 0; alert(array2); //返回1、2、3
注意:这些只是指当数组中仅仅包含了原始类型,并没有包括其他引用类型的情况方可如此处理,如果包含其他情况,请看下面的处理方案。
二、数组深度克隆
参考链接:http://stackoverflow.com/questions/728360/most-elegant-way-to-clone-a-javascript-object增加Array属性clone方法,添加判断,Object等对象的clone方法,代码如下:
Array.prototype.clone=function(){ var a=[]; for(var i=0,l=this.length;i<l;i++) { if(this[i] instanceof Array){ a.push(this[i].clone()); }else if(this[i] instanceof Object){ a.push(clone(this[i])); }else{ a.push(this[i]); } } return a; } function clone(obj) { // Handle the 3 simple types, and null or undefined if (null == obj || "object" != typeof obj) return obj; // Handle Date if (obj instanceof Date) { var copy = new Date(); copy.setTime(obj.getTime()); return copy; } if (obj instanceof Array) { return obj.clone(); } // Handle Object if (obj instanceof Object) { var copy = {}; for (var attr in obj) { if (obj.hasOwnProperty(attr)) copy[attr] = clone(obj[attr]); } return copy; } throw new Error("Unable to copy obj! Its type isn't supported."); }
相关文章推荐
- JavaScript闭包浅谈
- 补充 jsp 页面的日期显示的格式问题
- javascript深入理解js闭包
- Json对象与Json字符串互转(4种转换方式)
- DataTable转换为JsonResult - DaneJiang
- js跨域
- 使用纯js写的一个分页
- JSTL自定义函数标签
- 201508261524_《JavaScript之浮点数算数运算》
- (2)如何在Javascript中自定义类 & 面向对象编程 (封装)
- js根据类名获取元素——自定义getElementsByClass()
- JS文档生成工具:JSDoc 介绍
- JSON介绍
- 《Servlet与JSP核心编程第二版》阅读记录002-第一个servlet示例程序
- javaScript hook
- Json解析方式
- 浅谈JavaScript中的变量、参数、作用域和作用域链
- Java抓取网页数据(原网页+Javascript返回数据)
- ajax异步提交json字符串参数
- json_decode时含有中文是解码问题(json_decode返回为null)