javascript学习笔记
2016-01-05 15:44
585 查看
数组之间追加
; var array2 = ["Doe" , 555 , 100]; Array.prototype.push.apply(array1, array2); /* array1 值为 [12 , "foo" , {name "Joe"} , -2458 , "Doe" , 555 , 100] */
对象转换为数组
var argArray = Array.prototype.slice.call(arguments);
验证是否是数组
[code]function isArray(obj){return Object.prototype.toString.call(obj) === '[object Array]' ;
}
但如果
toString()方法被重写过得话,就行不通了。也可以使用下面的方法:
Array.isArray(obj); // its a new Array method
不要直接从数组中delete
或remove
元素
如果对数组元素直接使用delete,其实并没有删除,只是将元素置为了
undefined。数组元素删除应使用
splice。
切忌:
var items = [12, 548 ,'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' ,2154 , 119 ]; items.length; // return 11 delete items[3]; // return true items.length; // return 11 /* items 结果为 [12, 548, "a", undefined × 1, 5478, "foo", 8852, undefined × 1, "Doe", 2154, 119] */
而应:
var items = [12, 548 ,'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' ,2154 , 119 ]; items.length; // return 11 items.splice(3,1) ; items.length; // return 10 /* items 结果为 [12, 548, "a", 5478, "foo", 8852, undefined × 1, "Doe", 2154, 119]
删除对象的属性时可以使用
delete。
使用length
属性截断数组
前面的例子中用length属性清空数组,同样还可用它来截断数组:
var myArray = [12 , 222 , 1000 , 124 , 98 , 10 ]; myArray.length = 4; // myArray will be equal to [12 , 222 , 1000 , 124].
与此同时,如果把
length属性变大,数组的长度值变会增加,会使用
undefined来作为新的元素填充。
length是一个可写的属性。
myArray.length = 10; // the new array length is 10 myArray[myArray.length - 1] ; // undefined
使得map()
函数方法对数据循环
var squares = [1,2,3,4].map(function (val) { return val * val; }); // squares will be equal to [1, 4, 9, 16]
用JSON来序列化与反序列化
var person = {name :'Saad', age : 26, department : {ID : 15, name : "R&D"} }; var stringFromPerson = JSON.stringify(person); /* stringFromPerson 结果为 "{"name":"Saad","age":26,"department":{"ID":15,"name":"R&D"}}" */ var personFromString = JSON.parse(stringFromPerson); /* personFromString 的值与 person 对象相同 */
处理WebSocket的超时
通常情况下,WebSocket连接创建后,如果30秒内没有任何活动,服务器端会对连接进行超时处理,防火墙也可以对单位周期没有活动的连接进行超时处理。为了防止这种情况的发生,可以每隔一定时间,往服务器发送一条空的消息。可以通过下面这两个函数来实现这个需求,一个用于使连接保持活动状态,另一个专门用于结束这个状态。
var timerID = 0; function keepAlive() { var timeout = 15000; if (webSocket.readyState == webSocket.OPEN) { webSocket.send(''); } timerId = setTimeout(keepAlive, timeout); } function cancelKeepAlive() { if (timerId) { cancelTimeout(timerId); } }
keepAlive()函数可以放在WebSocket连接的
onOpen()方法的最后面,
cancelKeepAlive()放在
onClose()方法的最末尾。
时间注意原始操作符比函数调用快,使用VanillaJS
比如,一般不要这样:var min = Math.min(a,b); A.push(v);
可以这样来代替:
var min = a < b ? a : b; A[A.length] = v;
深拷贝与浅拷贝
关于拷贝的问题,主要分为深拷贝和浅拷贝,但是如果从空间分配上来说JavaScript的拷贝不应该算是深拷贝,比如:var d = {}; for(k in a){ d[k] = a[k]; } return d;
今天突然想到了这么一个问题,在C语言中,所谓的拷贝,就是分两种情况,一种是把指针地址拷贝给另外一个变量,虽然也开辟的了一个内存空间,在栈上也存在着一个地址,我对这个变量进行修改,同一个指针是会改变其值的,这种拷贝叫浅拷贝。另外一种情况,直接开辟一个新空间,把需要复制的值都复制在这个新的空间中,这种拷贝叫中深拷贝。
如果看到上述的一段Js代码,很多人说它是浅拷贝,假设传入一个a对象,拷贝完成之后返回一个d,当我修改返回对象的值时并不能同时修改a对象,于是,在这里我有一个很大的疑问,在Js中到底什么是浅拷贝,什么是深拷贝的问题?
这一点上感觉Js真的很奇葩,如果在开发iOS中,不可变对象copy一下,依然是不可变,所以是浅拷贝,拷贝了指针变量中存储的地址值。如果是可变对象copy一下,到不可变,空间变化了,包括不可变mutableCopy到不可变,空间依然变化了,所以是深拷贝。但是JavaScript中对于这一点要考虑一种情况,值类型,和引用类型,这个基础知识,我相信大家都非常清楚。数字,字符串等都是值类型,object,array等都是引用类型。
var a = [1,2,3]; var b = a; b.push(4); console.log(a); //[1,2,3,4] var numb = 123; var _numb = numb; _numb = 567; console.log(numb); //123
从这个例子中可以看的出来,它们使用的都是=符号,而数组a发生了变化,numb数字却没有发生变化。那么从这里,可以有一个总结,所谓了深拷贝,浅拷贝的问题,应该针对的是有多个嵌套发生的情况。不然假设是这样的情况,还能叫浅拷贝么?
var object = {"de":123}; var o = copy(object); o.de = 456; console.log(object) //{"de":123}
明显对象o中的de属性修改并没有影响到原始对象,一个对象中的属性是一个字符串,如果从内存空间的角度上来说,这里明显是开辟了新的空间,还能说是浅拷贝么?那么针对另外一种情况。
var object = { "de":{ "d":123 } } var o = deepCopy(object); o.de.d = "asd";
如果一个对象中的第一层属性,不是值类型,只单层循环,这样来看的话确实是一个浅拷贝,因为在Js中引用类型用=赋值,实际上是引用,这样说的通。所以,深拷贝,还需要做一些处理,把object,array等引用类型识别出来,深层递归到最后一层,一个一个的拷贝。
var deepCopy = function(o){ var target = {}; if(typeof o !== 'object' && !Array.isArray(o)){ return o; } for(var k in o){ target[k] = deepCopy(o[k]); } return target; }
思路是如此,这个例子只考虑了两种情况,对象和数组,为了验证这样的思路,最后的结果与预期是一样的。
var _copy = { 'object':{ 'name':'wen' }, 'array':[1,2] } var h = deepCopy(_copy); h.object.name = 'lcepy'; h.array[1] = 8; console.log(h); console.log(_copy);
[b]
相关文章推荐
- JavaScript、tab切换完整版(自动切换、鼠标移入停止、移开运行)
- JavaScript加减乘除丢失精度问题处理
- jsp九大内置对象
- javascript设置和获取cookie的方法实例详解
- 打正式包混淆后fastjson报错ClassCastException和其他bean报错崩溃问题
- js三级联动代码
- javascript简单比较日期大小的方法
- javascript实现全选/取消全选,反选/取消反选
- 基于JSON数据HTML5视频播放器js插件教程
- JSONP和ajax的跨域调用
- fastjson使用(四) -- 反序列化
- jsp页面或者后台当前日期加减
- javascript DOM
- 【C#】【JSON】JSON转C#的写法(含嵌套对象)
- js截取文件的名称
- Extjs 4 Grid 嵌套
- Extjs3 grid 嵌套
- xStream完美转换XML、JSON
- D3.js--动态树
- Html5基于SVG的扁平风格圆形进度条javascript插件教程