03.第5章:引用类型

1.Object类型

1)创建Object实例的方式:

  • 使用字面量创建
let myinstance={name:'abc',age:20}
  • 使用Object创建
let myinstance2=new Object({name:'abc',age:21})
  • 使用构造函数创建
function Person(name,age)
{
    this.name=name;
    this.age=age;
}
let p=new Person('abc','20');
  • 使用Object.create创建
let o={name:'abc',age:'20'};
let o2=Object.create(o);

2.Array类型

和其他语言相同点:都是有序列表
不同点:可以保存不同的类型
ES数组大小可以动态调整。

  • 创建数组
    var colors=new Array();
    //传入数字,会构建大小为20的数组
    var colors=new Array(20);
    //直接传递要包含的项
    var colors=new Array(“red”,"blue","green");
    可以省略new
    var colors=Array();
    var colors=Array(20);
    var colors=Array(“red”,"blue","green");

使用数组字面量表示法:
var colors=["red","blue","green"];
//创建一个空数组
var name=[];


  • 读取数组值
    alert(colors[0]);
    colors[2] = "black";
  • 利用length属性可以删除元素和添加元素


length属性设置为2,会移除最后一项

length值大于数组项的值,为定义的对应索引项为undefined


中间位置3到位置98都是不存在的,所以都是undefined

1)检测数组

  • 方法一:
    if(value instanceof Array){
    }
    instanceof操作符的问题在于,它假定单一的全局执行环境。
    如果网页中包含多个框架,就会存在两个以上不同全局执行环境。
  • 方法二:
    if(Array.isArray(value)){
    }
    这个方法解决了上述问题,能够确定某个值到底是不是数组,而不管它是在哪个全局执行环境中创建的

2)转换方法

toString(),toLocaleString(),valueOf()方法,join()方法

    let arr=[[1,2],[2,3],[3,4]];
    console.log(arr.toString());//转换成1,2,2,3,3,4
    console.log(arr.valueOf()); //转出来还是数组
    console.log(arr.join('||'));//1,2||2,3||3,4

3)push(),pop(),shift(),unshift()

/*栈方法*/
    let arr5=[1,2,3];
    arr5.push(4);
    console.log(arr5);//[1,2,3,4]
    arr5.pop();
    console.log(arr5);//[1,2,3]
    arr5.unshift(0);
    console.log(arr5);//[0,1,2,3]
    arr5.shift();
    console.log(arr5);//[1,2,3]

4)重排序方法

reverse()和sort()

  /*逆序*/
    let arr5=[1,2,3];
    arr5.reverse();
    console.log(arr5);//[3,2,1]

sort()方法会调用每个数组项的toString()方法,即使数组中每一项都是数值,它比较的都是字符串。


sort

sort方法为了解决如上问题,它能够接收一个比较函数作为参数。

/*sort排序*/
    let arr3=[1,3,2,5,4];
    let sortArr=arr3.sort((a,b)=>{
        //从小到大
        return a-b;
        //从大到小
        //return b-a;

    });
    console.log(sortArr);

5)操作方法

  • concat()方法
    没有传递参数,就会复制当前数组并返回给副本。
    如果传递给concat()方法的是一个或多个数组,则该方法会将这些数组中每一项添加到结果数组中。
    如果传递的值不是数组,这些值会被简单的添加到结果数组的末尾。
/*数组操作的方法*/
    let arr6=arr5.concat();//[3,2,1]
    console.log(arr6);
    arr6=arr5.concat([1,2,3]);//[3,2,1,1,2,3]
    console.log(arr6);
  • slice()方法
    能够接收一个或两个参数,截取数组。slice()方法不会影响原始数组。包括左边不包括右边
arr6=arr5.slice(0,1);//arr5=[3,2,1]
    console.log(arr6);//[3]
  • splice方法
    删除:splice(0,2)指定两个参数,起始位置和要删除的项数。
    插入替换:splice(2,0,“red”,“green”),指定3个参数,起始位置、要删除的项数、要插入的项。会从当前数组的位置2插入字符串。
    splice()方法始终都会返回一个数组,该数组中包含了从原始数组中删除的项。


7)位置方法

  • indexOf(),lastIndexOf()
    两个参数:要查找的项,查找的起始索引位置(可选)
    indexOf()从位置0或者索引参数开始向后查找。
    lastIndexOf()从数组的末尾开始向前查找。



8)迭代方法

  • foreach
