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 相关文章推荐
Add a Picture to a Microsoft Word Document
Jun 15 Javascript
jQuery+ajax中getJSON() 用法实例
Dec 22 Javascript
js基础之DOM中document对象的常用属性方法详解
Oct 28 Javascript
Vue.js实现一个SPA登录页面的过程【推荐】
Apr 29 Javascript
简单实现JavaScript弹幕效果
Aug 27 Javascript
Vue+Jwt+SpringBoot+Ldap完成登录认证的示例代码
May 21 Javascript
详解如何在Vue里建立长按指令
Aug 20 Javascript
JS回调函数 callback的理解与使用案例分析
Sep 09 Javascript
微信小程序 下拉刷新及上拉加载原理解析
Nov 06 Javascript
Vue在chrome44偶现点击子元素事件无法冒泡的解决方法
Dec 15 Javascript
浅谈在vue-cli3项目中解决动态引入图片img404的问题
Aug 04 Javascript
详解Vue中的自定义指令
Dec 07 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 全局变量范围分析
2009/08/07 PHP
比较简单实用的PHP无限分类源码分享(思路不错)
2011/10/13 PHP
Destoon模板制作简明教程
2014/06/20 PHP
php和html的区别点详细总结
2019/09/24 PHP
Linux下使用jq友好的打印JSON技巧分享
2014/11/18 Javascript
node.js中的fs.unlink方法使用说明
2014/12/15 Javascript
jQuery.trim() 函数及trim()用法详解
2015/10/26 Javascript
关于获取DIV内部内容报错的原因分析及解决办法
2016/01/29 Javascript
JS JSOP跨域请求实例详解
2016/07/04 Javascript
详解Angular之constructor和ngOnInit差异及适用场景
2017/06/22 Javascript
详解Webstorm 新建.vue文件支持高亮vue语法和es6语法
2017/10/26 Javascript
JavaScript引用类型Function实例详解
2018/08/09 Javascript
vue 项目地址去掉 #的方法
2018/10/20 Javascript
vue组件中的样式属性scoped实例详解
2018/10/30 Javascript
Element el-button 按钮组件的使用详解
2021/02/01 Javascript
python单线程实现多个定时器示例
2014/03/30 Python
pandas or sql计算前后两行数据间的增值方法
2018/04/20 Python
python实现对指定字符串补足固定长度倍数截断输出的方法
2018/11/15 Python
django2.0扩展用户字段示例
2019/02/13 Python
使用SimpleITK读取和保存NIfTI/DICOM文件实例
2020/07/01 Python
Myprotein加拿大官网:欧洲第一的运动营养品牌
2018/01/06 全球购物
华为慧通笔试题
2016/04/22 面试题
2014年清明节寄语
2014/04/03 职场文书
有关环保的标语
2014/06/13 职场文书
农业局党的群众路线教育实践活动整改方案
2014/09/20 职场文书
卫校毕业生自我鉴定
2014/09/28 职场文书
财务审计整改报告
2014/11/06 职场文书
高一军训决心书
2015/02/05 职场文书
评职称个人总结
2015/03/05 职场文书
前台接待岗位职责范本
2015/04/03 职场文书
2015年社区党务工作总结
2015/04/21 职场文书
公司晚宴祝酒词
2015/08/11 职场文书
《浅水洼里的小鱼》教学反思
2016/02/16 职场文书
python通过opencv调用摄像头操作实例分析
2021/06/07 Python
JavaScript分页组件使用方法详解
2021/07/26 Javascript
俄罗斯十大城市人口排名,第三首都仅排第六,第二是北方首都
2022/03/20 杂记