第五章 引用类型

引用类型的值(对象)是引用类型的一个实例。在ECMScript中,引用类型是一种数据结构,用于将数据和功能组织在一起,旦它不具备传统的面向对象语言所支持的类和接口等基本结构。引用类型有时候也被称为对象定义,因为他们描述的是一类对象所具有的属性和方法。

5.1 Object类型

创建Object实例的方式有两种。
第一种使用new操作符和Object()构造函数。
<pre>
var person = new Object();
person.name = "zhang";
person.age = "22";
</pre>

第二种使用对象字面量的表示法。
<pre>
var person = {
name:"zhang",
age:"22"
};
</pre>

使用方括号表示法访问对象的属性。方括号语法的主要优点是可以通过变量来访问属性,例如:
<pre>
var propertyName = "name";
alert(person[propertyName]);
</pre>

如果属性名中包含导致语法错误的字符,或者属性名使用的是关键字或保留字,也可以使用方括号表示法。
通常,除非必须使用变量来访问属性,否则我们建议使用点表示法。

5.2 Array类型

创建数组的方法有两种。第一种使用构造函数。
<pre>
var colors = new Array();
</pre>

第二种是使用数组字面量表示法。
<pre>
var colors = ["red","blue"];
var colors1 = [1,2,];//不要这样创建,这样会创建一个包含2或3项的数组。
</pre>

数组的length属性很有特点,它不是只读的,通过设置这个属性,可以从数组的末尾移除项或向数组中添加新项。
<pre>
var colors = ["red","blue","green"];
colors.length = 2;
alert(clolrs[2]);//undefined
colors[colors.length] = "black";//在位置2添加了一种颜色
</pre>

转换方法

数组的toString()方法会返回有数组的每个值得字符串形式凭借而成的一个一逗号分隔的字符串。为了创建这个字符串会调用数组每一项的toString()方法
调用valueOf()返回的还是数组。
<pre>
var person1 = {
toString:function(){
return "tostring1";
},
valueOf:function(){
return "valueOf1";
},
toLocaleString:function(){
return "toLocaleString1";
}
}
var person2 = {
toString:function(){
return "tostring2";
},
valueOf:function(){
return "valueOf1";
},
toLocaleString:function(){
return "toLocaleString1";
}
}
var colors = [person1,person2];
console.log(colors.toString());
console.log(colors.toLocaleString());
console.log(colors);
console.log(colors.valueOf());
console.log(colors.join("||"));
</pre>

join()方法只接收一个参数,即用作分隔胡的字符串,然后返回包含所有数组项的字符串。

栈方法

栈是一种后进先出的数据结构。
push()方法可以接收任意数量的参数,吧他们逐个添加到数组末尾,并返回修改后数组的长度,pop()方法则从数组末尾移除最后一项,减少数组的length值,然后返回移除的项。

队列方法

队列数据结构的访问规则是先进先出。
push()方法和shift()方法,移除队列的第一项并返回该项,同时将数组长度减1.

反队列方法

和队列方法相反的规则,数组的前端添加项,从数组的末端移除项
<pre>
var colors = new Array();
var count = colors.unshift("red","green");
alert(count);//2
var item = colors.pop();
alert(item);//"green"
alert(colors.length);//1
</pre>

重排序方法

reverse()和sort()方法;sort()方法会调用每个数组项的toString()转型方法,然后比较得到的字符串,以确定如何排序。
关于sort()函数的一些资料如下:
http://www.cnblogs.com/520yang/articles/4382688.html

操作方法

concat()方法
<pre>
var colors = ["red","green","blue"];
var colors2 = colors.concat("yellow",["black","brown"]);
alert(colors);//red,green,blue
alert(colors2);//red,green,blue,yellow,black,brown
</pre>

slice()方法
<pre>
var num = [1,2,3,4,5];
var num1 = num.slice(1);
var num2 = num.slice(1,4);

alert(num1);//2,3,4,5
alert(num2);//2,3,4
console.log(num1);//[2,3,4,5]
</pre>

splice()方法始终返回一个数组,该数组中包含从原始数组中删除的项(如果没有删除任何项,则返回一个空数组)
<pre>
var colors = ["red","green","blue"];
var removed = colors.splice(0,1);//删除第一项
alert(colors);//green,blue
alert(removed);//red,返回的数组中只包含一项

removed = colors.splice(1,0,"yellow","orange");
alert(colors);//green,yellow,orange,blue
alert(removed);//返回的是一个空数组

removed = colors.splice(1,1,"red","purple");
alert(colors);//green,red,purple,orange,blue
alert(removed);//yellow,返回的数组中只包含一项
</pre>

位置方法

indexOf()和lastIndexOf(),这两个方法都接受两个参数:要查找的项和(可选的)表示查找七点位置的索引。这两个方法都返回要查找的项在数组中的位置,或者在没找到的情况下返回-1.要求查找的项必须严格相等。

迭代方法

五个迭代方法,每个方法都接受两个参数:要在每一项上运行的函数和(可选的)运行该函数的作用域的对象——影响this的值;
传入这些方法中的函数会接受三个参数:数组项的值、该项在数组中的位置和数组对象本身,根据使用的方法不同,这个函数执行后的返回值可能会也可能不会影响方法的返回值。
every():对数组中的每一项运行给定函数,如果该函数对每一项都返回true,则返回true。
<pre>
var numbers = [1,2,3,4,5,4,3,2,1];
var result = number.every(function(item,index,array){
return (item>2);
});
alert(result);//false
</pre>