/*数组遍历*/
    let arr=['a','b','c'];
    arr.forEach((item,index)=>{
        console.log(index,item);
    })
  • every
/*判断所有元素都符合条件*/
    let arr2=[1,2,3];
    let result=arr2.every((item,index)=>{
        if(item<4)
            return true;
    });
    console.log(result);
  • some
let arr2=[1,2,3];
/*只要有一个元素满足条件*/
    let result2=arr2.some((item,index)=>{
        if(item<2)
            return true;
    });
    console.log(result2);
  • sort
 /*sort排序*/
    let arr3=[1,3,2,5,4];
    let sortArr=arr3.sort((a,b)=>{
        //从小到大
        return a-b;
        //从大到小
        //return b-a;

    });
    console.log(sortArr);
  • map
   let arr2=[1,2,3];  /*map对元素重新组合*/
    let maparr=arr2.map((item,index)=>{
        return "<b>"+item+"<b>"
    });
    console.log(maparr);
  • filter过滤
    let arr3=[1,3,2,5,4]; /*filter过滤*/
    let filarr=arr3.filter((item,index)=>{
        if(item>=3)
            return true;
    });
    console.log(filarr);

9)缩小方法

四个参数:前一项值,当前值,索引,数组

  • reduce()从数组的第一项开始,遍历到最后



    第一次:prev=1,cur=2
    第二次:prev=3(1+2),cur=3
    ...

  • reduceRight()从数组的最后一项开始,遍历到第一项


3.Date类型

var now=new Date();//不传参数会自动获取当前时间
根据特定的时间获取Date变量
var someDate=new Date(Date.parse("May 25,2004 "));
var someDate=new Date("May 25,2004 ");//传递字符串会默认调用Date.parse().
//2005年5月5日下午17点55分55秒
var someDate=new Date(Date.UTC(2005,4,5,17,55,55))
ES5添加了Date.now()方法


4.RegExp类型(来支持正则表达式)


flags包括3个标志:
g:全局模式
i:不区分大小写
m:多行模式
//匹配字符串中所有bat或cat
var pattern1=/[bc]at/i;
var pattern1=new RegExp("[bc]at","i");

1)RegExp实例方法
  • exec();
    接收一个参数,要应用模式的字符串,然后返回包含第一个匹配信息的数组。还包含两个额外的属性:index,input。



    对于exec()方法而言,每次只会返回一个匹配项。在没有设置全局变量的情况下,在同一个字符串上多次调用exec()将始终返回第一个匹配项。在设置全局变量的情况下,每次调用exec()方法则会在字符串中继续查找新的匹配项。



  • test()方法
    接收一个字符串参数,在模式与该参数匹配的情况下返回true;否则返回false。


3)正则表达式
  • 【abc】:方括号表示查找任何在方括号内的字符
返回符合a-h的数组

【0-9】查找任何从0至9的数字
【a-z】查找从小写a到小写z的字符
【A-Z】查找从大写A到大写Z的字符
【^abc】查找任何不在方括号内的字符
|:表示或


.匹配代表任意字符 /h.t/


  • \w查找字符(字母、数字、下划线)



    \W查找非字符
    \d查找数字
    \D查找非数字字符
    \s查找空白字符
    \S查找非空白字符
    \b匹配单词边界
    \B匹配非单词边界


  • p* 模式p的0或多次出现
    p+ 模式p的1或多次出现
    p? 模式p的0或1次出现


  • p{n} 模式p正好n次出现
    p{n,}模式p至少n次出现
    p{n,m}模式p出现次数位于n和m间(不包括m)


    正则表达式网站:
    www.w3cfuns.com

5.Function类型

ES中每个函数都是Function类型的实例,而且与其他引用类型一样具有属性和方法。函数名实际上是一个指向函数对象的指针。



函数名仅仅是指向函数的指针:


1)没有重载

2)函数声明与函数表达式

在代码开始执行之前,解释器通过一个名为函数声明提升的过程,读取并将函数声明添加到执行环境中。
函数表达式,则必须等到解释器执行到它所在的代码行才会被解释执行。


函数声明:能够正确运行

函数表达式:执行出错

3)作为值的函数

因为函数名本身就是变量,所以函数也可以作为值来使用。也就是说可以像传递参数一样把一个函数传递给另一个函数,也可以将一个函数作为另一个函数的返回值。


函数作为参数传递

函数作为返回值返回

4)函数的内部属性

