JavaScript高级程序设计学习笔记第五章--引用类型

时间:2022-09-12 13:16:59

一、object类型

1.创建object类型的两种方式:

第一种,使用构造函数

 var person = new Object();或者是var person={};/与new Object()等价
person.name = "Nicholas";
person.age = 29;

第二种,对象字面量表示

 var person={
name:"Tom", age:29
};
 var person = {
"name" : "Nicholas",
"age" : 29,
5 : true
};

p.s 字面量表示法需要注意的几个问题:

  • 每个属性后面用逗号分隔
  • 最后一个属性后面没有逗号
  • 底下的花括号后面有分号
  • 属性也可以使用字符串

2.访问对象属性的两种方式:

第一种:点表示法(建议使用)

alert(person.name); //"Nicholas"

第二种:方括号表示法,方括号内部为字符串

alert(person["name"]); //"Nicholas"

方括号表示法的优点:

  • 可以通过变量来访问属性
     var propertyName = "name";
    alert(person[propertyName]); //"Nicholas"
  • 属性名中包含会导致语法错误的字符,或者属性名使用的是关键字或保留字,也可以使用方括号表示法。
    person["first name"] = "Nicholas";

二、Array类型

与其他语言的数组不同之处:

  • 数组的每一项可以保存任何类型的数据。
  • ECMAScript 数组的大小是可以动态调整的,即可以随着数据的添加自动增长以容纳新增数据,类似于java中的集合

1.创建Array的基本方式:两种

第一种:使用Array的构造函数

var colors = new Array();//不知道数组长度的时候
var colors = new Array(20);//知道数组长度的时候
var colors = new Array("red", "blue", "green");//直接向数组传递;包含的项
var colors = Array(3);//也可以省略new操作符

第二种:数组字面量表示法,数组字面量由一对包含数组项的方括号表示,多个数组项之间以逗号隔开,字面量可以为空,就是创建了一个空数组

var colors = ["red", "blue", "green"];//这里是方括号,构造函数是圆括号
var colors=[];//应该与new Array()作用一样,但是与Object一样,使用字面量的时候不会调用构造函数

2.读取和设置数组的值得方法:要使用方括号并提供相应值的基于 0 的数字索引

 var colors = ["red", "blue", "green"]; // 定义一个字符串数组
alert(colors[0]); // 显示第一项
colors[2] = "black"; // 修改第三项
colors[3] = "brown"; // 新增第四项

3.数组的长度:length属性,通过设置这个属性,可以从数组的末尾移除项或向数组中添加新项。
移除最后一项:将length设置为length-1,移除的那一项是undefined

添加新项:通过数组名设置数组的第length项的内容

例如:

var colors = ["red", "blue", "green"];
//移除数组的最后一项
colors.length = 2;
alert(colors[2]); //undefined
//添加新项
colors[colors.length] = "black"; //(在位置 3)添加一种颜色

4.检测数组:有两种方式

  • 假定只有一个全局环境的情况下,使用instanceof 操作符就可以了
  •  if (value instanceof Array){
    //对数组执行某些操作
    }
  • 有多个全局环境的时候ECMAScript 5 新增了 Array.isArray()方法。这个方法的目的是最终确定某个值到底是不是数组,而不管它是在哪个全局执行环境中创建的。
  •  if (Array.isArray(value)){
    //对数组执行某些操作
    }

5.数组转换

常用的转换方式有:所有对象都具有 toLocaleString()、 toString()和 valueOf()方法。

三者的区别:

toString()对数组中的每一项调用其toString()方法,然后以逗号为分隔符返回拼接好的字符串

valueOf()方法返回的数组

toLocaleString()方法返回的也是拼接好的字符串,不过是对数组中的每一项调用toLocalString()方法返回拼接而成,以逗号为分隔符

验证toString()、valueOf()一个小实验如下:

 function test(){
var colors = ["red", "blue", "green"];
if( "string"==typeof (colors.toString())) {
console.log("string");
}else{
console.log("not string");
}
if((colors.valueOf()) instanceof Array){
console.log("array");
}else{
console.log("not array");
}
}
test();

输出结果如下:

JavaScript高级程序设计学习笔记第五章--引用类型

默认情况下都是以逗号进行分割,如果想要改变符号,可以用join()函数,该函数接受一个参数,就是分割的字符串。如果不给 join()方法传入任何值,或者给它传入 undefined,则使用逗号作为分隔符。

