《JavaScript高级程序设计》总结 第五章 引用类型

引用类型是一种数据结构,它表示了一种抽象的集合。实例化就后即为对象。


引用类型(或者理解为类)----------(实例化)----------->对象


在javascript中,引用类型都是Object类型的实例。


-创建一个对象(Object实例)的方法有两种。

1)用new的一个Object类型的方式,如:

	var obj = new Object()

2)对象字面量

	var obj = {
		name:'John',
		age:'25'
	}
	var obj2 = {}

-两种调用的方法:

	console.log(obj.name)//John
	console.log(obj['name'])


-Array类型

Array类型用来创建数组,数组的每一项都可以存放任何类型的数据,数组的长度可以动态调整。

创建数组的方法有:

1)由Array类型构建

	var colors = new Array()
	var colors = new Array(20)//创建长度为20的数组
	var colors = new Array('red','blue','green')//创建数组并赋值
	var colors = Array(3)//也可省略new
	var colors = Array('red','blue','green')//也可省略new

2)数组字面量表示法

	var colors = ['red','blue','green']
	var names = []

检测数组:Array.isArray(value)


转换方法:toLocaleString(),toString(),valueOf(),join()
valueOf()方法返回的仍然是数组。
在打印输出数组的时候,会隐式调用 toString() 方法。如 console.log() 和 alert()
join()方法可以设置分隔符。

	var colors = ['red','blue','green']
	console.log(colors.join('||')) //red||blue||green


栈方法:push(),pop()

排序方法:
reverse() //颠倒原数组项,直接改变原数组
sort() //按照字符串大小来排序,直接改变原数组
对于 sort() ,它可以设定一个函数来指定每两个数之间的比较方法,demo如下:

	var values = [2,60,30,5,66]
	values.sort(function(value1,value2){
		return value1 - value2
	})
	console.log(values)//2,5,30,60,66

操作方法:
concat() //拼接数组,返回拼接后的数组

	var arr = [1,2,3,4]
	var arr2 = arr.concat(5,[6,7])
	console.log(arr2)
slice() //截取数组的部分元素并返回,不改变原数数组

	var arr = ['I','am','a','student','in','UESTC']
	var arr1 = arr.slice(1)
	var arr2 = arr.slice(1,3)
	console.log(arr1)//am,a,student,in,UESTC
	console.log(arr2)//am,a
splice() //对数组进行删除、插入、替换操作,会影响原数组,返回被删除的项
	var arr = ['I','am','a','student','in','UESTC']
	var otherArr = arr.splice(2,1)//从第3项开始删除,删除1个元素
	console.log(arr)//'I','am','student','in','UESTC'
	console.log(otherArr)//'a'
	
	otherArr = arr.splice(2,0,'a')//从第3项插入
	console.log(arr)//'I','am','a','student','in','UESTC'
	console.log(otherArr)//''
	
	otherArr = arr.splice(2,2,'not','a','gay')//删掉第3、4项,并插入
	console.log(arr)//["I", "am", "not", "a", "gay", "in", "UESTC"]
	console.log(otherArr)//["a", "student"]

位置方法:
indexOf(),lastIndexOf()
通过值找到其在数组中的索引位置

迭代方法(对数组的每一项都运行的方法):
every() //数组的每一项在运行函数后,均返回true,则返回true
filter() //在每一项运行函数后,返回true的项组成数组,并返回
forEach() //每一项运行函数,无返回值
map() //对数组的每一项运行函数,函数返回的结果组成新的数组,并返回
some() //每一项运行函数,若有一项返回true,则最后返回true

	var numArr = [1,2,3,4,5,6,5,4,3,2,1]
	
	var everyResult = numArr.every(function(item,index,array){
		//item,每一项;index,索引号;array,数组本身
		return (item>2)
	})
	console.log(everyResult)//false
	
	var someResult = numArr.some(function(item,index,array){
		return (item>2)
	})
	console.log(someResult)//true
	
	var filterResult = numArr.filter(function(item,index,array){
		return (item>2)
	})
	console.log(filterResult)//[3,4,5,6,5,4,3]
	
	var mapResult = numArr.map(function(item,index,array){
		return item*2
	})
	console.log(mapResult)//[2,4,6,8,10,12,10,8,6,4,2]
	
	numArr.forEach(function(item,index,array){
		return item+1
	})
	console.log(numArr)//[1,2,3,4,5,6,5,4,3,2,1]

归并方法:
reduce() //迭代数组的所有项,返回一个最终值,从第一项开始迭代
rightReduce() //迭代数组的所有项,返回一个最终值,从最后一项开始迭代
	var values = [1,2,3,4,5]
	var sum = values.reduce(function(prev,cur,index,array){
		//prev,前一项;cur,当前项;index,当前项索引;array数组对象
		//第一次迭代时,prev === 1, cur === 2
		//第二次时,prev ===3, cur === 4
		return prev + cur
	})
	console.log(sum)


-Date类型

	var now = new Date()	
	var now = Date.now()	//毫秒表示	
	var now = +new Date()	//毫秒表示
用的时候,查阅相关文档


-Function类型
每个函数都是Function类型的实例,函数名是指向该函数的指针

函数声明

	function sum(num1,num2){return num1+num2}	//解析器预先解析
函数表达式:

	var sum = function(num1,num2){return num1+num2}	//解析器按顺序解析
sum 访问函数的指针, sum()则是直接调用函数

