JavaScript高级程序设计-第三版(引用类型)

五、引用类型

5.1 object类型

  • 定义object类型
    • 构造函数
    • 对象字面量
             是向函数传递大量可选参数的首选方式
      • 创建时不会调用构造函数
      • 属性名可以使用字符串,数值属性名会自动转换为字符串
      • var person ={} 相当于 var person =new Object()
  • 访问对象中的属性
    • 点表示法
    • 方括号+属性名字符串
      • 属性名可以是变量
      • 属性名中可以包含非字母、非数字
//构造函数
var person=new Object();
person.name="Nicholas";
person.age=29;
//对象字面量
var person={
	name:"Nicholas", 
	"age":29,
	5:true
};
//传递可选参数
displayInfo({name:"Nicholas",age:"29"});
displayInfo({name:"Nicholas"});
//属性名为变量
var propertyName="name";
alert(person[propertyName]);

5.2 Array类型

  • 数组每一项可以独立保存任意类型的数据
  • 定义数组
    • 构造函数
      • var array=new Array( value1,value2 ,value3 );
      • var array = new Array(3);
      • new可以省略
    • 数组字面量
      • var array=[ value1,value2 ,value3 ];
  • 可以动态调整数组长度
    • var array[array.length] = valueN; 在数组末尾追加数据
  • length属性可写
    • array.length=array.length-1; 去除数组末尾元素

5.2.1 检测数组

  • instanceof
    • 多个框架可能存在多个不同版本的Array构造函数
  • Array.isArray()
    • ECMAScript 5新增
    • 解决多个框架间各自不同的实现方式的数组的判断

5.2.2 转换方法

  • toString()
    • 调用数组内部的每个元素的toString() 方法,并用逗号整体拼接成一个字符串
  • valueOf()
    • 返回原数组
  • toLocaleString()
    • 用数组内部的每个元素的toLocaleString() 方法,并用逗号整体拼接成一个字符串
  • join()
    • toString() 类似
    • 可接收一个参数,用来设定拼接时用的分隔符
  • 数组中的null、undefined在数组调用toString()、toLocaleString()、join() 方法返回的结果中以空字符串表示

5.2.3 栈方法

       提供了让数组的行为类似于其他数据结构的方法

  • push()
    • 接收任意数量的参数并返回最终的数组长度
    • 在数组尾部增加元素
  • pop()
    • 返回出栈的数据
    • 删除尾部元素

5.2.3 队列方法

  • 数组前端作为出口
    • push()
    • shift()
      • 删除数组中的第一个元素,并返回该项
  • 数组后端作为出口
    • unshift()
      • 将参数整体插入数组前端位置,参数在数组中的排序与参数自身的排序相同
      • 返回新数组的长度
    • pop()

5.2.4 重排序方法

  • reverse()
    • 反转数组项的顺序,不会重排列
    • 直接改变原数组
  • sort()
    • 直接改变原数组
    • 默认将数据项转化为string进行字符串比较排序,从小到大
    • 可接收比较函数作为参数
function compare(value1,value2){
		if(value1>value2){
			return 1;
		}else if(value1<value2){
			return -1;
		}else{
			return 0;
		}
	}
var array=[0,10,5,15,1];
array.sort(compare);
alert(array);//0,1,5,10,15

5.2.5 操作方法

  • concat()
    • 产生一个原数组的副本,拼接,返回新数组
  • slice( startIndex, endIndex )
    • 提取指定序号以及指定序号范围的数据项生成新数组,序号范围为 [ start, end )
    • 若参数中包含负数,则加上数组长度之后再确定序号
  • splice( startIndex, delItemCount, InsetData )
    • 参数
      • 起始位置
      • 要删除的项的数量
      • 要插入的数据
        • 插入的数据占据输入的起始位置
    • 返回值
      • 删除、插入的数据组成的新数组

5.2.7 位置方法

  • indexOf()
    • 参数
      • 要查找的项
      • 查找的起始位置
    • 返回索引值,没找到返回-1
    • 全等比较
  • lastIndexOf()
    • 参数
      • 要查找的项
      • 查找的起始位置
               最后一项记为0

5.2.8 迭代方法

  • 接收参数
    • 在每一项上运行的函数
      • 数组项的值item
      • 该项在数组中的位置index
      • 数组对象本身array
    • 运行该函数的作用域对象
  • 方法
    • every()
             函数执行结果都返回true,则返回true
    • filter()
             返回函数执行结果返回true的数据项组成的数组
    • forEach()
             只进行操作,没有返回值
    • map()
             返回每次函数调用的结果组成的数组
    • some()
             函数执行结果有一项返回true,则返回true