如果数组中的某一项的值是 null 或者 undefined,那么该值在 join()、toLocaleString()、 toString()和 valueOf()方法返回的结果中以空字符串表示。

6.栈方法:数组表现的像栈一样

栈的特点:

  • 先进后出
  • 操作的部位在栈的顶部,即数组的末尾

两个操作实现栈:

  • push()方法:在原数组上操作
    • 接受参数:任意数量
    • 功能:将参数逐个添加在数组的末尾
    • 返回:修改后数组的长度
  • pop()方法:从数组末尾移除最后一项,减少数组的 length 值,然后返回移除的项。
    • 接受参数:无
    • 功能:将数组末尾的一个参数移除
    • 返回:移除的项

7.队方法:队列的特点(后进先出),列表末端添加项,前端删除项

两个实现队列的操作:

  • push()方法:与队列相同
  • shift()方法:在原数组上操作
    • 接受参数:无
    • 功能:将数组的第一项移除,并将长度减1
    • 返回:返回被移除的项
  • unshift()方法:在原数组操作
    • 接受参数:任意数量的参数
    • 功能:在数组前端添加任意个项
    • 返回:数组的长度
    • var colors = new Array(); //创建一个数组
      var count = colors.unshift("red", "green"); //推入两项
      alert(count); //
      alert(colors);//red,green

四中排列方法如下图显示

JavaScript高级程序设计学习笔记第五章--引用类型

8.重排序方法:

  • reverse()方法:反转数组项的顺序,返回经过排列之后的数组
  • sort()方法:默认按升序排列数组项,sort()方法会调用每个数组项的 toString()转型方法,然后比较得到的字符串,以确定如何排序。即使数组中的每一项都是数值, sort()方法比较的也是字符串,返回经过排列之后的数组
     var values = [0, 1, 5, 10, 15];
    values.sort();
    alert(values); //0,1,10,15,5,因为数值 5 虽然小于 10,但在进行字符串比较时, "10"则位于"5"的前面,于是数组的顺序就被修改了。
  • 比较数值的大小的方法:
  •  function compare(value1, value2) {
    if (value1 < value2) {
    return -1;
    } else if (value1 > value2) {
    return 1;
    } else {
    return 0;
    }
    } var values = [0, 1, 5, 10, 15];
    values.sort(compare);
    alert(values); //0,1,5,10,15

9.操作方法:

  • concat()--连接:基于当前数组中的所有项创建一个新数组。具体来说,这个方法会先创建当前数组一个副本,然后将接收到的参数添加到这个副本的末尾,最后返回新构建的数组。举例:
  •  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
  • slice()--截取:基于当前数组中的一或多个项创建一个新数组。slice()方法可以接受一或两个参数,即要返回项的起始和结束位置。在只有一个参数的情况下, slice()方法返回从该参数指定位置开始到当前数组末尾的所有项。如果有两个参数,该方法返回起始和结束位置之间的项——但不包括结束位置的项。注意, slice()方法不会影响原始数组。举
    例:
  • var colors = ["red", "green", "blue", "yellow", "purple"];
    var colors2 = colors.slice(1);
    var colors3 = colors.slice(1,4);
    alert(colors2); //green,blue,yellow,purple
    alert(colors3); //green,blue,yellow
    alert(colors);//red,green,blue,yellow,purple
  • splice()--插入:会修改原数组
    • 删除:可以删除任意数量的项,只需指定 2 个参数:要删除的第一项的位置和要删除的项数。例如, splice(0,2)会删除数组中的前两项。
    • 插入:可以向指定位置插入任意数量的项,只需提供 3 个参数:起始位置、 0(要删除的项数)和要插入的项。如果要插入多个项,可以再传入第四、第五,以至任意多个项。
    • 替换:可以向指定位置插入任意数量的项,且同时删除任意数量的项,只需指定 3 个参数:起始位置、要删除的项数和要插入的任意数量的项。插入的项数不必与删除的项数相等。例如,splice (2,1,"red","green")会删除当前数组位置 2 的项,然后再从位置 2 开始插入字符串"red"和"green"。
       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"); // 从位置 1 开始插入两项
      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,返回的数组中只包含一项

10.位置方法:

  • indexOf():从头查找
    • 接受参数:要查找的项和(可选的)表示查找起点位置的索引
    • 返回:查找的元素的位置
  • lastIndexOf():从尾部查找
    • 接受参数:要查找的项和(可选的)表示查找起点位置的索引
    • 返回:要查找元素的位置(从头的位置)

