Javascript那些烦人的细节

如果对对象进行

obj.methodCall调用的话,js内部的逻辑其实是。

if obj.hasOwnProperty("methodCall")

  调用自己的methodCall方法

else{ 

   let proto = obj.__proto__;

  while(proto != null){

      查看proto.methodCall方法是否存在,存在就调用,break;

      不然的话,proto = proto.__proto__

  }

}


propertyName指的是对象上的string类型的属性名,propertySymbols是对象上的Symbol类型的属性名


for in循环遍历所有该对象enumerable的propertyNames,包括原型链上继承过来的,但不包括symbols。


Object.keys返回给对象上所有的自己的enumerable propertyNames(即不返回原型链上的)


Object.getOwnPropertyNames返回所有该对象上的属性名,包括不可枚举的(不返回原型链上的)


Object.getOwnPropertySymbols返回所有该对象上的Symbol名,包括不可枚举的(不返回原型链上的)

Reflect.ownKeys = Object.getOwnPropertyNames + Object.getPropertySymbols(所以包含了枚举的+不可枚举的)


数组的特点

Object.keys([1])=>["0"], Reflect.ownKeys([0])=>["0", "length"],

因为数组的length属性是不可枚举,不可配置的。

但是数组的length属性是writable的

arr=[1,2,3], arr.length = 10,将会把arr的长度变为10,并且后七位置为undefined。



Object.assign(target,..sources)将source上所有可枚举的的ownProperties和ownSymbols赋值给target(TheObject.assign() method only copiesenumerable and own properties from a source object to a target object)并如sourc某属一getter话Object.assig只该读出来后直赋值target。

如果要把accessor的属性也复制上的话,参看这篇文章的completeAssign

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign


Object.defineProperty中有的configurable和enumerable默认值都为false。configurable设为false的时候,该属性通过delete关键字无法删除,同时,如果对属性尝试再次改变

Object.defineProperty(obj,{enumerable:true})这样的改变其配置的话,会抛出异常Uncaught TypeError: Cannot redefine property: propertyName。


Object.freeze彻底冻住对象,所有删除修改,添加以及defineProperty都将失效或者抛错。

Object.seal只会对对象的元属性进行密封,即不能将对象的data properties变成accessors,不能改变enumerable,writable和configurable属性。但是

直接修改对象已经存在的属性,如obj={a:1}; Object.seal(obj);obj.a = 2;是没问题的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值