几点需要注意的的:
null本身是一个值类型,但是typeof null 得到的却是一个 object 这是js的一个bug
对象属性访问的方式有两种 .属性名 [属性名],区别在于 []中可以当作计算属性,或者写一些不合规范的变量。
对象的key 只能是字符串,如果传入的不是字符串会自动转成字符串。对象类型的字符串类型是[object object]
Ojbect.assign(目标对象,源对象1,源对象2.。。。。。) 会实现浅拷贝。 他会遍历一个或多个源对象的所有可枚举属性并把它们复制到目标对象并返回目标对象
- Object.freeze(obj) 会冻结一个对象。 被冻结的对象。直接属性不能被修改,删除
当你 访问一个对象的属性时, 比如obj.a 实际上是执行了 obj默认的[[GET]]操作。[[GET]] 操作默认会在对象本身查找有无同名属性,找到就返回。没有就继续去他的原型链上找。
当设置一个对象的属性时。 会触发这个对象默认内置的[[put]]操作。 如果在本身找到了 会执行以下操作
1.是否有setter 有就执行。
2.属性描述符中 writeable是否为false 如果为false 严格模式报错。非严格模式忽略操作
2.如果都不是。对值进行设置
-
因为 当访问对象某个属性时。如果这个对象在它本身和原型链都没找到。又或者这个属性的值本来就是undefined 返回值都是一样
因此无法通过返回值来判断对象上有没有某个属性。- 可以通过hasOwnproperty 来判断对象本身是否有某个属性。
- 可以通过 运算符 in 来判断对象本身及原型链上有这个属性(无论这个属性是否枚举)
definedProperty 主要作用是修改属性修饰符
当对象属性的configurable为false时。不能使用defineProperty重新设置属性修饰符。会报错。 这是个单向操作。无法撤销。于此同时还会禁止删除这个属性。
可以通过writable 和 configurable 创建一个真正的常量属性(常量的三个特点:不可修改,不可重新定义。不可删除)
Object.keys() 会 以数组的形式返回这个对象本身的所有可枚举类型属性
- 当你 使用 for of 语法遍历一个数据结构。。实际上是默认寻找它内置的的[symbol.iterator]属性 并使用next方法来遍历数据值
var name = 'global'
let obj = {
name:'obj',
say:function(){
console.log(this.name)
}
}
obj.say() //obj
let fn = obj.say
fn()//global
分析
函数并不会属于对象。即使key的值是对象 obj.key,也仅仅是对属性的访问。都是对这个函数的引用。(还是那句老话。真正决定函数中this指向的是调用位置。obj.key返回值是一个函数的话。仅仅代表在这个对象里调用了函数。而不是调用了对象中的这个函数。)