-
在现代引擎中,从性能的角度来看,我们是从对象还是从原型链获取属性都是没区别的。它们(引擎)会记住在哪里找到的该属性,并在下一次请求中重用它。
例如,对于 pockets.glasses 来说,它们(引擎)会记得在哪里找到的 glasses(在 head 中),这样下次就会直接在这个位置进行搜索。并且引擎足够聪明,一旦有内容更改,它们就会自动更新内部缓存,因此,该优化是安全的 -
__ proto __ 的值可以是对象,也可以是 null。而其他的类型都会被忽略。
-
Object.getPrototypeOf/Object.setPrototypeOf 来取代 proto 去 get/set 原型
-
写入不使用原型,原型仅用于读取属性。对于写入/删除操作可以直接在对象上进行。
-
无论在哪里找到方法:在一个对象还是在原型中。在一个方法调用中,this 始终是点符号 . 前面的对象。
-
for…in 、Object.keys 、 obj.hasOwnProperty(key) 的区别
a. for … in 迭代自身和原型链中可枚举的属性和方法
b. Object.keys 仅显示 自己的key
c.obj.hasOwnProperty(key) – 返回一个布尔值 -
此外,我们还明确了 proto 是 [[Prototype]] 的 getter/setter,就像其他方法一样,它位于 Object.prototype。
我们可以通过 Object.create(null) 来创建没有原型的对象。这样的对象被用作 “pure dictionaries”,对于它们而言,使用 “__ proto __” 作为键是没有问题的。 -
Rest 参数会收集剩余的所有参数,因此下面这种用法没有意义,并且会导致错误:
function f(arg1, ...rest, arg2) { // arg2 在 ...rest 后面?!
// error
}
9.尽管 arguments 是一个类数组,也是可迭代对象,但它终究不是数组。它不支持数组方法,因此我们不能调用 arguments.map(…) 等方法。
10.Spread语法
rest用法,是收集多余的参数成为数组,但是spread语法是把传入的可迭代类型的参数,拆成单个。
let arr = [3,5,1]
alert(Math.max(...arr)); //等于 alert(Math.max(arr[0],arr[1],arr[2]);
复制对象的浅拷贝现象:
let a=[1,2,{name:"a"}]
let b=[...a]
b[2].name="b"
consle.log(a)//1,2,{name:"b"}
11.类型归纳:
1).内置的arguments是可迭代对象,但是不是数组
2). …rest 多余参数是数组类型
3). 单独使用 …arr 会报错,但是如果用[]包起来,可以形成一个数组 (spread)
let arr=[1,2,3]
let bb = ...arr //报错!!
let bb = [...arr] //可以看成 let bb = new Array(...arr)