javascript中的对象和数组的应用技巧


Posted in Javascript onJanuary 07, 2007

javascript已经用了有三年多了,但是对一些细节的东西还是一知半解,比如对象和数组,一直都在用一些最基本的操作。这是我学习的一个坏习惯--懒,很多东西都是了解而已,看到稍微复杂点的逻辑就没有耐心。就像学asp时不知道asp跟脚本的关系,学html不知道什么是DOM...结果是学得慢且不扎实,碰到稍复杂的问题就歇菜(扯远了)。
今天继续优化脚本,尝试着合并一些数组时碰到问题,才算去仔细看了手册,做了一些测试。

javascript1.2之后允许使用[]创建数组:

var firstArray = [];
var secondArray = ["red", "green", "blue"];
var thirdArray = [,,,,];

可以在数组创建后添加元素:

secondArray[4] = 28;

这样的结果是第4个元素和第2个元素之间有1个空元素。
结果类似这样:["red", "green", "blue",,28]
需要注意的是,数组必须初始化,我测试了数组作为数组元素的定义:

var arrArray = [[]];

本来设想实现二维数组,结果是使用arrArray[i][0]当i>0时无效!
仔细看一下才明白,其实是定义了arrArray[0]为一个空数组,而其他元素都未定义,相当于
var arrArray=[];
arrArray[0]=[];
所以arrArray[1]没有定义,所以如果将它作为数组进行操作会出错。

删除一个数组元素:delete

var myColors = ["red", "green", "blue"];
delete myColors[1];
alert("The value of myColors[1] is: " + myColors[1]);

delete的结果是myColors[1]=undefined,但是myColors.length不变,myColors变成这样:["red",, "blue"]

替换或绝对删除数组元素用slice():

var myArray = [1, 2, 3, 4, 5];
myArray.slice(2); // returns [3, 4, 5]
myArray.slice(1, 3); // returns [2, 3]
myArray.slice(-3); // returns [3, 4, 5]
myArray.slice(-3, -1); // returns [3, 4]
myArray.slice(-4, 3); // returns [2, 3]
myArray.slice(3, 1); // returns []

var myArray = [1, 2, 3, 4, 5];
myArray.splice(3,2,''a'',''b'');
// returns 4,5 [1,2,3,''a'',''b'']
myArray.splice(1,1,"in","the","middle");
// returns 2 [1,"in","the","middle",3,''a'',''b'']

看了文档才知道,数组是传递引用的!

var x = [10, 9, 8];
var y = x;
x[0] = 2;
alert("The value of y's first element is: " + y[0]);

你猜结果是多少呢?
再看这个:

// Declare a reference type (array)
var refType = ["first ", " second", " third"]; 

// Declare a primitive type (number)
var primType = 10; 

// Declare a function taking two arguments, which it will modify
function modifyValues(ref, prim) 
{
ref[0] = "changed"; // modify the first argument, an array
prim = prim - 8; // modify the second, a number
}

// Invoke the function
modifyValues(refType, primType); 
// Print the value of the reference type
document.writeln("The value of refType is: ", refType+"<
>");
// Print the value of the primitive type
document.writeln("The value of primType is: ", primType); 

测试时发现一个问题:

var arr=[];
arr['a']=1;
arr['b']=2;
alert(arr.length);

弹出的数字是0!
看了文档后知道,这样的数组叫做联合数组(Associative Arrays),arr['a']等同于arr.a,arr.length也就等同于arr['length'],而arr.length在我们初始化arr(var arr=[];)的时候自动赋值为0。
有人把这种联合数组叫做javascript的hash table。严格上讲,联合数组和普通数组本身都是对象(废话,javascript中的一切都是对象- -),意义和用法都是相同的。看下面的例子:

var arr=[];
arr=[1,2,3];
arr.test='test';
alert(arr);
alert(arr[1]);
alert(arr['test']);

var arr={}; arr=[2,3,4]; alert(arr[0]); 
var arr={};和var arr=[]都可以写成var arr=function(){}; 
从上面的代码可以看出,下标数组跟联合数组分别独立,下标只作用于下标数组,不能访问联合数组,相应的,联合数组不对length属性产生影响。联合数组的标签就是属性,但是下标数组的下标并不是属性,arr[0]!=arr.0,访问arr.0会出错。

在某些时候,用arr['a']代替arr.a作为方法调用会更有效,因为arr['a']中的'a'可以用变量传入,比如将方法赋给变量:

var d=document,l=links;

这时候用直接d.l就会出错,而用d[l]就可以正确执行,alert一下就知道了:)

alert(d.l);//脚本错误
alert(d[l]);//显示object

既然数组是由lenght属性的对象,那么是不是所有具有length属性的对象都是数组呢?比如String。测试之后发现,firefox是可以把String当作数组处理的,但是ie不行:

var myString = "Hello world";
alert(myString.length);
alert(myString[0]);