some()方法只要传入的函数对数组中的某一项返回true,就会返回true。

filter()函数
<pre>
var numbers = [1,2,3,4,5,4,3,2,1];
var result = numbers.filter(function(item,index,array){
return (item>2);
});
alert(result);//[3,4,5,4,3]
</pre>

map()函数,返回一个数组,而这个数组的每一项都是在原始数组中的对应项上运行传入函数的结果。例如,可以给数组中的每一项乘以2,然后返回这些乘积组成的数组。
<pre>
var numbers = [1,2,3,4,5,4,3,2,1];
var result = numbers.map(function(item,index,array){
return item * 2;
});
alert(result);//[2,4,6,8,10,8,6,4,2]
</pre>

forEach()方法,对数组的每一项运行传入的函数。这个方法没有返回值,本质和使用for循环迭代数组一样。
<pre>
var numbers = [1,2,3,4,5,4,3,2,1];
numbers.forEach(function(item,index,array){
//执行某些操作
});
</pre>

归并方法

reduce()和reduceRight().这两个方法都会迭代数组的所有项,然后构建一个最终返回的值。这两个方法都接受两个参数:一个在每一项上调用的函数和(可选的)作为归并基础的初始值。传给的函数接收四个参数:前一个值、当前值、项的索引和数组对象。这个函数返回的任何职都会作为第一个参数自动传给下一项。第一次迭代发生在数组的第二项上,因此第一个参数是数组的第一项,第二个参数是数组的第二项。
<pre>
var values = [1,2,3,4,5];
var sum = values.reduce(function(prev,cur,index,array){
return prev + cur;
});
alert(sum);//15
</pre>

5.5 Function类型

函数实际上是对象。每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法。由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定。

定义函数的方法:

<pre>
function sum(num1,num2){
rerurn num1 + num2;
};
</pre>

<pre>
var sum = function(num1,num2){
return num1 + num2;
};
</pre>

<pre>
var sum = new Function("num1","num2","return num1 + num2");//不推荐
</pre>

5.5.1 没有重载

5.5.2 函数声明和函数表达式

解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问);至于函数表达式,则必须等到解析器执行到他所在的代码行,才会被真正解释执行。
<pre>
alert(sum(10,10));//发生错误,“unexpected identifier”(意外标识符)错误
var sum = function(num1,num2){
return num1 + num2;
};
</pre>

5.5.3 作为值的函数

不仅可以像传递参数一样把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回。
<pre>
function callSomeFunction(someFunction,someArgument){
return someFunction(someArgument);
};
function add(num){
return num + 1;
};
var result = callSomeFunction(add,10);
alert(result);//20
</pre>

可以从一个函数中返回另一个函数,而且这也是很有用的一种技术。
<pre>
function createComparisonFunction(propertyName){
return function(object1,object2){
var value1 = object1[propertyName];
var value2 = object2[propertyName];

    if(value1<value2){
        return -1;
    }else if(value1>value2){
        return 1;
    }else{
        return 0;
    }
}

}
</pre>

5.5.4 函数内部属性

5.5.5 函数属性和方法

每个函数有两个属性,length和prototype。其中,length属性表示函数希望接收的命名参数的个数
<pre>
function sayName(name){
alert(name);
}
alert(sayName.length);//1
</pre>

prototype属性是不可枚举的,因此使用for-in无法发现。

每个函数都包含两个非继承而来的方法:apply()和call()。
<pre>
function sum(num1,num2){
return num1 + num2;
}
function callSum1(num1,num2){
return sum.apply(this,arguments);
}
function callSum2(num1,num2){
return sum.call(this,num1,num2);
}
alert(callSum1(10,10));//20
alert(callSum2(10,10));//20
</pre>

传递参数并非apply()和call()真正的用武之地,他们真正强大的地方是能够扩充函数赖与运行的作用域。
<pre>
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
</pre>

使用call()或apply()来扩充作用域的好处,就是对象不需要与方法有任何耦合关系。

ECMAScript 5还定义了一个方法:bind()。这个方法会创建一个函数的实例,其this值会被绑定到传给bind()函数的值。
<pre>
window.color = "red";
var o = {
color:"blue"
};
function sayColor(){
alert(this.color);
}
var objectSayColor = sayColor.bind(o);
objectSayColor();//blue
</pre>

5.6 基本包装类型

5.7 单体内置对象

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 引用类型的值时引用类型的一个实例。在ECMAScript中,引用类型是一种数据结构,用于将数据和功能组织在一起。有...
    cooore阅读 276评论 0 1
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,204评论 0 4
  • 引用类型是一种数据结构,用于将数据和功能组织在一起,将其称之为类却并不妥当,因为它不具备传统面向对象所支持的累和接...
    QJK阅读 279评论 0 0
  • 本章内容 使用对象 创建并操作数组 理解基本的 JavaScript 类型 使用基本类型和基本包装类型 引用类型的...
    闷油瓶小张阅读 674评论 0 0
  • 【寒风 微微雨】文摄:雨轩 窗外 寒风 微微雨, 熟悉的蓝色机身 枣红风衣的空姐 换一座城 从温度 气度 到风度,...
    赵林雨轩阅读 99评论 0 0