引用类型是javascript中很重要的内容。引用类型是一种数据结构,用于将数据和功能组织在一起。它描述的是一类对象所具有的属性和方法。object是一个基础类型,array是数组类型,date是日期类型,regexp是正则表达式类型,等。
拥抱javascript
曾经名不经传的javascript随着ajax的流行而身价倍增,现在javascript不再仅仅是web开发中一个可有可无的辅助工具,甚至有了专门属于它的职位“javascript工程师”,那怕你仅仅是一名web后台开发程序员,你都必须了解javascript,至少在一些相关招聘职位要求上你可以看到“熟悉javascript优先”的字眼。甚至我还要告诉你,你将可以用javascript开发桌面软件,这得益于adobe air的另外一种开发模式,即用html+css+javascript开发air。
1.object类型
1. 创建:
var dog = new object();
常应用于存储和传输数据。比如存储:
var person = new object();person.name = nicholas;person.age = 29;
创建的第二种方式:(在创建时,属性名也可以是字符串格式,即:可以给属性名加引号。)
var person = {name : nicholas,age : 29};
2.取出属性值:person[name];或者:person.name;
2.array类型
同一个数组可以保存任意类型的数据(大杂烩)。
1.数组可以动态调整(多加一个数据,它自己就增长一个长度,不是死的。)。
2.创建:
var stars=new array();//方式1var stars=new array(20);//方式2var stars=new array(周杰伦,林俊杰,孙燕姿);//方式3var stars=array(20);//方式4var stars=[周杰伦,孙燕姿,林俊杰];//方式6
3.动态调整示例:
var stars=[周杰伦,林俊杰,孙燕姿];stars[1]=jj;//动态改变(把林俊杰变为jj)stars[3]=皮裤汪;//动态增长(加了一个长度)stars.length=1;//动态强制缩减(林俊杰、孙燕姿、皮裤汪强制移除,长度变为1)
4.检测数组:array.isarray(value);
5.用join()把数组转换成有分隔符的字符串:
var stars = [周杰伦, 王尼玛, 张全蛋];alert(stars .join(,)); //周杰伦,王尼玛,张全蛋alert(stars .join(-)); //周杰伦-王尼玛-张全蛋
6.可以像栈一样使用数组(pop()出来,push()进去)。
7.可以像队列一样使用数组。(结合shift()和push()):
var stars = new array(); //create an arrayvar count = colors.push(周杰伦, 王尼玛); //push two itemsalert(count); //2count = stars .push(张全蛋); //push another item onalert(count); //3var item = colors.shift(); //get the first itemalert(item); //周杰伦alert(colors.length); //2/**所谓栈变队列,其实就是把栈颠倒过来再拉取*/
8.排序。
1.reverse()翻转数组顺序;(返回经过排序后的数组)
2.sort()从小到大排序。但是是按字符串排序,不是按数字排序:(返回经过排序后的数组)。
var values = [, , , , ];values.sort();alert(values); //,,,,
要想按你预期的方式排序,可以给sort()里面加一个比较函数当作参数:
function compare(value, value) {if (value value) {return ;} else {return ;}}var values = [, , , , ];values.sort(compare);alert(values); //,,,,
简化版本的比较函数(sort只关心返回的是正数、负数还是0):
function compare(value1,value2){return value2 - value1; }
9.对数组的操作:联结、切片、拼接。
1.联结:使用concat,记忆:concat-->concatenate:连结,连锁。
举例:
var stars = [周杰伦, 王尼玛, 张全蛋];var stars = stars .concat(太子妃, [花千骨, 梅长苏]);alert(stars); //周杰伦,王尼玛,张全蛋 alert(stars); //周杰伦,王尼玛,张全蛋,太子妃,花千骨,梅长苏
2.切片。使用slice,记忆:slice翻译:切片。举例:
var stars = [梅长苏, 誉王, 靖王, 霓凰, 飞流];var stars= stars.slice();var stars= stars.slice(,);alert(stars); //誉王,靖王,霓凰,飞流(从第一个位置开始切)alert(stars); //誉王,靖王,霓凰(从第个位置切到第个位置,表示半封闭,不包含)
3.拼接。splice。功能强大。可以删除、插入、替换。
1.删除任意数量的项:比如:splice(0,2),删除第0,1项(半封闭区间)(返回删除项)。
2.指定位置插入任意数量的项:比如:splice(2,0,周杰伦,王尼玛),从第2个位置开始插入周杰伦、王尼玛两项。
3.指定位置插入任意数量的项且同时删除任意数量的项。比如:splice(2,1,周杰伦,王尼玛),从第2个位置删除1项,然后开始插入周杰伦、王尼玛两项。
10.位置方法:indexof,lastindexof;
11.迭代方法:分为:全部合格才通过、任意一个合格就通过、过滤部分渣渣,一对一映射,迭代查询,缩减。
1.全部合格才通过:
var numbers = [1,2,3,4,5,4,3,2,1];var everyresult = numbers.every(function(item, index, array){return (item > 2);});alert(everyresult); //false
上例中每一项都大于2才返回true。
2.任意一个合格就通过:
var numbers = [1,2,3,4,5,4,3,2,1];var someresult = numbers.some(function(item, index, array){return (item > 2);});alert(someresult); //true
上例中,有一个大于2就返回true。
3.过滤部分渣渣:
var numbers = [1,2,3,4,5,4,3,2,1];var filterresult = numbers.filter(function(item, index, array){return (item > 2);});alert(filterresult); //[3,4,5,4,3]
上例中,把大于2的都过滤掉。
4.一对一映射:
var numbers = [1,2,3,4,5,4,3,2,1];var mapresult = numbers.map(function(item, index, array){return item * 2;});alert(mapresult); //[2,4,6,8,10,8,6,4,2]
上例中,给每一项都乘以2.
5.迭代:使用for-each。
6.缩减:reduce。
var values = [1,2,3,4,5];var sum = values.reduce(function(prev, cur, index, array){return prev + cur;});alert(sum);//15
累加求和返回,5项缩为1项。
3.regexp类型
1.var expression=/ pattern / flags;
2.flags分三种:g(global全局模式,应用于所有字符串)、i(case-insensive,忽略字母大小写)、m(multiline,多行模式,一行检验完了接着下一行。)。举例:
/**匹配字符串中所有'at'的实例*/var pattern1=/at/g;/**匹配第一个'bat'或'cat',不分大小写*/var pattern2 =/[bc]at/i;/**匹配所有以'at'结尾的3个字符组合,不分大小写*/var pattern3=/.at/gi;
3.模式中所有的元字符必须转义,元字符:( { [ \ ^ $ | ) ? * + . ] }
4.function类型
1.每个函数都是function类型的实例,而且与其他引用类型一样,都有属性和方法。
2.函数的两种定义方法:
方法1:
function sum(a,b){return a + b; }
方法2:
var sum=function(a,b){return a + b;}
3.函数没有重载。
5.boolean、number、string:基本包装类型
var a=jay chou is a superstar;var b=a.substring(0,8);
上例中,a是基本类型,但是a可以调用substring方法,是因为,后台自动完成a的包装操作,创建string类型的一个实例。boolean,number也类似。
6.单体内置对象,不需要实例化,直接使用,如:math,global。
1.所有全局作用域中定义的函数、变量,都是global对象的方法,比如:parseint,isnan等。
2.eval()方法也是global对象的方法,它负责解析javascript。
3.math对象是保存数学公式和相关信息的。它有很多方法, 如:min求最小值,max求最大值,ceil()向上取整,floor向下取整,round四舍五入,random取随机数。
ps:引用类型理解:变量的交换等于把现有一间店的钥匙(变量引用地址)复制一把给了另外一个老板,此时两个老板同时管理一间店,两个老板的行为都有可能对一间店的运营造成影响。
引用类型例子
function chainstore(){var store1=['nike china'];var store2=store1;alert(store2[0]); //nike chinastore1[0]='nike u.s.a.';alert(store2[0]); //nike u.s.a.}chainstore();//在上面的代码中,store2只进行了一次赋值,理论上它的值已定,但后面通过改写store1的值,发现store2的值也发生了改变,这正是引用类型的特征,也是我们要注意的地方