把函数作为值传递的示例:

	var data = [{name:'John',age:28},{name:'Jam',age:20}]
	function createCompareFunction(propertyName){
		return function(obj1,obj2){
			var value1 = obj1[propertyName]
			var value2 = obj2[propertyName]
			return value1 - value2
		}
	}
	data.sort(createCompareFunction('age'))

函数内部属性:

arguments 函数的参数集合,这是一个看起来像数组的、可以用数组方法操作的对象
callee() 调用方法为 arguments.callee() ,指向 arguments 所属的函数本身,在回调的时候很有用
this 指向当前的执行环境所对应的对象
caller 找到引用当前函数的函数,用法如下:

	function outerFn(){
		innerFn()
	}
	function innerFn(){
		console.log(innerFn.caller)//outerFn
	}
	outerFn()

函数的属性和方法:
属性: fnName.length 表示函数希望接受的命名参数的个数
fnName.prototype 指向函数的原型
方法:apply() 在使用该方法时,会直接调用函数,传入的参数为数组
call() 在使用该方法时,会直接调用函数,传入的参数要列举
bind() 不会直接调用函数,取而代之的是返回一个函数
这三种方法的第一个参数要传入一个对象(或this关键字)用以改变执行环境(作用域)
后面的参数作为被调用的函数的参数传入

call()示例:

			var obj = {
				saying:'Hi'
			}
			function sayHi(name){
				console.log(name+'say:'+this.saying)
			}
			sayHi.call(obj,'John')//其中John作为函数sayHi()的参数传入

apply()示例:

			function sum(num1,num2){
				return num1+num2
			}
			function callSum1(num1,num2){
				//return sum.apply(this,[num1,num2])
				return sum.apply(this,arguments)//即使sum()函数中用不到this,但在这里,必须传入一个对象
			}
			callSum1(10,20)

bind()示例:

			var obj = {
				saying:'Hi'
			}
			function sayHi(name){
				console.log(name+'say:'+this.saying)
			}
			var otherFn = sayHi.bind(obj,'John')//其中John作为函数sayHi()的参数传入
			otherFn()


-基本包装类型

JavaScript提供了三个特殊引用类型:Boolean,Number,String,它们与各自的基本类型相对应
在读取一个基本值的时候,后台就会创建一个对应的基本包装类型。
在调用基本类型相对应的包装类型的方法时,像这样

	var s1 = 'some text'
	var s2 = s1.substring(2)
后台会产生如下的过程:
(1)创建String类型的一个实例
(2)在实例上调用指定的方法
(3)销毁这个实例

Boolean对象尽量不要用

String类型:
每一个String类型的实例都有一个length属性,用来得到字符串的字符个数

单个字符的操作方法:
根据位置访问字符串中单个字符的方法有 charAt() 和 charCodeAt()
charAt() 找到相应位置的单个字符
charCodeAt() 找到相应位置的单个字符并转换成字符编码
此外,字符串还可像数组一样访问单个字符,比如

			var stringValue = 'hello world'
			console.log(stringValue[1])

字符串操作方法:
concat() 字符串拼接

			var stringValue = 'hello'
			var result = stringValue.concat(' ','world','!!!')
			console.log(result)//hello world!!!
slice(),substr(),substring()
这三种方法的用途是一样的,都是从字符串中截取一部分返回,且不改变原字符串,尽量用 slice()

字符串位置方法:
indexOf('substring',start),lastIndexOf() 
第一个参数传入一个子字符串,找到其在原字符串中对应的位置;第二个参数传入搜索的起始位
在第一个找到 'substring' 的位置停下来不再搜索

trim()方法,返回去掉字符串两端空格后的副本。

字符串模式匹配方法 match() ,原书p126,看完再总结。

localeCompare() 方法,比较两个字符串,返回1,-1,0
string1.localeCompare(string2),不是很重要,用到的时候再去看api文档

fromCharCode() 方法, 将字符编码->字符串
console.log(String.fromCharCode(104,101,108,108,111)) //'hello'


-单体内置对象
内置对象的含义:已经实例化,无需程序员显式地实例化,比如 Object,Array,String
此外还有两个单体内置对象,Global,Math


eval() 传入一个字符串作为执行对象,该方法对其编译后执行


Math 对象
属性 Math.E, Math.Ln10, Math.Ln2, Math.LOG2E, Math.LOG10E, Math.PI, Math.SQRT1_2, Math.SQRT2


max(),min() 方法:

			var max = Math.max(3,54,32,16)
			console.log(max) // 54
			
			var arr = [1,2,3,4,5,6,7,8,9,10]
			var max = Math.max.apply(Math,arr)//Math必须传入以指定执行环境,这是固定格式
舍入方法:

Math.ceil() 向上取整
Math.floor() 向下取整
Math.round() 四舍五入


random() 方法:
Math.random() 创建一个数x,它的取值范围为 0<=x<1


随机创建一个从 lowerValue 到 upperValue

			function selectFrom(lowerValue,upperValue){
				var choices = upperValue - lowerValue + 1
				return Math.floor(Math.random()*choices + lowerValue)
			}
其他方法
Math.abs(n), Math.exp(n), Math.log(num), Math.pow(num,power), Math.sqrt(num), Math.acos(x)
Math.asin(x), Math.atan(x), Math.atan2(y,x), Math.cos(x), Math.sin(x), Math.tan(x)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值