你的位置:首页 > Java教程

[Java教程]Javascript学习笔记(四)引用类型


  引用类型是一种数据结构,用于将数据和功能组织在一起。

  Object是使用最多的引用类型,可以直接使用new来定义一个实例,也可以用对象字面量

  此处重点总结一下Array类型的食用方法。

  声明一个Array类型有以下几种方法:

//构造函数法var myArray = new Array();//声明空数组,new可以省略,不推荐var myArray = new Array(10);//声明20个空位置的数组var myArray = new Array("apple", "orange", "banana");//直接传值//数组字面量表示法var myArray = [];//声明空数组var myArray = ["apple", "orange", "banana"];//三个元素数组var myArray = [1,2,];//不推荐,各浏览器表现不定

  数组可以动态修改,包括数组的length属性也可以修改,默认的话数组中保存undefined。以下总结数组中常用的各种方法:

var myArray = ["red","green","blue"];Array.isArray(myArray);//判断是否是数组//实例方法myArray;//直接输出["red","green","blue"]myArray.valueOf();//直接输出["red","green","blue"]myArray.toString();//输出"red,green,blue"myArray.join();//将数组每一项用,连接起来,输出字符串myArray.join("||");//"red||green||blue"//栈方法myArray.push("gray");//追加末尾元素,返回数组长度myArray.pop();//返回移除的项//队列方法myArray.push("gray");//与上同myArray.shift();//返回数组前端的被移除的项myArray.unshift("orange");//在数组前端添加新的项并返回数组长度//排序方法(直接在原数组基础上排序)myArray.reverse();//反转数组myArray.sort();//对数组排序,注意,针对字符串排序!!myArray.sort(function(a, b){return a -b;});//针对数字排序//操作方法myArray.concat();//合并添加数组元素,参数可以是单项或数组,返回新数组myArray.slice(s, e);//返回数组下标为[s,e)的项,不影响原始数组,如果s或e中存在负数,则将负数加上数组长度在进行计算,如果s>e,返回空//splice方法,返回移除项组成的数组,并且影响原始数组myArray.splice(0,2);//从0项开始,删除两项myArray.splice(2,0,"red","blue");//从2项开始,添加两项新的myArray.splice(2,1,"red","blue");//删除第二项一个,并替换为新的两项//位置方法,使用全等比较myArray.indexOf("blue");//返回在数组中的下标,找不到返回-1myArray.lastIndexOf("green");//与上同,从末尾开始//迭代方法//都接受一个函数作为参数function(item,index,array){}//item,当前项;index,当前下标;array,数组本身引用。myArray.every();//对传入函数都返回true,则函数返回truemyArray.some();//对传入函数有一个返回true,则函数返回truemyArray.filter();//对传入函数,返回所有结果为true的项组成的数组myArray.map();//对传入函数,返回每次调用结果组成的数组myArray.forEach();//对数组中执行传入函数,无结果返回//归并方法myArray.reduce();myArray.reduceRight();

  关于Date类型,默认new Date()会返回当前日期。Date.parse()接受日期字符串返回日期的毫秒数,Date.UTC()接受年月日等参数也返回毫秒数,但是记住月份是从0开始计算的。Date.now()返回调用这个函数时的毫秒数。另外注意,getDate()返回的是一月中的天数(1-31),而getDay()返回的是星期几(0-6)

  关于RegExp类型,本人是彩笔,毛都没学会,等学会了单独开一篇总结。

  关于Function类型,我认为JS很多精华都出自函数,所以容我好好总结一发。

  首先函数是对象,有两种声明函数的方式。一种是通过传统的声明方法直接定义函数,另一种是函数表达式,即把一个匿名函数赋值给一个变量来保存函数。这两种声明方法只有一个区别,那就是前者会有一个函数声明提升的过程,解析器会预先读取函数声明,并在任何代码执行前可用,后者不具备这个特性。函数名其实只是一个函数的引用,鉴于这个特性,JS中不存在函数重载,因为同时定义两个一样名字的函数,后边定义的函数相当于重新对函数名进行赋值,就覆盖了之前函数的定义,所以没有重载。

  在函数的内部有两个特殊属性:arguments和this。arguments中有一个callee的属性,该属性是一个指针,指向拥有该arguments的函数。callee这个属性主要用于解除命名耦合,尤其是在递归函数中使用来引用本身会稳定安全。this指针指向当前函数的环境对象,如果是全局中则指向window对象。

  每个函数中都包含两个属性length和prototype,length属性表示函数希望接收的参数个数,prototype表示函数的原型对象指针,这个后边再单独总结。每个函数还包含两个非继承的内部方法:apply()和call(),这两个函数其实差不多,都是让函数在特定的作用域中执行,相当于指定函数的this值后运行。唯一的区别是apply函数接收参数是数组形式而call函数需要把参数一个一个传进来。这两个函数主要用于扩充函数的作用域。

  对于Number,Boolean和String三个基本类型在ES中有相应的基本包装类型与之对应,这也就是为什么虽然是基本类型,他们也有相应的方法来处理数据。但是后台为基本类型创建包装类型的时候拥有瞬时性,在执行完所需方法操作之后会销毁掉包装类型。这里重点说一下String基本包装类型的一些方法。String类型很像一个字符数组,所以很多数组的方法在String类型下也都适用,比如concat、slice、indexOf、lastIndexOf等函数。以下总结一些String类型独有的函数:

//子字符串方法 对原始字符串没有影响var myStr = "hello world";myStr.slice(3, 7);//返回位置从3-6的字符串,"lo w"myStr.substring(3, 7);//返回位置从3-6的字符串,"lo w",与slice同myStr.substr(3,7);//从地3个开始数7个字符,"lo worl"myStr.slice(3,-4);//slice遇到负值将会加上字符串长度再操作,"lo w"myStr.substring(3, -4);//把所有负数转为0,而且会以最小的数为起始,即类似调用了myStr.substring(0,3);返回 "hel"myStr.substr(3,-4);//substr会将第一个负的加上总长度,第二个负的转为0,所以相当于调用了myStr.substr(3,0);返回空字符串myStr.trim();//用于去除字符串前后的空格,返回副本myStr.toLowerCase();//转小写myStr.toUpperCase();//转大写myStr.localeCompare(anotherStr);//如果本字符串与anotherStr相同返回0,字母顺序排在之后返回1,之前返回-1

  关于单体内置对象,Global是ES的全局对象,但只是一个定义,在Web环境下,window对象充当了Global的角色。Global对象中有几个方法需要注意,比如针对URI进行编码的encodeURI()、encodeURIComponent()和解码的decodeURI()、decodeURIComponent()。encodeURI()编码对于空格转为%20,其他字符原封不动,但是encodeURIComponent()则使用对应的编码替换所有非字母数字字符。所以一般对整个URI用前者,对于附在URI后边的字符使用后者。Global中还有一个叼炸天的方法名叫eval(),此方法相当于一个ES的解释器,传入ES代码并执行。但是注意eval()中声明的函数无法声明提升。

  单体内置对象还有一个很重要的是Math对象,其中封装了很多实用的数学方法。此处不再总结。