JavaScript高级程序设计读书笔记 第五章 引用类型

引用类型是一种数据结构,用于将数据和功能组织在一起,将其称之为类却并不妥当,因为它不具备传统面向对象所支持的累和接口等基本结构。

5.1 Object类型

两种创建方式

var person = new Object();
person.name="jack";
person.age=18;
var anotherPerson = {
    name:"jack",
    age:22
}

通过字面量定义对象时实际不会调用Object对象。
除了通过点语法,也可以使用方括号访问属性。

alert(anotherPerson["name"]);

5.2 Array类型

js中的数组中的每一项可以是任何类型的数据。

var colors= new Array("blue","red");
var persons = new Array(3);//如果参数是一个数值,那么会创建给定项数的数组,这里创建了长度为3的数组

数组的length属性不是只读的,通过设置这个属性可以给数组的末尾添加和移除元素。如果将length属性设置大于数组项数的值,则新增项被设为undefined。

alert(Array.isArray(persons));//检测变量是不是Array

调用toString方法会返回由数组中每个值的字符串形式拼接而成的一个以逗号分隔的字符串。实际是调用数组每一项的toString方法,而toLocaleString方法实际是调用数组每一项的toLocaleString方法

alert(colors.toString());

join方法可以使用不同的分隔符来构建字符串。

alert(colors.join('--'))

调用valueOf方法返回数组。

栈方法
push方法接受任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度,而pop方法移除数组最后一项,并返回该项。

队列方法
shift能够移除数组的第一个项并返回该项,同时将数组长度减1。
unshift能够在数组前端添加任意个项并返回新数组的长度并返回新数组的长度。

重排序方法
reverse 反转数组项的顺序
sort 调用每个项的toString方法,得到字符串然后排序,即使每一项都是数值,sort比较的也是字符串。
sort方法可以接受一个比较参数。比较函数接受两个参数,如果第一个参数在前面,应该返回负数。相等返回0,反之返回正数。

var values=[0,12,2,23,44,5];
function compare(pre,next){
    return pre-next;
}
alert(values.sort(compare));

操作方法
contact方法创建原数组的副本,然后接收到的参数添加到这个副本的末尾,最后返回新创建的数组。

alert(colors.concat("green"));

slice 一个参数,返回从参数指定位置开始到数组末尾的新数组,两个参数,返回从开始位置到结束位置之间的项,但不包括结束位置。

var values=[0,12,2,23,44,5];
alert(values.slice(1));//12 2 23 44 5
alert(values.slice(1,3));//12 2 23

如果slice方法的参数中有一个负数,则用数组长度加上该数来确定位置。

splice方法

  • 删除,指定两个参数,要删除的第一项的位置和要删除的项数。

  • 插入,三个参数,起始位置,0,要插入的项

  • 替换,三个参数,起始位置,要删除的项数,和要插入的任意数量的项。插入的项数和删除的项数不必相等。

    var values=[0,12,2,23,44,5];
    values.splice(2,1,13,14);//0 12 13 14 23 44 5
    alert(values);
    

位置方法
indexOf lastIndexOf(从后向前找)查找给定项在数组中的位置
还可以接受一个可选参数,表示要开始找的位置

values.splice(4,0,12);//0 12 13 14 12 23 44 5
alert(values.indexOf(12));//1
alert(values.indexOf(12,3));//4

迭代方法

  • every 对数组每一项运行给定方法,每一项都是true则返回true
  • filter 对数组每一项运行给定方法,返回true项组成的数组
  • map 对数组每一项运行给定方法,返回函数操作结果组成的数组
  • forEach 对数组每一项运行给定方法,不返回结果。
  • some 对数组每一项运行给定方法,有一项是true则返回true

归并方法
reduce reduceRight 迭代数组的所有项,构建一个最终的返回值。reduce 从头开始 reduceRight从数组末尾开始。
这两个方法接受两个两个参数:一个在每一项上调用的函数,和作为归并基础的初始值。调用的函数接受4个参数:前一个值,当前值,项的索引和数组对象。这个函数的返回值会作为第一个参数传给下一项。

var numbers=[1,2,3,4,5];
var sum=numbers.reduce(function(pre,cur,index,array){
    return pre+=cur;
})
alert(sum);

5.3 Date类型

var now= new Date();
alert(now);//Mon Aug 01 2016 11:36:11 GMT+0800 (CST)

var someDate=new Date("8/1/2016");
alert(someDate);//Mon Aug 01 2016 11:39:23 GMT+0800 (CST)

var date2 = new Date(Date.UTC(2016,7,1,11,41));
alert(date2);

5.4 RegExp类型

