js005-引用类型
数据类型分为基本类型和引用类型:基本类型值如下:Undefined、Null、Bollean、Number、String
本章内容:
1、使用对象
2、创建并操作数组
3、理解基本的javaScript类型
4、使用基本类型和基本操作类型
引用类型的值(对象)是引用类型的一个实例。引用类型是一种数据结构,和类看起来很相似。
引用类型如下:
5.1 Object类型
创建Object实例有两种方式:
1、 new |
2、对象字面量 |
|
var obj1 = new Object(); obj1.name = "meimei"; |
var person{ name : "meimei"; age : 18; } |
var person = {} person.name = "meimei"; person.age = 18; |
5.2 Array 类型
这是除了Object之外最常用的类型。
创建数组的方式有两种:
1、使用Array构造函数 |
var colors = new Array(); var colors = new Array(20);//数组长度为20 var colors = new Array(“gread”); //省略new操作符 var colors = new Array(3); var name = Array("gread"); |
2、使用数组字面量表示方法 |
var colors = ["red", "blue", "yellow"]; //创建一个包换3个字符串的数组 var names = []; //创建一个空数组 var values = [1,2,]; //别这样做,这样会创建一个2或者3项的数组。 var options = [,,,,]; //别这样,这样会创建一个5或者6项的数组 |
var colors = ["red", "blue", "yellow"]; alert(colors[0]); //显示第一项 colors[2] = "black"; //修改第三项 colors[3] = "green"; //新增第四项 |
5.2.1 检测数组
Instanceof
5.2.2 转换方法
var colors = ["red", "blue", "yellow"]; //创建一个包含三个字符串的数组 alert(colors.toString()); //red,blue,green alert(colors.valueOf()); //red,blue,green alert(colors); //red,blue,green |
5.2.3 栈方法
LIFO的数据结构
var colors = new Array(); var account = colors.push("red", "black"); alert(account); //2 account = colors.push("yellow", "pink"); alert(account); //4 var item = colors.pop(); alert(item); //pink |
5.2.4 队列方法
FIFO数据结构
var colors = new Array(); var account = colors.push("red", "black"); alert(account); //2 account = colors.push("yellow", "pink"); alert(account); //4 var item = colors.shift(); alert(item); //red alert(colors.length); |
5.2.5 重排序方法
var values = [1,2,3,4,5]; values.reverse(); alert(values); |
反转数组项的顺序 |
var values = [1,20,10,36,5]; values.sort(); alert(values); //1,10,20,36,5 |
sort()方法是进行升序排序。是进行字符串比较。会先调用toString()方法。一般不是最佳的方法。一般sort()方法接收一个比较函数作为参数比较好。 |
5.2.6 操作方法
var colors = ["red", "green", "blue"]; var colors2 = colors.concat("yellow" , ["red", "green", "blue"]); alert(colors); //red,green,blue alert(colors2); //red,green,blue,yellow red,green,blue |
concat()方法 |
var colors = ["red", "green", "blue"]; var colors2 = colors.slice(1); var colors3 = colors.slice(1,2); alert(colors2); //green,blue alert(colors3); //green |
slice() 传入1,表示从数组下标为1的开始; 传入1,2表示从1开始到2结束 |
删除 |
可以删除任意数量的项,指定两个参数:要删除的第一项的位置和要删除的项数。如:splice(0, 2); 表示删除前两项 |
插入 |
可以向指定位置插入任意数量的项,提供三个属性:起始位置,0(要删除的项),要插入的项。如:splice(2, 0, “green” , “red”); |
替换 |
可以向指定位置插入任意数量的项,同时删除任意数量的项。提供三个属性:起始位置,要删除的项,要插入的项。如:splice(2,2, “green” , “red”);在第二个位置(包括该项),删除两项后,插入green和red。 |
5.2.7 位置方法
两种位置方法
indexOf() |
var numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1]; alert(numbers.indexOf(4)); //3 alert(numbers.lastIndexOf(4)); //5 alert(numbers.indexOf(4, 4)); //5 alert(numbers.lastIndexOf(4, 4)); //3 var person = {name :"meimei"}; var people = [{name :"meimei"}]; var morePeople = [person]; alert(people.indexOf(person)); //-1 alert(morePeople.indexOf(person)) //0 |
lastIndexOf() |
5.2.8 迭代方法
以下是五个迭代方法
every() |
对数组中的每一项运行给定函数,如果该函数每一项都返回true则返回true |
filter() |
对数组中的每一项运行给定函数,返回函数会返回true的项组成的数组 |
forEach() |
对数组中的每一项运行给定函数,没有返回值 |
map() |
对数组中的每一项运行给定函数,返回函数每次调用的结果组成的数组 |
some() |
对数组中的每一项运行给定函数,如果该函数对任意一项返true,则返回true |
5.2.9 归并方法
reduce() reduceRight() 两种方法。相同点: 都会迭代数组的所有项,然后构建一个最终返回的值。都接收两个参数:一个在每一项上调用过得函数和(可选)作为归并基础的初始值。传给这两个函数接收的4个参数:前一个值、当前值、项的索引和数组对象。函数返回的任何值都会被作为第一个参数自动传给下一项。第一次迭代发生在数组的第二项上,因此第一个参数是数组的第一项,第二个参数是数组的第二项; |
不同点:
reduce() |
从第一项开始,逐个遍历到最后 |
reduceRight() |
从最后一项开始,逐个遍历到最前面 |
5.3 Date类型
创建一个日期对象,使用new操作符和Date构造函数
如下:
var now = new Date(); UTC时间1970年1月1日午夜0点
Date.parse()
使用+操作符取得Date对象的时间戳
var start = +new Date(); //调用函数 dosomething(); //取得停止时间 var stop = +new Date(); result = stop - start; |
5.3.1 继承方法
5.3.2 日期格式化方法
toDateString() |
以特定于实现的格式显示星期几、月、日、年 |
toTimeString() |
以特定于实现的格式显示时、分、秒、时区 |
toLocaleDateString() |
以特定于地区的格式显示星期几、月、日、年 |
toTimeeDateString() |
以特定于实现的格式显示时、分、秒 |
toUTCString() |
以特定于实现的格式完整的UTC日期 |
5.3.3 日期/时间组件方法
未完成
方法 |
说明 |
5.4 RegExp类型
ECMAScript通过RegExp类型来支持正则表达式
var expression = / pattern /flags;
其中pattern部分可以是任何简单或者复杂的正则表达式,可以包含字符类、限定类、分组向前查找以及方向引用。每个正则表达式可以带一个或者多个标志,用于
g |
表示全局(global)模式,即模式将被英语与所有字符串,而非在发现第一个匹配项时立即停止; |
i |
表示不区分大小写(case-insensitive) |
m |
表示多行(multiline)模式 |
表明正则表达式的行为。正则表达式的匹配模式支持下列3个标志:
5.4.1 RegExp实例属性
RegExp的每个实例都具有下列属性:
global |
布尔值,表示是否设置了g标志 |
ignoreCase |
布尔值,表示是否i标志 |
lastIndex |
整数,表示开始搜索下一个匹配项的字符位置,从0算起 |
multiline |
布尔值,表示是否设置了m标志 |
source |
正则表达式的字符串表示,按照字面量的形式而非传入构造函数的字符串欧式返回。 |
5.4.2 RegExp实例方法
RegExp对象的主要方法是exec(),该方法专门为捕获组而设计,接受一个参数
var text = "mom and dad and baby"; var patttern = /mom(and dad(and baby)?)?/gi; var matches = patttern.exce(text); alert(matches.index); //0 alert(matches.input); //"mom and dad and baby" alert(matches[0]); //"mom and dad and baby" alert(matches[1]); //"and dad and baby" alert(matches[2]); //"and baby" |
5.4.3 RegExp构造函数属性
RegExp构造函数包含一些属性,这些属性适用于作用域中的所有正则表达式,并且基于所执行的最近一次正则表达式操作而变化。
下表为RegExp构造函数的属性
长属性名 |
短属性名 |
说明 |
input |
$_ |
最近一次要匹配的字符串。Opera为实现此属性 |
lastMatch |
$& |
醉经一次的匹配项,Opera未实现此属性 |
lastParen |
$+ |
最近一次匹配的捕获组。Opera未实现此属性 |
leftContext |
$’ |
input字符串中的lastMatch之前的文本 |
multiline |
$* |
布尔值,表示是否所有表达式都是使用多行模式。IE和Opera未实现此属性 |
rightContext |
$’ |
Input字符串中的lastMatch之后的文本 |
5.4.4 模式的局限性
ECMAScript正则表达式不支持的特性
匹配字符串开始和结尾的\A 和\Z 锚 |
向后查找(lookbehind) |
并集和交集类 |
原子组 |
Unicode支持(单个字符除外) |
命名的捕获组 |
s (single 单行)和x(free-spacing 无间隔)匹配模式 |
条件匹配 |
正则表达式注释 |
5.5 Function类型
函数实际上是对象。
函数通常是使用函数声明语法定义的,如下:
function add(num1 , num2){ var sum = num1 + num2; return sum; } |
5.5.1 没有重载 (深入理解)
function addSomeNunber(num){ return num + 100; } function addSomeNunber(num){ return num + 200; } var result = addSomeNunber(100); //300 |
var addSomeNunber = function(num){ return num + 100; } var addSomeNunber = function(num){ return num + 200; } var result = addSomeNunber(100); //300 |
这两个例子声明了两个同名函数,结果是后面的函数覆盖了前面的函数。 |
5.5.2 函数声明和函数表达式
alert(sum(10,10)); function sum(num1,num2){ return num1 + num2; } |
alert(sum(10,10)); var sum = function(num1,num2){ return num1 + num2; }; |
5.5.3 作为值的函数
函数名本身就是变量,所以函数也可以作为值来使用。就是可以把函数名像参数一样传给另一个参数
5.5.4函数内部属性
在函数内部有两个特殊对象:arguments和this。
arguments主要用途是保存函数参数,但是这个对象有个属性是callee,该属性是一个指针,指向拥有这个arguments对象的函数
function factorial(num){ if (num <= 1) { return 1; }else { return num * factorial(num - 1); } } |
如果函数名不变的话,这个方法是正确的。但是问题是这个函数的执行与函数名factorial紧密耦合在一起,未消除这种现象可以使用一下arguments.callee。 |
function factorial(num){ if (num <= 1) { return 1; }else { return num * arguments.callee(num - 1); } } |
在重写的函数体内没有引用函数名factorial,这样无论函数名使用什么样的名字,都可以保证正常完成递归调用 |
5.5.4 函数属性和方法
每个函数都包含两个属性:length和prototype。其中length蛇形表示函数希望接收的命名参数的个数,如下例子
function sayName(name){ alert(name); } function sum(num1 , num2){ return num1 + num2; } function sayHi(){ alert("hi"); } alert(sayName.length); //1 alert(sum.length); //2 alert(sayHi.length); //0 |
在传点自定义引用类型中,prototype属性是不可枚举的,因此for-in无法发现。
注:第五章未完成,函数那一块差不多看了一晚上。感觉上次讲课中,函数这一块讲的很多,还有原型prototype。比较难以理解。明天早上继续学习。