《Javascript编程精解》读书笔记-第三章 数据结构:对象与数组
3.1 此小节书中讲了一个故事,此处略过.....
3.2 基本数据结构 属性的概念不多说了。关于对象的概念,跟其它的语言是一样的。下面是关于js中对象的常用操作:
//生成一个对象的方式 var person = {name:"zhangran",age:23}; //修改属性的值 person.age = 24; //alert(person.age); //result:24 delete person.age; //alert(person.age); //result:undefined //添加一个属性 person.address = "Beijing"; //alert(person.address); //result:Beijing //属性的另一种调用方式 var address = person["address"]; //alert(address); //result:Beijing var thing = {"first name":"zhangran",1:"isMyNumber"}; //如果属性不是合法的命名,只能用[]的形式来得到属性之,不能用'.' 而且这些属性都需要引号,除了数字。 var firstName = thing["first name"]; var number = thing[1]; //[ ]中是能够写表达式的 var number2 = thing[2-1]; //alert(firstName+"|"+number+"|"+number2); result:zhangran|isMyNumber|isMyNumber //'in'来判断一个对象是否有某个属性 var box = {size:"big"}; //记住,下面的size要用引号。 //alert("size" in box); //result:true
对象可以当集合来使用。声明一个对象,通过.操作可以不断的向对象里面添加内容,通过delete操作又可以动态的给把内容从对象中删掉,这样来实现一个集合的功能。
对象中的内容可以靠改变对象的属性来改变,这体现了对象的易变性,而在js中所有的值类型是不可改变的(这句话不理解了,难道var a = 1;a =2;这不是值的改变吗,为什么说是不能改变的)。
var obj1 = {name:"zhangran"}; var obj2 = obj1; //alert(obj1 == obj2); //result:true obj1.name = "lisi"; //alert(obj2.name); //result:lisi; //两个对象指向形同的引用,所以obj1改变了,obj2的属性也改变了
对象不仅是集合,对象也是数组,可见对象可以扮演多种角色的。下面的代码用对象模拟一个数组:
var objs = {0:"name1",1:"name2",2:"name3",3:"name4",4:"name5"}; for(var i = 0; i in objs; i++){ print("["+i+":"+objs[i]+"]"); }
当然数组的操作会来的更直接,var arrays = ["one","two","three"];
关于数组我想说两点:
1.
//定义一个空的数组 var arrays = []; arrays[0] = "name"; arrays[1] = "age"; arrays[1] = "new age";//如果索引已经有了,就是修改值 //你可以随便的添加,这一点不同于C#、java,声明数组的时候需要先指定数组的大小 例如:int[] arrays = new int[10];
2. 几种常见的处理数组的js方法:
var mack = []; mack.push("my"); mack.push("name"); mack.push("is"); //mack --> ["my","name","is"]; //把数组用指定的字符来连接 mack.join("-"); //删掉最后面的一个,并且返回删掉的值 mack.pop()
3.3解决关于Emily姨妈家猫的问题
在这一章节中,文章通过解决一个生活中的实际问题来带领大家进一步熟悉对象以及数组的相关用法。问题描述以及代码如下:
//问题简述:XX经常收到阿姨的来信,每封信件都会写道家里的猫出生或者死亡的情况,现在要解决的问题就是如何通过遍历信件来获得当前阿姨家里 //猫的数量情况。信件中关键的两行内容是: // died 27/04/2006: Black Leclere // born 05/04/2006(mother Lady Penelope): Red Lion,DoctorHobles the 3rd, Little Iroquois //假设每封邮件都存在ARCHIVE数组里,下面开始代码部分: var livingCats = {"Spot":true}; for(var mail = 0; mail < ARCHIVE.length; mail++){ var paragraphs = ARCHIVE[i].split("\n"); for(var i = 0; i < paragraphs.length; i++){ var paragraph = paragraphs[i]; if(startsWith(paragraph,"born")){ var names = catNames(paragraph); for(var name = 0; name < names.length; name++){ livingCats[names[name]] = true; } else if(startsWith(paragraph,"died")){ var names = catNames(paragraph); for(var name = 0; name < names.length; name++){ delete livingCats[names[name]]; } } } } //判断,string字符串是否是以pattern作为开头字母的 function startsWith(string, pattern){ return string.slice(0,pattern.length); } function catNames(paragraph){ var colon = paragraph.indexOf(":"); var names = paragraph.slice(colon + 2).split(","); return names; }
JavaScript中常常会遇到关于时间的处理,常见的时间处理方式如下:
//js中的日期表示法 //日期处理中常用到的概念和方法 var when = new Date(2012,12,2);//new出一个日期对象 new Date();//默认情况下指的是当前的时间 //下面指的是,1999年,10月9号,12点,45分,30秒。在月份上有点差异,是因为js中的12个月是由0~11表示的 new Date(1999,9,9,12,45,30); //常用得到时间的方法 var today = new Date(); today.getFullYear(); today.getMonth(); today.getDate(); today.getHours(); today.getMinutes(); today.getSeconds(); today.getDay();//此处指的是今天是这个周的第几天 today.getTime();//指的是从1970.1.1到现在的毫秒数 today.getTimeZoneOffset();//得到本时区与格林威治时间相差的分钟数
3.4更多理论
当函数调用的时候,有一个隐藏的参数正发挥正作用,那就是arguments.传递参数的值被隐形的存放在了arguments这个数组中。最简单的方法你可以调用一下argumens.length方法,来查看一下当前的函数使用了几个参数。
在处理相关数学操作的时候,常用到Math对象,罗列一下常用的方法,作用一看便知,不再赘述:
Math.cos 、sin、tan、acos、asin、atan Math.PI Math.E
Math.pow Math.round Math.sqrt Math.max
Math.min Math.floor