javascript《权威指南》----部分总结

前记:

意识到还是对于 原生js 存在很多不了解,决定再次刷一遍《javascript权威指南》。

第六章:对象

对象作为js的基本数据结构类型。对象是一种复合值:它将很多值(原始值或者其他对象聚合在了一起)
我们可以把对象看成是从字符串到值的映射。
这种数据结构还有其他叫法,有些我们已经非常熟悉,比如:“散列” “散列表” “字典” “关联数组”

对象可以从一个称为原型的对象继承属性。对象的方法通常是继承的属性。这种“ 原型式继承 ” 是javascript的核心特征。JavaScript对象是动态的-----可以新增属性,也可以删除属性—但是他们常用来模拟静态对象一挤静态类型语言中的“结构体”。有时他们也用作字符串的集合。

对象最常见的用法是 创建(create) ,设置(set) ,查找(query) ,检测(test) ,删除(delete)和 枚举(enumerate)


Object.create()
用法:创建一个新对象,其中第一个参数是此对象的原型 ; 第二个参数是可选参数,用一堆对象的属性进行进一步描述.

Object.create()是一个静态函数,而不是提供给某个对象调用的方法.使用它的方法很简单,只需要传入所需的原型对象即可
var o1 = Object.create({x:1,y:2}); //o1继承了属性x和y


delete :使用 delete 删除属性

	var obj = {"author":"Lyn","age":23};
	delete obj.author	// obj---->{"age":23}

注意:不可以删除继承来的属性,如果想去除该属性,则需要从被继承者那里删除,但是所有继承者都会受到影响.


hasownproperty()、in和propertyIsEnumberable() 检测属性间的关系

	in 运算符左侧是属性名字,右侧是对象。如果对象的自由属性或者继承属性中包含这个属性则返回true。
	var o= {x:1}
	"x" in o		//true
	"y" in o		//false
	"tostring" in o   //true: o 继承自tostring属性
	hasownproperty()	用于检测给定的名字是否是对象的自有属性。对于继承属性它将返回false:
	var o= {x:1}
	"x" in o		//true
	"y" in o		//false
	"tostring" in o   //false: o 继承自的,并非本身拥有的
propertyIsEnumberable() 是hasOwnProperty()的增强版,只有检测到是自由属性且这个属性的可枚举性为true时才返回true

第七章 数组
forEach() 方法从头至尾遍历数组,传递的函数作为forEach()的第一个参数。然后forEach()使用三个参数调用该函数:数组的元素、元素的索引和数组本身

	var data = [1,2,3,4,5];		//数组求和
	var sum = 0;
	data.forEach((value)=>{sum +=value;})	//第1种
	console.log(data);			//15
	
	data.forEach((value,i,item)=>{item[i] = value+1})
	console.log(data);			//[2,3,4,5,6]
		

需要注意的是:foreach无法在所有元素遍历结束之前停止。如果非要终止,必须把forEach()方法放到一个try块中,并可以抛出一个异常。


map 方法

map方法将调用的数组的每个元素传递给指定的函数,并返回一个数组,它包含该函数的返回值。
map返回的不是源数组,而是一个新数组,如果源数组是一个稀疏数组,那么新数组也将会是一个稀疏数组

例如:

	a = [1,2,3];
	b = a.map((x)=>{x*x; });		// b是[1,4,9]

filter 方法

filter()方法返回的数组元素是调用的数组的一个子集。传递的函数是用来逻辑判定的:
该函数返回true或者false。调用判定函数就像调用foreach()和map()一样。如果返回的值为true或者能够转化成true的值,那么传递给判定函数的元素就是这个自己的成员,它将会被添加到一个座位返回值的数组中。
	a = [5,4,3,2,1];
	smallvalues = a.filter((x)=>{return x<3});		//[2,1]
	everyothernum = a.filter((x,i)=>{return i%2 == 0});	//[5,3,1]

虽然面对稀疏数组时,filter会返回的稀疏数组压成稠密数组。但在其他情况下,我们可以使用下面的方法压缩稀疏数组。

	var dense = sparse.filter(()=>{return true})

every()和some()
every()和some()方法是数组的逻辑判定:他们对数组元素应用指定的函数进行判断,返回true或者false

every 需要所有的元素通过判断,才能返回true,否则false 。类似于  &&
some 只要部分元素通过判断,就返回true,全部不通过才是false 。类似于 ||
	a = [1,2,3,4,5,22];
	a.every((x)=>{x<10})		//false
	a.some((x)=>{x<10})		//true