var expressions = /pattern/flags;
pattern表示正则表达式,flags标志正则表达式的行为。

  • g 全局模式,应用与所有字符串,而非发现第一个匹配项立即停止。

  • i 不区分大小写模式

  • m 多行模式 到达一行末尾时还会继续查找下一行。
    还可以使用RegExp构造函数:

    var pattern3=/.at/gi;
    var pattern2= new RegExp(".at");
    

5中规定,字面量和构造函数一样,每次都创建新的RegExp实例。
exec()接受要应用的模式的字符串,返回包含第一个匹配项信息的数组;没有返回null。数组里还有两个额外的属性:index和input index表示匹配项在字符串的位置,input表示应用正则表达式的字符串。
exex()即使设置了g,每次也只会返回一个匹配项。
test() 有匹配返回true。

5.5 Function

函数实际上是对象,每个函数都是Function类型的实例
两种方式

  function sum(number1,number2){
    return number1+number2;
  }//函数声明 推荐
  var sum=function(number1,number2){
    return number1+number2;
  }//函数表达式

解析器在向执行环境加载数据时,会率先读取函数声明,并使其在执行任何代码之前可访问。函数表达式则必须等到解析器执行到它所在的行,才会真正被执行。
即使声明函数的代码在调用之后,它也能被提升到顶部。
函数内部有两个特殊的对象,arguments和this,arguments有一个callee的属性,指向拥有这个arguments的函数。

  function factorial(num){
    if(num<1){
        return 1
    }else{
        return num*arguments.callee(num-1);
    }
  }

this引用的是函数据以执行的环境对象。
caller保存着调用当前函数的函数的引用。
对于引用类型而言,prototype是保存它们所有实例方法的真正所在。
每个函数都包含两个非继承而来的方法,apply和call。
apply接收两个参数,一是在其中运行函数的作用域,另一个是参数数组。call类似,第二个参数数组里的参数必须逐个列举出来。
apply和call真正强大的方法是能够扩充函数赖以运行的作用域。

  window.color="red";
  var o={color:"blue"};
  function sayColor(){
    alert(this.color);
  }
  sayColor();//red
  sayColor.apply(o)//blue

bind 创建一个函数实例,其this值会被绑定到bind的参数。

5.6 基本包装类型

Boolean Number String
每当读取一个基本类型的值的时候,后台就会创建一个对应的基本包装类型的对象。

 var s1="hello";
 var s2=s1.toLocaleUpperCase();//创建实例 调用实例方法 销毁实例

var num=10;
alert(num.toFixed(2));//10.00 按照指定的小数位返回数值的字符串表示

String

字符方法

alert(name.charAt(1));//a
alert(name.charCodeAt(1));//97
alert(name[1]);//a

字符串操作方法
slice substring substr 这三个方法都会返回一个新的字符串,第一个参数代表起始位置,第二个参数不传默认到结尾,传的话slice和substring是结束位置的后一个位置,substr是返回的字符串长度。

alert(name.slice(2));//jackson
alert(name.substring(2));//jackson
alert(name.substr(2));//jackson

alert(name.slice(2,3));//c
alert(name.substring(2,3));//c
alert(name.substr(2,3));//cks

位置方法

alert(name.indexOf("k"));//3
alert(name.lastIndexOf("c"))//2
alert(name.indexOf("x"))//-1  找不到返回-1

trim 创建个新串,删除前面和后面的空格。

大小写转换
toLocaleUpperCase toLocaleLowerCase

alert(name.toLocaleUpperCase())//JACKSON

字符串的模式匹配

var matches=content.match(pattern);
alert(matches.index);
alert(matches[0]);
alert(content.search(matches));//返回字符串中第一个匹配项的索引,没有返回-1

替换字符串
replace方法 第一个参数是reg对象或者字符串,第二个参数是一个字符串或者函数,如果第一个参数是字符串,只会替换第一个子字符串,如果想替换所有,就要提供正则表达式,并且指定g。

alert(content.replace("at","ad"));//cad,bat,sat,fat
alert(content.replace(/at/g,"ad"));//cad,bad,sad,fad

5.7 单体内置对象

Global 不属于任何其他对象的属性和方法,最终都是它的属性和方法。所有在全局作用域中定义的属性和函数,都是Global对象的属性。
encodeURI encodeURIComponent 对URI进行编码以便发送给浏览器。
eval方法接受一个字符串,即要执行的js代码。
Math对象

var max=Math.max(3,71,22,14);
var max=Math.min(3,71,22,14);
var values=[22,1,44,5];
var max=Math.max.apply(Math,values);
alert(Math.ceil(25.9));//向上
alert(Math.round(25.9));//四舍五入
alert(Math.floor(25.1));//向下

值=Math.floor(Math.random()*可能值的总数+第一个可能的值)

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

推荐阅读更多精彩内容