第五章(引用类型)

◆  ●


引用类型:引用类型是一种数据结构,用于将数据和功能组织在一起。它也常被称为类,但这种称呼并不妥当。它们不是相同的概念。




◆  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







































































































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值