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相同,不同的是它按照数组索引从高到低(自右往左运算)处理数组,而不是从左往右。