11.迭代方法:ECMAScript 5 为数组定义了 5 个迭代方法。每个方法都接收两个参数:要在每一项上运行的函数和(可选的)运行该函数的作用域对象——影响 this 的值。传入这些方法中的函数会接收三个参数:数组项的值、该项在数组中的位置和数组对象本身。以上方法都不会修改数组中的包含的值。

  • every():对数组中的每一项运行给定函数,如果该函数对每一项都返回 true,则返回 true。
  •  var numbers = [1,2,3,4,5,4,3,2,1];
    var everyResult = numbers.every(function(item, index, array){
    return (item > 2);
    });
    alert(everyResult); //false
  • some():对数组中的每一项运行给定函数,如果该函数对任一项返回 true,则返回 true。
  • var numbers = [1,2,3,4,5,4,3,2,1];
    var someResult = numbers.some(function(item, index, array){
    return (item > 2);
    });
    alert(someResult); //true
  • filter():对数组中的每一项运行给定函数,返回该函数会返回 true 的项组成的数组。
  •  var numbers = [1,2,3,4,5,4,3,2,1];
    var filterResult = numbers.filter(function(item, index, array){
    return (item > 2);
    });
    alert(filterResult); //[3,4,5,4,3]
  • map():对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组。
  •  var numbers = [1,2,3,4,5,4,3,2,1];
    var mapResult = numbers.map(function(item, index, array){
    return item * 2;
    });
    alert(mapResult); //[2,4,6,8,10,8,6,4,2]
  • forEach():对数组中的每一项运行给定函数。这个方法没有返回值。
  • var numbers = [1,2,3,4,5,4,3,2,1];
    numbers.forEach(function(item, index, array){
    //执行某些操作
    });

12.归并方法:reduce()和 reduceRight()。这两个方法都会迭代数组的所有项,然后构建一个最终返回的值。其中, reduce()方法从数组的第一项开始,逐个遍历到最后。而 reduceRight()则从数组的最后一项开始,向前遍历到第一项。

这两个方法都接收两个参数:一个在每一项上调用的函数和(可选的)作为归并基础的初始值。传给 reduce()和 reduceRight()的函数接收 4 个参数:前一个值、当前值、项的索引和数组对象。这个函数返回的任何值都会作为第一个参数自动传给下一项。第一次迭代发生在数组的第二项上,因此第一个参数是数组的第一项,第二个参数就是数组的第二项。
举例:

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

13.在以上这些方法中,没有影响到原数组的有:concat,slice,every,some,filter,map,forEach,indexOf,lastIndexOf(),reduce()和 reduceRight()。

14.归并方法与迭代方法的区别:归并方法对数组中每一项能够处理,并构建一个最终的返回值。迭代方法能够选择对数组中的某些项进行处理,并最终返回数组或者布尔值。

二、Date类型

1、Date类型使用自 UTC(Coordinated Universal Time,国际协调时间) 1970 年 1 月 1 日午夜(零时)开始经过的毫秒数来保存日期。
2.创建Date对象:

  • 不传入对象:var now = new Date();
  • 传入参数对象:必须传入表示该日期的毫秒数(即从 UTC 时间 1970 年 1 月 1 日午夜起至该日期止经过的毫秒数)。为了简化这一计算过程, ECMAScript 提供了两个方法: 
    • Date.parse():接收一个表示日期的字符串参数,然后尝试根据这个字符串返回相应日期的毫秒数。
      • ECMA-262 没有定义 Date.parse()应该支持哪种日期格式,因此这个方法的行为因实现而异,而且通常是因地区而异。
      • var someDate = new Date("May 25, 2004")在后台调用Date.parse(),等价于var someDate = new Date(Date.parse("May 25, 2004"));
    • Date.UTC():同样也返回表示日期的毫秒数,但它与 Date.parse()在构建值时使用不同的信
      息。 Date.UTC()的参数分别是年份、基于 0 的月份(一月是 0,二月是 1,以此类推)、月中的哪一天
      (1 到 31)、小时数(0 到 23)、分钟、秒以及毫秒数。在这些参数中,只有前两个参数(年和月)是必
      需的。如果没有提供月中的天数,则假设天数为 1;如果省略其他参数,则统统假设为 0。
      • var y2k = new Date(2000, 0);等价于var y2k = new Date(Date.UTC(2000, 0));,在后台调用Date.UTC(),不过不是基于GMT时间,而是基于本地时区时间