数组的对象应该比较独特,用户对象不能完全模拟:

function myarray(size){
this.length=size;
var x=0;
}
var arr=new myarray(5);
arr[9]=1;
alert(arr);
alert(arr[9]);
alert(arr.length);

本以为Array的length属性就是普通的对象属性,结果经过上面的例子发现,arr的length不再是数组length,arr的结构也不是普通数组结构。

定义一个函数/类的方法有好几种:

function fName(arguments){
//function body
};

var fName = function(arguments){
//function body
}

var fName = new Function("arguments","/*function body*/");

第三种方法比较好玩,看下面的例子:

var arr=new Function("var total=0; for (var i=0; i

用这个方法可以解析ajax返回的JSON,这样就不用低效的eval了(没有测试是否比eval快):
假设{b:{c:2}}为返回的json字符串:

var arr=new Function("this.a={b:{c:2}};");
var aa =new arr();
alert(aa.a.b.c);

Javascript 相关文章推荐
JavaScript 动态生成方法的例子
Jul 22 Javascript
深入理解JavaScript编程中的同步与异步机制
Jun 24 Javascript
jQuery实现动态表单验证时文本框抖动效果完整实例
Aug 21 Javascript
详解JavaScript表单验证(E-mail 验证)
Mar 31 Javascript
Bootstrap源码解读表单(2)
Dec 22 Javascript
javascript事件的绑定基础实例讲解(34)
Feb 14 Javascript
微信小程序Redux绑定实例详解
Jun 07 Javascript
js 中rewrap-ajax.js插件实例代码
Oct 20 Javascript
vue.js实现带日期星期的数字时钟功能示例
Aug 28 Javascript
如何实现echarts markline标签名显示自己想要的
Jul 20 Javascript
OpenLayers3实现对地图的基本操作
Sep 28 Javascript
使用vue判断当前环境是安卓还是IOS
Apr 12 Vue.js
JavaScript For Beginners(转载)
Jan 05 #Javascript
JavaScript的目的分析
Jan 05 #Javascript
关于JavaScript的gzip静态压缩方法
Jan 05 #Javascript
关于Javascript 的 prototype问题。
Jan 03 #Javascript
彻底搞懂JS无缝滚动代码
Jan 03 #Javascript
经典的解除许多网站无法复制文字的绝招
Dec 31 #Javascript
对象的类型:本地对象(1)
Dec 29 #Javascript
You might like
详解PHP中的null合并运算符
2015/12/30 PHP
YII视图整合kindeditor扩展的方法
2016/07/13 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
科讯商业版中用到的ajax空间与分页函数
2007/09/02 Javascript
WEB页子窗口(showModalDialog和showModelessDialog)使用说明
2009/10/25 Javascript
jquery tab插件制作实现代码
2010/06/22 Javascript
javascript算法学习(直接插入排序)
2011/04/12 Javascript
用js判断输入是否为中文的函数
2014/03/10 Javascript
Bootstrap每天必学之下拉菜单
2015/11/25 Javascript
15款最好的Bootstrap在线编辑器
2016/08/03 Javascript
基于JS实现移动端左滑删除功能
2017/07/28 Javascript
vue axios 表单提交上传图片的实例
2018/03/16 Javascript
js+html5实现手机九宫格密码解锁功能
2018/07/30 Javascript
Vue切换组件实现返回后不重置数据,保留历史设置操作
2020/07/21 Javascript
简要讲解Python编程中线程的创建与锁的使用
2016/02/28 Python
用Python实现KNN分类算法
2017/12/22 Python
将tensorflow的ckpt模型存储为npy的实例
2018/07/09 Python
基于MSELoss()与CrossEntropyLoss()的区别详解
2020/01/02 Python
在PyCharm中实现添加快捷模块
2020/02/12 Python
解决Tensorboard可视化错误:不显示数据 No scalar data was found
2020/02/15 Python
如何基于python对接钉钉并获取access_token
2020/04/21 Python
python中np是做什么的
2020/07/21 Python
详解python命令提示符窗口下如何运行python脚本
2020/09/11 Python
如何在scrapy中集成selenium爬取网页的方法
2020/11/18 Python
BeautifulSoup获取指定class样式的div的实现
2020/12/07 Python
python字典按照value排序方法
2020/12/28 Python
css3的过滤效果简单实例
2016/08/03 HTML / CSS
自立自强的名人事例
2014/02/10 职场文书
2014年安全生产责任书
2014/07/22 职场文书
党的群众路线对照检查材料(个人)
2014/09/24 职场文书
大一学生个人总结
2015/02/15 职场文书
工作态度不好检讨书
2015/05/06 职场文书
党校培训学习心得体会
2016/01/06 职场文书
2019教师的学习计划
2019/06/25 职场文书
中秋节作文(五年级)之关于月亮
2019/09/11 职场文书
Python预测分词的实现
2021/06/18 Python