var array=[1,2,3,4,5];
array.forEach(function(item,index){
	alert(item);
});

5.2.9 缩小方法

  • 参数
    • 在每一项上调用的函数
      • 参数
        • 前一项的值
        • 当前项的值
        • 当前项的索引
        • 数组对象
      • 函数返回结果会作为函数的接收参数的第一项进行传递
    • 作为缩小基础的初始值
  • reduce()
  • reduceRight()
           从数组最后一项向前遍历
var array=[1,2,3,4,5];
var sum = array.reduce(function(prev,cur,index,array){
	return prev+cur;
});
alert(sum);//15

5.3 Date类型

       使用自1970年1月1日0时经过的毫秒数来表示日期

  • 创建Date类型
    • new Date()
      • 默认为当前时间对应的Date对象
      • 可接收特定日期和时间的毫秒值作为参数
        • 若参数为字符串,自动调用Date.parse()
        • 若参数为两个以上的数字,自动调用Date.UTC()
  • 将日期转化为毫秒值
    • Date.parse()
             按字符串进行转化
    • Date.UTC()
             按数字进行转换,即年、月(从0开始)[、日、时、分、秒、毫秒]
  • Date.now()
    • 当前时间的毫秒值
    • 与 +new Date() 效果相同,一元加操作符调用Number() 方法,Date类型对象触发valueOf()

5.3.1 继承的方法

  • toLocaleString()
    • 返回字符串
  • toString()
    • 返回字符串
  • valueOf()
    • 返回日期的毫秒值

5.3.2 日期格式化方法

  • 星期、月、日、年组成的字符串
    • toDateString()
    • toLocaleDateString()
  • 时、分、秒和时区组成的字符串
    • toTimeString()
    • toLocaleTimeString()
  • 完整UTC日期的字符串
    • toUTCString()

5.3.3 日期/时间组件方法

  • 获取和设置特定数值
    • 日期的毫秒值
      • getTime() 类似valueOf()
    • 月份中的天数
      • getDate()
    • 星期
      • getDay()
    • 毫秒

5.4 RegExp类型

  • 定义方式
    • 字面量形式
      • var expression=/ pattern / flags
        • pattern
                 正则表达式
          • 模式中使用的所有元字符都必须转义
            • ( [ { \ ^ $ |) ? * + . ] }
        • flags
          • g 对所有字符串进行匹配,而非在发现第一个匹配项时立即停止
          • i 不区分大小写
          • m 在到达一行文本末尾还会继续查找下一行
      • 在ECMAScript 3中共用同一个实例,之前的查找进度等状态也会保持
      • ECMAScript 5每次都创建新实例
    • 构造函数
      • 接收参数
        • 匹配的字符串模式
                 所有的元字符都必须双重转义,即 \\ 表示 \
        • flags字符串
      • 每次创建RegExp新实例

5.4.1 RegExp实例属性

       通过访问实例的下列属性,可以获得有关模式的各种信息

  • global
           是否设置g标志
  • ignoreCase
  • lastIndex
           开始搜索下一个匹配项的字符位置,即最后一次匹配项的位置之后开始,从0算起
  • multiline
  • source
           按字面量形式的pattern返回字符串

5.4.2 RegExp实例方法

  • exec()
    • 输入参数
             要进行检索的字符串
    • 返回值
             返回第一个匹配项信息的数组
      • Array类型
        • 第一项 与整个模式匹配的字符串
        • 其他项 与模式中的捕获组匹配的字符串
        • 额外属性
          数组具有两个额外属性
          • index 匹配项所在字符串中的位置
          • input 应用正则表达式的字符串
    • flags
             若使用global设置,则接着上一次的匹配进度继续匹配,lastIndex属性会增加,否则不增加
  • test()
           判断是否匹配
  • toString()、toLocaleString()返回正则表达式字面量的字符串
  • valueOf()返回正则表达式本身

5.4.3 RegExp构造函数属性

       通过构造函数名称调用的属性,类似于静态属性,适用于作用域中的所有正则表达式,且基于所执行的最后一次正则表达式操作而变化

  • 可使用长属性名和短属性名进行访问
长属性名短属性名说明
RegExp.inputRegExp.$_最近一次要匹配的字符串
RegExp.lastMatchRegExp["$&"]最近一次匹配的项
RegExp.lastParenRegExp["$+"]最近一次匹配的捕获组
RegExp.leftContextRegExp["$`"]input字符串中lastMatch之前的文本
RegExp.multilineRegExp["$*"]是否所有表达式都使用多行模式
RegExp.rightContextRegExp["$‘"]input字符串中lastMatch之后的文本
  • RegExp.$1
           第一个匹配的捕获组