3.获取当前时间:Date.now()

4.继承的方法:Date 类型的 toLocaleString()方法会按照与浏览器设置的地区相适应的格式返回日期和时间。这大致意味着时间格式中会包含 AM 或 PM,但不会包含时区信息(当然,具体的格式会因浏览器而异)。而 toString()方法则通常返回带有时区信息的日期和时间,其中时间一般以军用时间(即小时的范围是 0 到 23)表示。Date 类型的 valueOf()方法,则根本不返回字符串,而是返回日期的毫秒表示。
5.日期格式化的方法:专门用于将日期格式化为字符串的方法

  • toDateString()——以特定于实现的格式显示星期几、月、日和年
  • toTimeString()——以特定于实现的格式显示时、分、秒和时区
  • toLocaleDateString()——以特定于地区的格式显示星期几、月、日和年
  • toLocaleTimeString()——以特定于实现的格式显示时、分、秒
  • toUTCString()——以特定于实现的格式完整的 UTC 日期

6.时间组件的方法

三、RegExp类型

1.创建正则表达式:var expression = / pattern / flags ;

pattern代表了表达式部分

flags有几下几种可以选择的情况:

  • g:表示全局(global)模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止;
  • i:表示不区分大小写(case-insensitive)模式,即在确定匹配项时忽略模式与字符串的大小写;
  • m:表示多行(multiline)模式,即在到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项。

或者使用正则表达式的构造函数:var pattern2 = new RegExp("[bc]at", "i");

要注意的是,传递给 RegExp 构造函数的两个参数都是字符串(不能把正则表达式字面量传递给 RegExp 构造函数)。由于 RegExp 构造
函数的模式参数是字符串,所以在某些情况下要对字符进行双重转义。所有元字符都必须双重转义,

2.模式中使用的所有元字符都必须转义,在元字符前面加上转义字符\,元字符有:( [ { \ ^ $ | ) ? * + .]}

3.正则表达式字面量始终会共享同一个 RegExp 实例,而使用构造函数创建的每一个新 RegExp 实例都是一个新实例。

4.属性:

  • global:布尔值,表示是否设置了 g 标志。
  • ignoreCase:布尔值,表示是否设置了 i 标志。
  • multiline:布尔值,表示是否设置了 m 标志。
  • lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从 0 算起。
  • source:正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回。

5.实例方法:

  • exec():该方法是专门为捕获组而设计的。
    • 接受一个参数,即要应用模式的字符串,然后返回包含第一个匹配项信息的数组,或者在没有匹配项的情况下返回 null。
    • 返回的数组虽然是 Array 的实例,但包含两个额外的属性: index 和 input。其中, index 表示匹配项在字符串中的位置,而 input 表示应用正则表达式的字符串。在数组中,第一项是与整个模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串(如果模式中没有捕获组,则该数组只包含一项)。
  • test():接受一个字符串参数。在模式与该参数匹配的情况下返回true;否则,返回 false。在只想知道目标字符串与某个模式是否匹配,但不需要知道其文本内容的
    情况下,使用这个方法非常方便。
  • 继承的 toLocaleString()和 toString()方法都会返回正则表达式的字面量,与创建正则表达式的方式无关。

