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 相关文章推荐
一个可以增加和删除行的table并可编辑表格中内容
Jun 16 Javascript
JavaScript实现三阶幻方算法谜题解答
Dec 29 Javascript
在JavaScript中call()与apply()区别
Jan 22 Javascript
简单理解JavaScript中的封装与继承特性
Mar 19 Javascript
JavaScript如何实现跨域请求
Aug 05 Javascript
微信小程序 页面跳转和数据传递实例详解
Jan 19 Javascript
详解webpack + react + react-router 如何实现懒加载
Nov 20 Javascript
基于three.js编写的一个项目类示例代码
Jan 05 Javascript
浅谈MUI框架中加载外部网页或服务器数据的方法
Jan 31 Javascript
Angular搜索场景中使用rxjs的操作符处理思路
May 30 Javascript
在vue中更换字体,本地存储字体非引用在线字体库的方法
Sep 28 Javascript
layui树形菜单动态遍历的例子
Sep 23 Javascript
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将字符串转换成16进制的方法
2015/03/17 PHP
PHP中is_file()函数使用指南
2015/05/08 PHP
php简单创建zip压缩文件的方法
2016/04/30 PHP
thinkPHP商城公告功能开发问题分析
2016/12/01 PHP
Javascript 面向对象特性
2009/12/28 Javascript
JS控制日期显示的小例子
2013/11/23 Javascript
使用jQuery仿苹果官网焦点图特效
2014/12/23 Javascript
flash+jQuery实现可关闭及重复播放的压顶广告
2015/04/15 Javascript
JS对HTML表格进行增删改操作
2016/08/22 Javascript
利用jQuery实现打字机字幕效果实例代码
2016/09/02 Javascript
利用JS hash制作单页Web应用的方法详解
2017/10/10 Javascript
解析vue data不可以使用箭头函数问题
2018/07/03 Javascript
Vue入门之数量加减运算操作示例
2018/12/11 Javascript
vue中监听返回键问题
2019/08/28 Javascript
微信小程序实现滑动翻页效果(完整代码)
2019/12/06 Javascript
JS实现打砖块游戏
2020/02/14 Javascript
JavaScript 监听组合按键思路及代码实现
2020/07/28 Javascript
python中字符串前面加r的作用
2015/06/04 Python
python操作redis的方法
2015/07/07 Python
Python使用修饰器执行函数的参数检查功能示例
2017/09/26 Python
Python数据结构与算法之图的基本实现及迭代器实例详解
2017/12/12 Python
用十张图详解TensorFlow数据读取机制(附代码)
2018/02/06 Python
python命令行参数用法实例分析
2019/06/25 Python
pycharm 关掉syntax检查操作
2020/06/09 Python
jupyter notebook 写代码自动补全的实现
2020/11/02 Python
css3实现3D色子翻转特效
2014/12/23 HTML / CSS
html5教程制作简单画板代码分享
2013/12/04 HTML / CSS
设计总监岗位职责
2013/12/07 职场文书
《广玉兰》教学反思
2014/04/14 职场文书
农村优秀教师事迹材料
2014/08/27 职场文书
活动总结结尾怎么写
2014/08/30 职场文书
宝宝满月宴答谢词
2015/09/30 职场文书
2019毕业典礼主持词!
2019/07/05 职场文书
浅谈哪个Python库才最适合做数据可视化
2021/06/28 Python
CentOS7安装GlusterFS集群以及相关配置
2022/04/12 Servers
LeetCode189轮转数组python示例
2022/08/05 Python