5.4.4 模式的局限性

  • 缺少某些语言所支持的高级正则表达式特性

5.5 Function类型

  • 函数是对象,函数名是指向函数的指针
  • 函数的定义方式
    • 函数声明
    • 函数表达式
    • 构造函数
      • 最后一个参数看作函数体,前面的看作函数的参数
var sum = new Function("num1","num2","return num1+num2");

5.5.1 没有重载(深入理解)

  • 函数名对应的内存空间被重新写入新的值,指向了另一个函数对象

5.5.2 函数声明和函数表达式

  • 函数声明
           解析器率先读取函数声明,并使其在执行任何代码之前可用
function sum(num1,num2){
	return num1+num2;
}
  • 函数表达式
           只有在执行到它所在的代码行才会被解释执行
var sum=function (num1,num2){
	return num1+num2;
};

5.5.3 作为值的函数

  • 将函数作为参数传递给另一个函数
  • 将函数作为返回值
           例如,通过属性创建数组的比较函数,即以某个属性作为对象数组的比较依据
function callSomeFunction(someFunction,someArgument){
	return someFunction(someArgument);
}
function add10(num){
	return num+10;
}
var result1=callSomeFunction(add10,20);//30

function getGreeting(name){
	return "Hello,"+name;
}
var result2=callSomeFunction(getGreeting,"Nicholas");//"Hello,Nicholas"
//根据指定的属性名进行排序,返回实现该功能的函数
function createComparisonFunction(propertyName){
	return function(object1,object2){
		var value1=object1[propertyName];
		var value2=object1[propertyName];
		if(value1<value2){
			return -1;
		}else if(value1>value2){
			return 1;
		}else{
			return 0;
		}
	};
}

5.5.4 函数内部属性

  • arguments
    • callee
             返回指针,该指针指向拥有这个arguments对象的函数,使函数名与函数的执行解耦
      • 严格模式下会报错
    • caller
      • 在ECMAScript 5中定义
      • 严格模式下会报错
      • 非严格模式下始终未undefined
  • this
           返回函数据以执行的环境对象,即当在全局环境中调用函数时,则this指向全局环境,若函数为对象的一个方法,调用该方法时,this指向该对象
  • 函数实例的属性caller
           返回调用函数的函数的引用,在ECMAScript 5中规定
    • 全局作用域中调用函数则返回null
    • 严格模式下,不能为caller赋值
function factorial(num){
	if(num<=1){
		return 1;
	}else{
		//return factorial(num-1);
		//使函数名与函数的执行解耦
		return arguments.callee(num-1);
	}
}
window.color="red";
var o={ color :"blue"};
function sayColor(){
	alert(this.color);
}
sayColor();//"red"
o.sayColor=sayColor;
o.sayColor();//"blue"

5.5.5 函数属性和方法

  • 属性
    • length
             表示函数希望接收的命名参数的个数
    • prototype
             保存实例方法,例如toString()、valueOf()等,在ECMAScript 5中不可枚举
  • 方法
           非继承而来的方法,作用是将方法和对象解耦
    • 设置作用域并在作用域中调用函数,实际上等于设置函数体内的this对象的值
      • 严格模式下,未指定环境对象而调用函数,this值将是undefined
        • 指定环境对象的方式
          • 添加到某个对象
          • apply()或者call()
      • apply()
        • 指定的作用域
        • 参数数组
          • Array实例
          • arguments对象
      • call()
        • 指定的作用域
        • 逐个参数
      • bind()
        • 设置作用域并返回一个新的函数实例,ECMAScript 5中定义的
window.color="red";
var o={ color :"blue"};
function sayColor(){
	alert(this.color);
}
sayColor();//"red"
//o.sayColor=sayColor;
//不需要将方法与对象绑定
sayColor.call(this);//"red"
sayColor.apply(o);//"blue"
var objectSayColor=sayColor.bind(o);
objectSayColor();//"blue"
  • 继承方法
    • toStrring()
    • toLocaleString()
    • valueOf()
    • 以上方法的作用是返回函数代码

5.6 基本包装类型

       引用类型:Boolean、Number和String

  • 引用类型提供了相应值类型的便捷方法
  • 基本类型变量在调用方法时,会自动创建一个相应的引用类型的实例,调用完方法后该实例会被销毁
  • Object构造方法能根据传入值的类型返回相应的基本包装类型的实例
  • 尽量不要显式使用引用类型

5.6.1 Boolean类型

  • valueOf() 返回boolean
  • toString()toLocaleString() 返回 “true”“false” 字符串