6.构造函数属性:

  • input:$_ 最近一次要匹配的字符串。 Opera未实现此属性
  • lastMatch:$& 最近一次的匹配项。 Opera未实现此属性
  • lastParen :$+ 最近一次匹配的捕获组。 Opera未实现此属性
  • leftContext:$` input字符串中lastMatch之前的文本
  • multiline :$* 布尔值,表示是否所有表达式都使用多行模式。 IE和Opera未实现此属性
  • rightContext :$' Input字符串中lastMatch之后的文本

JavaScript高级程序设计学习笔记第五章--引用类型的更多相关文章

  1. JavaScript高级程序设计学习笔记第五章--引用类型&lpar;函数部分)

    四.Function类型: 1.函数定义的方法: 函数声明:function sum (num1, num2) {return num1 + num2;} 函数表达式:var sum = functi ...

  2. JavaScript高级程序设计学习笔记第三章--基本概念

    一.标识符: 1.区分大小写 2.命名规则: 第一个字符必须是一个字母.下划线(_)或一个美元符号($) 其他字符可以是字母.下划线.美元符号或数字 标识符中的字母也可以包含扩展的 ASCII 或 U ...

  3. JavaScript高级程序设计学习笔记第十三章--事件

    事件冒泡: IE 的事件流,事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档).例如: <!DOCTYPE html> <htm ...

  4. JavaScript高级程序设计学习笔记第六章--面向对象程序设计

    1.ECMAScript没有类的概念,ECMA-262 把对象定义为:“无序属性的集合,其属性可以包含基本值.对象或者函数.”,有点类似于散列表 2.ECMAScript 中有两种属性:数据属性和访问 ...

  5. JavaScript高级程序设计学习笔记第四章--变量、作用域和内存问题

    1.变量可能包含两种不同数据类型的值:基本类型值和引用类型值. 基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象. 2.变量复制 如果从一个变量向另一个变量复制基本类型的值,会在 ...

  6. JavaScript高级程序设计---学习笔记(五)

    1.2D上下文 1)填充与描边 填充和描边的两个操作取决于两个属性:fillStyle和strokeStyle.两个属性的值可以是字符串.渐变对象或模式对象,默认值都是#000000 例: html: ...

  7. JavaScript高级程序设计学习笔记第十一章--DOM扩展

    1.对 DOM 的两个主要的扩展是 Selectors API(选择符 API)和 HTML5 2.Selectors API Level 1 的核心是两个方法: querySelector()和 q ...

  8. JavaScript高级程序设计---学习笔记(一)

    今天,2017.3.17开始利用课余时间仔细学习<JavaScript高级程序设计>,将需要掌握的知识点记录下来,争取把书里的所有代码敲一遍并掌握. 1.标识符命名最好是第一个字母小写,剩 ...

  9. javascript高级程序设计学习笔记

    javascript高级程序设计,当枕头书已经好久了~zz  现在觉得自己在js的开发上遇到了一些瓶颈,归根究底还是基础太薄弱,所以重新刷一遍js高程希望有更新的认识. 一.javascript简介 ...

随机推荐

  1. &lbrack;python实现设计模式&rsqb;-1&period; 单例模式

    设计模式中,最简单的一个就是 “单例模式”, 那么首先,就实现一下单例模式. 那么根据个人的理解,很快就写出第一版. # -*- coding: utf-8 -*- class Singleton(o ...

  2. 滚动监听(bootstrap)

    1.05 腊八节   一直都想知道滚动监听是怎么做出来的,今天终于扒拉出来了,在使用的时候只要加上div定位就可以了... <head> <link rel="styles ...

  3. Hadoop1&period;0&period;3集成eclipse开发

    本文来自:http://www.ilablog.org/%E7%BC%96%E8%AF%91hadoop-eclipse%E6%8F%92%E4%BB%B6/ 本人由于工作原因目前没有亲自尝试,那位尝 ...

  4. Centos6&period;7 安装ReviewBoard2&period;5&period;7 问题记录

    pip install ReviewBoard 1.修改pip源,默认源网络不畅 pip install -i http://pypi.douban.com/simple simplejson 2.p ...

  5. cocos2d-x 新建项目 Cannot open include file&colon; &OpenCurlyQuote;cocos2d&period;h’

    新建cocos2d-x 项目分这么几步. 1. 下载最新的cocos2d-x 2. 安装 vs2010 3. 解压cocos2d-x 压缩包,并双击"install-templates-ms ...

  6. C&num;:委托(delegate)和事件&lpar;event&rpar; &lpar;转&rpar;

    委托(delegate): 它是C#语言里面的函数指针,代表可以指向某一个函数,在运行的时候调用这个函数的实现.下面来看看它的实现步骤: 声明一个delegate对象. 实现和delegate具有相同 ...

  7. 谈一谈synchronized关键词

    1.使用 java中的每一个对象都可以作为synchronized的锁进行代码同步,常见的形式 同步代码块锁是synchronized括号内的对象 普通成员方法上,锁是当前的对象,synchroniz ...

  8. python -yield理解

    参考:https://foofish.net/iterators-vs-generators.html 从网上看到一个面试题,求最后的输出结果: def add(n, i): return n+ide ...

  9. centos7搭建kibana

    上一节elasticsearch搭建地址 https://www.cnblogs.com/mutong1228/p/10181544.html 学习了上一篇的搭建,理解了命令的含义之后,本节就非常方便 ...

  10. JVM基础学习之类的加载、链接和初始化

    本文我们一起讨论Java类的加载.链接和初始化. Java字节代码的表现形式是字节数组(byte[]),而Java类在JVM中的表现形式是 java.lang.Class类 的对象.一个Java类从字 ...