在函数内部有两个特殊的对象:

  • arguments
    它是一个类数组对象,包含传入函数中的所有参数。
    虽然arguments的主要用途是保存函数参数,但这个对象还有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。


    阶乘

    阶乘改写后不存在函数名耦合

  • this,表示当前执行的环境对象(当在全局作用域中调用函数时,this对象的引用就是window)



  • caller



    以上函数回显示调用inner函数(也就是outer()函数)的源代码


    改进耦合

    注意:当函数在严格模式下,访问arguments.callee会导致错误。
    也不能为函数的caller属性赋值。

5)函数的属性和方法

每个函数包括两个属性:length和prototype
length:表示函数希望接收的命令参数的个数。


  • prototype属性:保存所有引用类型的实例方法(具体下一章介绍)
    重要

每个函数包含两个非继承方法apply()和call()。这两个方法的用途都是在特定的作用域中调用函数。

  • apply()方法接收两个参数:一个是运行函数的作用域,一个是参数数组


  • call()方法与apply()方法作用相同,区别仅在于接收参数的方式不同


  • call()方法和apply()方法真正的用武之地是在扩充函数作用域



  • bind()方法



  • call、apply和bind的区别

bind返回的是对应的函数,用于稍后调用; call、apply是立即调用。
call传参时,第一个参数是运行函数的作用域,后面的参数依次列开。
apply传参时,第一个参数是运行函数的作用域,后面的参数是数组。

  • 使用call和apply实现bind
Function.prototype.bind=function(context){
     //这里的this其实是当调用bind方法时的函数实例
     var self=this;
      args=Array.prototype.slice.call(arguments);
      return function(){
       return self.apply(context,args.slice(1));
    }
}

6.基本的包装类型

1)Boolean类型

Boolean类型是与布尔值对应的引用类型。创建Boolean对象:

  • 前三行代码创建了一个Boolean对象falseObject,在布尔运算时,所有的对象都会被转换成true,这里是对falseObject而不是对它的值(false)进行求值。所以结果为true

2)Number类型

Number是与数字值对应的引用类型。

let num=10;
  • toString()方法 参数可以用来表示是几进制
 <script>
        let num=100200030040505;

        console.log(num.toString());
        console.log(num.toString(2));
    </script>
  • toFixed()方法:将数值格式化为指定小数的字符串。
let num=100.005;
console.log(num.toFixed(2));//能够自动四舍五入100.00
  • toExponential():指数表示法


3)String类型

let s='abc';
let s='abc';
console.log(s.length);//3

方法

  • 字符方法:
    charAt():根据索引获取字符串中的字符
    charCodeAt():根据索引获取字符串的字符的编码
    ES5中可以使用[ index]来访问特定字符
let s='abc';
console.log(s.length);//3
console.log(s.charAt(1));//b
  • 字符串操作方法(并不会改变原字符串)
    concat()方法:拼接字符串
let s1=s.concat('bcd');
console.log(s1);//abcbcd

substr()、slice()、substring()
当传入的参数是负数的时候,substr()、slice()会从最后往前数,substring会返回0

console.log(s1.substr(-1));//s.length-1
console.log(s1.slice(-1));//s.length-1
console.log(s1.substring(-1));//0
  • splite方法(将字符串按照一定条件分割成数组)
/*字符串转数组*/
       let s1='abcdbd';
        let arr=s1.split('');
        console.log(arr);
  • trim()方法:
 /*去掉空格*/
        let s2=' 你好 ';
        console.log(s2.trim());
  • 字符串位置方法
    indexOf(),lastIndexOf(),返回字符串的索引


  • 字符串的模式匹配方法
    match()

 let matches=text.match(/.at/);
console.log(matches.index);//返回索引 0
console.log(matches[0]);//返回第一个元素 //cat

search():返回字符串中第一个匹配项的索引,没找到就返回-1

 /*返回第一个匹配项的索引*/
        let pos=text.search(/at/);//1
        console.log(pos);
  • replace()方法
    如果第一个参数是字符串,那么只会替换第一个。
    如果要替换所有的字符串,需要提供一个正则表达式,并指定全局标志。
 /*字符串替换*/
        let text='cat,bat,sat,fat';
        //只会替换第一个
        let result=text.replace('at','ond');
        console.log(result);


        //要替换所有字符,需要正则表达式
        result=text.replace(/at/g,'ond');
        console.log(result);

7.单体内置对象

1)Global对象

2)Math对象

  • min()和max()


  • 舍入方法



  • random()方法
    返回介于0到1之间的一个随机数,不包括0和1


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

推荐阅读更多精彩内容