5.6.2 Number类型

  • valueOf() 返回数字
  • toString()toLocaleString() 返回字符串
  • 数值格式化为字符串
    • toFixed()
             按照指定的小数位数返回数值的字符串表示,四舍五入
    • toExponential()
             返回以指数表示法表示的数值的字符串形式,可指定小数位数
    • toPrecision()
             得到表示某个数值的最合适的格式,可指定数值的所有数字的个数

5.6.3 String类型

  • length属性返回字符数量
  • valueOf()、toString()、toLocaleString() 返回字符串

5.6.3.1 字符方法

  • charAt() 返回给定位置的字符
  • charCodeAt() 返回给定位置的字符编码
  • 索引器 [ ]
    • ECMAScript 5中定义

5.6.3.2 字符串操作方法

  • concat() 拼接多个字符串
  • 基于子字符串创建新字符串
    • slice( startIndex, endIndex)
      • 所有负值会自动加上字符串长度
    • substr( startIndex, charCount )
      • 第一个参数若为负值,则加上字符串长度
      • 第二个参数为字符个数,若为负值,则转化为0
    • substring( startIndex, endIndex )
      • 将所有负值转化为0
      • 参数中较小的值作为起始位置,较大的值作为结束位置

5.6.3.3 字符串位置方法

  • indexOf( text [,startIndex] )
  • lastIndexOf( text [,startIndex] )

5.6.3.4 trim()方法

5.6.3.5 字符串大小写转换方法

  • toUpperCase()
  • toLocaleUpperCase()
  • toLowerCase()
  • toLocaleLowerCase()

5.6.3.6 字符串的模式匹配方法

  • match()
    • 接收正则表达式或者Regx类型对象
    • 与调用Regx实例的exec()方法相同
      • 返回Array对象
        • 两个额外属性
  • search()
    • 接收正则表达式或者单纯的字符串
    • 返回匹配项的索引
  • replace()
    • 参数
      • 正则表达式或者单纯的字符串
        • 正则表达式可以实现全部替换,即使用g设置
        • 字符串
      • 字符串或者函数
        • 字符串
          • 可结合特殊的字符序列,将正则表达式的操作结果插入到结果字符串中
          • 类似字符串插值
        • 函数
          • 参数
            • 匹配项 match
            • 匹配项在字符串中的位置 pos
            • 原始字符串 originalText
          • 返回要替换匹配项的字符串
  • split()
    • 参数
      • 字符串或正则表达式
      • 指定返回的数组的大小

5.6.3.7 localeCompare()方法

       按字母表中的顺序对字符串的顺序进行比较,比参数大则返回正数

  • 大小写字母的顺序按地区语言决定

5.6.3.8 fromCharCode()方法

       静态方法,将字符编码转换为字符串

5.6.3.9 HTML方法

  • 快捷生成HTML的方法,例如anchor(name);

5.7 单体内置对象

  • 由ECMAScript实现提供的、不依赖于宿主环境的对象,这些对象在ECMAScript程序执行之前就已经存在了

5.7.1 Global对象

       不属于任何其他对象的属性和方法,都是Global对象的属性和方法

5.7.1.1 URI编码方法
  • 编码
    • encodeURI()
             不会对本身属于URI的特殊字符进行编码,如冒号、正斜杠、问号和井字号
    • encodeURIComponent()
             所有非标准字符,通常在对附加在现有URI后面的字符串使用
  • 解码
    • decodeURI()
    • decodeURIComponent()
      • 所有特殊字符
5.7.1.2 eval()方法
  • 将字符串解析为javascript脚本代码
  • eval()中执行的代码具有与eval()的执行环境相同的作用域链
    • 在严格模式下,外部访问不到eval()中创建的任何变量或函数
  • 在eval()中创建的任何变量或函数都不会被提升,这些变量或函数只在eval()执行时创建
5.7.1.3 Global对象的属性
  • undefined、NaN、Infinity等
  • 所有原生引用类型的构造函数
5.7.1.4 window
  • 获取Global对象的方式
    • ECMAScript未明确指出如何访问Global对象,但Web浏览器都将其作为window对象的一部分
    • var global = function(){ return this; }();

5.7.2 Math对象

5.7.2.1 Math对象的属性
  • Math.PI等
5.7.2.2 min()和max()方法
  • 接收任意多个数值参数
  • 处理数组
    • Math.max.apply( Math, array)
5.7.2.3 舍入方法
  • Math.ceil()
  • Math.floor()
  • Math.round()
5.7.2.4 random()方法
  • 返回介于0和1之间的一个随机数,不包括0和1
  • 从某个整数范围内随机选择一个值
    • Math.floor( Math.random * 可能值的总数 + 第一个可能的值 )
      • 2到10
        • Math.floor( Math.random * 9 + 2 )
5.7.2.5 其他方法
  • Math.sin(x)等
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值