◆ ●
引用类型:引用类型是一种数据结构,用于将数据和功能组织在一起。它也常被称为类,但这种称呼并不妥当。它们不是相同的概念。
◆ Object类型
创建Object实例:
var person=new Object()
person.name="abc";
person.age=19;
var person={
person.name:"abc",
person.age:19 //不能加逗号
};
var person={}; //等于 var person=new Object();
对象字面量也是向函数传递大量可选参数的首选方式
例:
function displayInfo(args){
var output="";
if(typeof args.name=="string"){
output+="name: "+args.name+"\n";
}
if(typeof args.age=="number"){
output+="Age: "+args.age+"\n";
}
alert(output);
}
displayInfo({name:"abc",
age:10
});
displayInfo({name:"def"});
JavaScript也可以使用方括号来访问对象的属性。而且方括号的主要优点是可以通过变量来访问属性。
通常建议用点表示。
------------------------------------------------------------------------------------------------------------------------
◆ Array类型
1: 使用构造函数:
例: var colors=new Array();
var colors=new Array(20); //长度是20
var colors=new Array("red","blue","green");
另外,在使用Array构造函数时可以省略 new 操作符。
2: 使用字面量:
例: var colors=["red",'blue',"green"]; //创建一个包含三个字符串的数组
var names=[]; //创建一个空数组
var value=[1,2,]; //不要这样!
var options=[,,,,,]; //不要这样!
像这种省略值的情况下,每一项都将获得undefined值。
与对象一样,在使用数组字面量表示法时,也不会调用Array构造函数。
* 数组的length属性
例: var colors=["red","blue","green"];
colors.length=2;
alert(colors[2]); //undefined
var colors=["red","blue","green"];
colors.length=4;
alert(colors[3]); //undefined
● 检测数组
instanceof 方法 问题在于它假定只有一个全局环境。
Array.isArray() 方法
if(Array.isArray(value)){
//执行操作
}
● 转换方法
例: var colors=["red","blue","green"];
alert(colors.toString()); //red,blue,green
alert(colors.valueOf()); //red,blue,green
alert(colors); //red,blue,green (由于alert要接收字符串参数,所以它会在后台调用toString()方法。
join 方法:
例: var colors=["red","green","blue"];
alert(colors.join("|||"));
alert(colors.join("||:").toString());
alert(colors.join('---').valueOf());
● 栈方法:
push() 接收任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度。
pop() 从数组末尾移除最后一项,减少数组的length值,然后返回移除的项。
● 队列方法:
shift() 移除数组中的第一项,并返回该项,同时将数组长度减一。
unshift() 在数组前端添加任意个项并返回新数组的长度。
● 重排序方法:
reverse() 反转数组项的顺序。
sort() 按升序方法排列数组项(字符串)
sort()方法可以接收一个比较函数作为参数,比较函数接收两个参数,如果第一个参数应该位于第二个参数之前则返回一个负数,否则返回正数,相等返回0.
例: function compare(value1,value2){
if(value1<value2){
return -1;
}else if(value1>value2){
return 1;
}else {
return 0;
}
}
或: function compare(value1,value2){
return value1-value2;
}
var values=[0,2,349,839];
values.sort(compare);
alert(values);
● 操作方法:
concat() 不影响原数组
例: var color1=["red"]; //red
var color2=color1.concat("blue",["green","black"]); //red,blue,green,black
slice() 不影响原数组
例: var abc=[1,2,3,4,5,6,7];
var def=abc.slice(2); //3,4,5,6,7
var def1=abc.slice(2,4); //3,4
splice()
1: 删除 2个参数: 要删除的第一项和项数。
2: 插入 3个或以上参数: 起始位置,0(删除的项数),要插入的项。 如果要插入多个,可以再传第4、第5.......以致任意多的项。
3: 替换 同理
splice() 方法始终返回一个数组,包含从原始数组中删除的项(如果没有删除任何项,则返回一个空数组)
● 位置方法:
indexOf() 从开头开始查找
lastIndexOf() 从末尾开始查找
都使用===全等操作符。没找到都返回-1。
例: var numbers=[1,2,3,4,5,6,7,8,9];
alert(number.indexOf(4)); //3
alert(number.lastIndexOf(4)); //5
● 迭代方法:
p 96
● 归并方法:
p 97
------------------------------------------------------------------------------------------------------------------------
◆ date类型:
var now=new date(); //在调用Date构造函数而不传递参数的情况下,新创建的对象自动获得当前时间。
p 98
------------------------------------------------------------------------------------------------------------------------
◆ RegExp类型:
g: 表示全局。
i: 不区分大小写。
m: 表示多行。
* 使用字面量模式:
var pattern1=/[bc]at/i; //匹配第一个"bat"或"cat",不区分大小写。
var pattern2=/\[bc\]at/i //匹配第一个"[bc]at",不区分大小写。
var pattern3=/.at/gi //匹配所有以"at"结尾的3个字符的组合,不区分大小写。
var pattern4=/\.at/gi //匹配所有".at",不区分大小写。
* 使用RegExp构造函数:
var pattern1=/[bc]at/i;
var pattern2=new Regexp("[bc]at","i"); //与pattern1相同。
由于RegExp构造函数的模式参数是字符串,所以在某些情况下要对字符进行双重转义。
所有的元字符都必须双重转义,那些已经转义过的字符也是如此。
小提醒:ECMAScript3中用字面量方法创建正则表达式始终共享一个字面量。在ECMAScript5中已经做出了修改。每次都创建一个新的RegExp实例。
● RegExp实例属性:
1: golbal: 布尔值,表示是否设置了 g 标志。
2: ignoreCase: 布尔值,表示是否设置了 i 标志。
3: lastIndex: 整数,表示开始搜索下一个匹配项的字符位置。
4: multiline: 布尔值,表示是否设置了 m 标志。
5: source: 字符串,返回字面量形式所使用的的字符串。
● RegExp实例方法:
exec();
test();
------------------------------------------------------------------------------------------------------------------------
◆ Function 类型:
函数实际上是对象,每个函数都是Function类型的实例。
函数名实际上是指向函数对象的指针,不会与某个函数绑定。
function sum(num1,num2){
return num1+num2;
}
var sum=function(num1,num2){
return num1+num2;
};
一个函数可以有多个名字:
function sum(num1,num2){
return num1+num2;
}
var anotherSum=sum; //两个指针指向同一个函数。
● 没有重载
● 函数声明与函数表达式
解析器在向执行环境加载数据的时候,会率先读取函数声明。
所以即使声明函数的代码在调用它的代码之后,JavaScript引擎也能把函数声明提升到顶部。
alert(sum(10,10));
function sum(num1,num2){
return num1+num2;
} //正确
alert(sum(10,10));
var sum=function(num1,num2){
return num1+num2;
} //错误,函数位于一个初始化语句中,而不是一个函数声明。
除了什么时候可以通过变量访问函数这一点区别之外,函数声明与函数表达式的语法其实是等价的。
● 函数内部属性:
callee 属性:指向拥有这个arguments对象的函数。 arguments.callee 相当于该函数名。
this 属性:当在网页的全局作用域中调用函数时,this对象引用的就是window
var color="red";
var o={color:"blue"};
function sayColor(){
alert(this.color);
}
sayColor(); //red
o.sayColor=sayColor;
o.sayColor(); //blue
函数的名字仅仅是一个包含指针的变量而已。因此即使是在不同的环境执行,全局的sayColor()函数与o.sayColor()指向的仍然是同一个函数。
● 函数的属性和方法:
length 属性 表示函数希望接收的命名参数的个数。
call apply 属性。
apply(在其中运行函数的作用域,参数数组);
call(在其中运行函数的作用域,参数);
事实上,传递参数并非apply() 和 call() 真正的用武之地,它们真正强大的地方是能够扩充函数赖以运行的作用域。
例: window.color="red";
var o={color:"blue"};
function sayColor(){
alert(this.color);
}
sayColor(); //red
sayColor.call(this); //red
sayColor.call(window); //red
sayColor.call(o); //blue
使用call()(或apply())来扩充作用域最大的好处,就是对象不需要与方法有任何的耦合关系。
bind() 属性:这个方法会创建一个函数的实例,其this值会被绑定到传给bind()函数的值。
window.color="red";
var o={color:"blue"};
function sayColor(){
alert(this.color);
}
var objectSayColor=sayColor.bind(o);
objectSayColor(); //blue
------------------------------------------------------------------------------------------------------------------------
◆ 基本包装类型:
基本类型值不是对象,因而从逻辑上讲它们不应该有方法(尽管如我们所愿,它们确实有方法)
var a="abcdefg";
var b=a.substring(2);
alert(b); //cdefg
alert(a); //abcdefg
var c=a.color="red";
alert(c); //red
alert(a.color); //undefined
引用类型和基本包装类型的主要区别就是对象的生存周期。自动Duang简单基本包装类型的对象,只存在于代码执行的一瞬间,然后立即被销毁。
对基本包装类型的实例调用typeof会返回"object"。
Object构造函数也会根据传入的值返回相应基本包装类型的实例
var obj=new Object("some test");
alert(typeof obj); //object
var obj=new Object("25");
alert(typeof Number); //function
var obj=new Object(true);
alert(typeof Boolean); //function
建议永远不要使用boolean对象。
● Number类型:
1:
var num=10;
alert(num.toString()); //"10"
alert(num.toString(2)); //"1010"
alert(num.toString(8)); //"12"
alert(num.toString(10)); //"10"
alert(num.toString(16)); //"a"
2:
var num=10;
alert(num.toFixed(2)); //"10.00"
如果小于实际小数位的话,不同浏览器有不同舍入方法。
3:
var num=10;
alert(num.toExpoential(1)); //"1.0e+1"
4:
var num=99;
alert(num.toPrecision(1)); //"1e+2"
alert(num.toPrecision(2)); //"99"
alert(num.toPrecision(3)); //"99.0"
toPrecision()方法会根据要处理的数值决定到底是调用toFix()还是调用toExponential()。
不建议直接实例化Number类型。
● String类型:
1: 字符方法:charAt() charCodeAt()
var a="abcdefg"
alert(a.charAt(4)); //"e" 位置1处是e
alert(a.charCodeAt(4)); //"101" ASCII码
2: 字符串操作方法
var a="lll";
a.concat("abc","de"); //"lllabcde"
slice()
substring()
substr()
----------------------------------------------------------------------------------------------------------------------
◆ 单体内置对象
ECMA-262对内置对象的定义是:“由ECMAScript提供,不依赖于宿主环境的对象,这些对象在ECMAScript程序执行之前就已经存在了。”
意思就是说,开发人员不必显示的实例化内置对象,因为它们已经实例化了。前面我们已经介绍了大多数内置对象,例如Object、Array和String。
ECMA-262还定义了两个单体内置对象:Global和math。
eval() 方法
ECMAScript虽然没有指出如何直接访问Global对象,但web浏览器都是将这个全局对象作为window对象的一部分加以实现的。
因此,在全局作用域中声明的所有变量和函数,就都成为了window对象的属性。
Math 对象
p134
引用类型:引用类型是一种数据结构,用于将数据和功能组织在一起。它也常被称为类,但这种称呼并不妥当。它们不是相同的概念。
◆ Object类型
创建Object实例:
var person=new Object()
person.name="abc";
person.age=19;
var person={
person.name:"abc",
person.age:19 //不能加逗号
};
var person={}; //等于 var person=new Object();
对象字面量也是向函数传递大量可选参数的首选方式
例:
function displayInfo(args){
var output="";
if(typeof args.name=="string"){
output+="name: "+args.name+"\n";
}
if(typeof args.age=="number"){
output+="Age: "+args.age+"\n";
}
alert(output);
}
displayInfo({name:"abc",
age:10
});
displayInfo({name:"def"});
JavaScript也可以使用方括号来访问对象的属性。而且方括号的主要优点是可以通过变量来访问属性。
通常建议用点表示。
------------------------------------------------------------------------------------------------------------------------
◆ Array类型
1: 使用构造函数:
例: var colors=new Array();
var colors=new Array(20); //长度是20
var colors=new Array("red","blue","green");
另外,在使用Array构造函数时可以省略 new 操作符。
2: 使用字面量:
例: var colors=["red",'blue',"green"]; //创建一个包含三个字符串的数组
var names=[]; //创建一个空数组
var value=[1,2,]; //不要这样!
var options=[,,,,,]; //不要这样!
像这种省略值的情况下,每一项都将获得undefined值。
与对象一样,在使用数组字面量表示法时,也不会调用Array构造函数。
* 数组的length属性
例: var colors=["red","blue","green"];
colors.length=2;
alert(colors[2]); //undefined
var colors=["red","blue","green"];
colors.length=4;
alert(colors[3]); //undefined
● 检测数组
instanceof 方法 问题在于它假定只有一个全局环境。
Array.isArray() 方法
if(Array.isArray(value)){
//执行操作
}
● 转换方法
例: var colors=["red","blue","green"];
alert(colors.toString()); //red,blue,green
alert(colors.valueOf()); //red,blue,green
alert(colors); //red,blue,green (由于alert要接收字符串参数,所以它会在后台调用toString()方法。
join 方法:
例: var colors=["red","green","blue"];
alert(colors.join("|||"));
alert(colors.join("||:").toString());
alert(colors.join('---').valueOf());
● 栈方法:
push() 接收任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度。
pop() 从数组末尾移除最后一项,减少数组的length值,然后返回移除的项。
● 队列方法:
shift() 移除数组中的第一项,并返回该项,同时将数组长度减一。
unshift() 在数组前端添加任意个项并返回新数组的长度。
● 重排序方法:
reverse() 反转数组项的顺序。
sort() 按升序方法排列数组项(字符串)
sort()方法可以接收一个比较函数作为参数,比较函数接收两个参数,如果第一个参数应该位于第二个参数之前则返回一个负数,否则返回正数,相等返回0.
例: function compare(value1,value2){
if(value1<value2){
return -1;
}else if(value1>value2){
return 1;
}else {
return 0;
}
}
或: function compare(value1,value2){
return value1-value2;
}
var values=[0,2,349,839];
values.sort(compare);
alert(values);
● 操作方法:
concat() 不影响原数组
例: var color1=["red"]; //red
var color2=color1.concat("blue",["green","black"]); //red,blue,green,black
slice() 不影响原数组
例: var abc=[1,2,3,4,5,6,7];
var def=abc.slice(2); //3,4,5,6,7
var def1=abc.slice(2,4); //3,4
splice()
1: 删除 2个参数: 要删除的第一项和项数。
2: 插入 3个或以上参数: 起始位置,0(删除的项数),要插入的项。 如果要插入多个,可以再传第4、第5.......以致任意多的项。
3: 替换 同理
splice() 方法始终返回一个数组,包含从原始数组中删除的项(如果没有删除任何项,则返回一个空数组)
● 位置方法:
indexOf() 从开头开始查找
lastIndexOf() 从末尾开始查找
都使用===全等操作符。没找到都返回-1。
例: var numbers=[1,2,3,4,5,6,7,8,9];
alert(number.indexOf(4)); //3
alert(number.lastIndexOf(4)); //5
● 迭代方法:
p 96
● 归并方法:
p 97
------------------------------------------------------------------------------------------------------------------------
◆ date类型:
var now=new date(); //在调用Date构造函数而不传递参数的情况下,新创建的对象自动获得当前时间。
p 98
------------------------------------------------------------------------------------------------------------------------
◆ RegExp类型:
g: 表示全局。
i: 不区分大小写。
m: 表示多行。
* 使用字面量模式:
var pattern1=/[bc]at/i; //匹配第一个"bat"或"cat",不区分大小写。
var pattern2=/\[bc\]at/i //匹配第一个"[bc]at",不区分大小写。
var pattern3=/.at/gi //匹配所有以"at"结尾的3个字符的组合,不区分大小写。
var pattern4=/\.at/gi //匹配所有".at",不区分大小写。
* 使用RegExp构造函数:
var pattern1=/[bc]at/i;
var pattern2=new Regexp("[bc]at","i"); //与pattern1相同。
由于RegExp构造函数的模式参数是字符串,所以在某些情况下要对字符进行双重转义。
所有的元字符都必须双重转义,那些已经转义过的字符也是如此。
小提醒:ECMAScript3中用字面量方法创建正则表达式始终共享一个字面量。在ECMAScript5中已经做出了修改。每次都创建一个新的RegExp实例。
● RegExp实例属性:
1: golbal: 布尔值,表示是否设置了 g 标志。
2: ignoreCase: 布尔值,表示是否设置了 i 标志。
3: lastIndex: 整数,表示开始搜索下一个匹配项的字符位置。
4: multiline: 布尔值,表示是否设置了 m 标志。
5: source: 字符串,返回字面量形式所使用的的字符串。
● RegExp实例方法:
exec();
test();
------------------------------------------------------------------------------------------------------------------------
◆ Function 类型:
函数实际上是对象,每个函数都是Function类型的实例。
函数名实际上是指向函数对象的指针,不会与某个函数绑定。
function sum(num1,num2){
return num1+num2;
}
var sum=function(num1,num2){
return num1+num2;
};
一个函数可以有多个名字:
function sum(num1,num2){
return num1+num2;
}
var anotherSum=sum; //两个指针指向同一个函数。
● 没有重载
● 函数声明与函数表达式
解析器在向执行环境加载数据的时候,会率先读取函数声明。
所以即使声明函数的代码在调用它的代码之后,JavaScript引擎也能把函数声明提升到顶部。
alert(sum(10,10));
function sum(num1,num2){
return num1+num2;
} //正确
alert(sum(10,10));
var sum=function(num1,num2){
return num1+num2;
} //错误,函数位于一个初始化语句中,而不是一个函数声明。
除了什么时候可以通过变量访问函数这一点区别之外,函数声明与函数表达式的语法其实是等价的。
● 函数内部属性:
callee 属性:指向拥有这个arguments对象的函数。 arguments.callee 相当于该函数名。
this 属性:当在网页的全局作用域中调用函数时,this对象引用的就是window
var color="red";
var o={color:"blue"};
function sayColor(){
alert(this.color);
}
sayColor(); //red
o.sayColor=sayColor;
o.sayColor(); //blue
函数的名字仅仅是一个包含指针的变量而已。因此即使是在不同的环境执行,全局的sayColor()函数与o.sayColor()指向的仍然是同一个函数。
● 函数的属性和方法:
length 属性 表示函数希望接收的命名参数的个数。
call apply 属性。
apply(在其中运行函数的作用域,参数数组);
call(在其中运行函数的作用域,参数);
事实上,传递参数并非apply() 和 call() 真正的用武之地,它们真正强大的地方是能够扩充函数赖以运行的作用域。
例: window.color="red";
var o={color:"blue"};
function sayColor(){
alert(this.color);
}
sayColor(); //red
sayColor.call(this); //red
sayColor.call(window); //red
sayColor.call(o); //blue
使用call()(或apply())来扩充作用域最大的好处,就是对象不需要与方法有任何的耦合关系。
bind() 属性:这个方法会创建一个函数的实例,其this值会被绑定到传给bind()函数的值。
window.color="red";
var o={color:"blue"};
function sayColor(){
alert(this.color);
}
var objectSayColor=sayColor.bind(o);
objectSayColor(); //blue
------------------------------------------------------------------------------------------------------------------------
◆ 基本包装类型:
基本类型值不是对象,因而从逻辑上讲它们不应该有方法(尽管如我们所愿,它们确实有方法)
var a="abcdefg";
var b=a.substring(2);
alert(b); //cdefg
alert(a); //abcdefg
var c=a.color="red";
alert(c); //red
alert(a.color); //undefined
引用类型和基本包装类型的主要区别就是对象的生存周期。自动Duang简单基本包装类型的对象,只存在于代码执行的一瞬间,然后立即被销毁。
对基本包装类型的实例调用typeof会返回"object"。
Object构造函数也会根据传入的值返回相应基本包装类型的实例
var obj=new Object("some test");
alert(typeof obj); //object
var obj=new Object("25");
alert(typeof Number); //function
var obj=new Object(true);
alert(typeof Boolean); //function
建议永远不要使用boolean对象。
● Number类型:
1:
var num=10;
alert(num.toString()); //"10"
alert(num.toString(2)); //"1010"
alert(num.toString(8)); //"12"
alert(num.toString(10)); //"10"
alert(num.toString(16)); //"a"
2:
var num=10;
alert(num.toFixed(2)); //"10.00"
如果小于实际小数位的话,不同浏览器有不同舍入方法。
3:
var num=10;
alert(num.toExpoential(1)); //"1.0e+1"
4:
var num=99;
alert(num.toPrecision(1)); //"1e+2"
alert(num.toPrecision(2)); //"99"
alert(num.toPrecision(3)); //"99.0"
toPrecision()方法会根据要处理的数值决定到底是调用toFix()还是调用toExponential()。
不建议直接实例化Number类型。
● String类型:
1: 字符方法:charAt() charCodeAt()
var a="abcdefg"
alert(a.charAt(4)); //"e" 位置1处是e
alert(a.charCodeAt(4)); //"101" ASCII码
2: 字符串操作方法
var a="lll";
a.concat("abc","de"); //"lllabcde"
slice()
substring()
substr()
----------------------------------------------------------------------------------------------------------------------
◆ 单体内置对象
ECMA-262对内置对象的定义是:“由ECMAScript提供,不依赖于宿主环境的对象,这些对象在ECMAScript程序执行之前就已经存在了。”
意思就是说,开发人员不必显示的实例化内置对象,因为它们已经实例化了。前面我们已经介绍了大多数内置对象,例如Object、Array和String。
ECMA-262还定义了两个单体内置对象:Global和math。
eval() 方法
ECMAScript虽然没有指出如何直接访问Global对象,但web浏览器都是将这个全局对象作为window对象的一部分加以实现的。
因此,在全局作用域中声明的所有变量和函数,就都成为了window对象的属性。
Math 对象
p134