注意: 一旦every()和some()决定返回什么之的时候,就会停止遍历数组(短路


reduce()和reduceRight()

两个方法使用制定的函数将数组元素进行组合,生成单个值。这在函数式编程中是常见的操作,也可以称为"注入"和"折叠"。以下是代码:
	let a = [1,2,3,4,5]
	let sum = a.readuce((x,y)=>{return x+y},0)		//求和
	let produce= a.readuce((x,y)=>{return x*y},1)	//求积
	let max = a.reduce((x,y)=>{x>y?x:y})			//求最大值	
reduce()需要两个参数,第一个是函数,第二个是传给函数的初始值。

注意:reduce()函数和foreach()、map()等函数不同。比较熟悉的是,数组元素 、 元素的索引和数组本身将作为第2~4个参数传递给函数.第一个参数是目前为止的化简操作的累积。第一次调用函数时,第一个参数是一个初始值,他就是传递给reduce()的第二个参数。接下来,这个值就是上一次化简函数(第一个参数)的返回值。

reduceRight()的工作原理和reduce相同,不同的是它按照数组索引从高到低(自右往左运算)处理数组,而不是从左往右。


indexOf()与lastIndexOf()

两个函数均是搜索整个区域中是否含有需要的元素,找到则返回第一个元素的索引,反之返回-1;
indexOf()自左向右搜索     lastIndexOf()自右向左搜索
	a = [0,1,2,1,0];
	a.indexOf(1)		// => 1: a[1] 是1
	a.lastindexOf(1)	// => 3: a[3] 是1  ,因为lastindexof反向查找
	a.indexOf(5)		// => -1  :5不存在

注意:
indexof和lastindexof不同于本章的其他函数,他们不需要接受一个函数作为其参数。第一个参数是需要搜索的值,第二个参数可选:他指定数组的某个索引,从那个索引开始搜索。第二个参数也支持负数,他相对着数组末尾的偏移量,对于splice()方法:-1指代数组的最后一个元素。


数组类型
我们在本章中到处都可以看见数组时具有特殊行为的对象。给定一个未知的对象,判定他是否为数组通常非常有用。在es5中,我们通常使用Array.isArray()函数来做这件事。

    Array.isArray( [] );		// => true
   	Array.isArray( {} );		// => false

在es5之前,想要区分数组和非数组对象非常困难。typeof操作符帮不上忙 instanceof在这里也只能用于简单的情形:
[] instanceof Array // true
({}) instanceof Array // false

使用instanceof的问题是在Web浏览器中可能有多个窗口或者窗体(frame)存在。每个窗口都有自己的javascript环境,有自己的全局对象。并且,每个全局对象有自己的一组构造函数。因此一个窗体中的对象将不可能是另外窗体中的构造函数的实例。窗体之间的混淆不会常发生,但这意味着instanceof操作符不能作为一个可靠的数组检测方法。

类数组对象
我们已经发现数组的有些特性是其他对象没有的:

  1. 当有新元素的加入,自动更新length属性
  2. 设置length为一个较小值将截断数组
  3. 从Array.prototype中继承一些有用的方法
  4. 其类属性为 “ Array ”

这些特性让javascript数组和常规的对象有明显的区别。但是她们不是定义数组的本质特性。一种常常完全合理的看法把一个拥有数值length属性和对应非负整数属性的对象看作一种类型的数组。

实践中这些“类数组”对象实际上偶尔出现,虽然不能在他们智商直接调用数组方法或者期望length属性有什么特殊的行为,但是仍然可以用针对真正数组遍历的代码来遍历他们。结论就是很多数组算法针对类数组对象 工作的很好,就好像针对真正的数组一样。


propertype属性
每一个函数都包含一个prototype属性,这个属性是指向一个对象的引用,这个对象称作“原型对象”。每一个函数包含不同的原型对象。当将函数用作构造函数的时候,新创建的对象会从原型对象上继承属性


call()和apply()

可以将call()和apply()看作是某个对象的方法,通过调用方法的形式来间接调用函数。

call()和apply()的第一个参数是要调用函数的木对象,他是调用上下文,在函数体内通过this来获得对他的引用.想要一对象o的方法来调用函数f(),可以这样使用call()和apply()


第九章没看

第14章 window对象

14.3 浏览历史

window对象的history属性引用的是该窗口的history对象.History对象是用来把窗口的浏览历史用文档和文档状态列表的形式表示.History对象的length属性表示浏览历史列表的元素数量,但出于安全考虑,禁止所有脚本访问浏览记录.

history对象的back()和forward()方法与浏览器的"前进" 、"后退"按钮类似. 他的go方法可以接受一个参数,从而操作浏览器前进或后退.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值