6.4 Map
键值任意,什么都可,object也可
console.log((-0) == (+0)) //true
三点运算符将Map实例转化为数组
下面代码的意思是:对于键的修改,字符串的形式虽然能在遍历时修改,但是实际上在映射的内部是无法修改的,键为对象的话,对象内部属性可以修改,但是,映射的还是那个他之前对应的那个值。(注意基本数据类型这里是键和值都无法修改,引用可以),并且Map容器会不重复,两两重复,取最后一个
第8章 对象、类与面向对象编程
1、要修改属性的默认特性就要使用Object.defineProperty()
let person = {}
Object.defineProperty(person,'name', {
value:'zz',
writable:false
})
person.name = 'ss'
console.log(person) //{name: "zz"}
一旦设置过configurable为false不可配置,就不可以再使用defineProperty修改任何非Writable属性
let person = {}
Object.defineProperty(person,'name', {
value:'zz',
configurable:false //是否可以通过delete删除重新定义
})
console.log(person.name) //zz
delete person.name
console.log(person.name) //zz
Object.defineProperty(person,'name', { //报错
value:'zz',
configurable:true //是否可以通过delete删除重新定义
})
2、访问器属性
这个也可以定义多个属性defineProperties,和defineProperty一样, 默认情况所有数据属性都是false
let person = {}
Object.defineProperties(person,{
year_:{
value:2020,
writable:true
},
day:{
value:1,
writable:true
},
year:{
get(){
return this.year_
},
set(newValue){
this.year_ = newValue
this.day += newValue
}
}
})
console.log(person.year_) // 2020
console.log(person.year) // 2020
person.year = 2021
console.log(person.year_) // 2021
console.log(person.year) // 2021
console.log(person.day) // 2022
8.1.4合并对象
let dest,src,result
dest = {sid: 'sr'}
src = {id: 'src'}
result = Object.assign(dest,src)
console.log(result) //{sid: "sr", id: "src"}
console.log(dest) //{sid: "sr", id: "src"}
console.log(dest === result) //true
console.log(src) //{id: 'src'}
执行步骤:调用src的获取方法,调用dest的设置方法,并传入参数
- Invoked src getter
- nvoked dest setter with param foo
let dest,src,result
dest = {
set a(val){
console.log(`Invoked dest setter with param ${val}`)
}
}
src = {
get a(){
console.log('Invoked src getter')
return 'foo'
}
}
Object.assign(dest, src)
console.log(dest) //{set a: ƒ a(val)}
Object.assign()执行的是浅复制,如果属性相同,则使用最后一个。
代码示例:(这里没有注意到一个点,这个get和set后面的id这个位置,必须和源对象一一对应才行,否则不会执行set方法)
结果:
Invoked dest setter with param 1
Invoked dest setter with param 2
Invoked dest setter with param 3
let dest = {
set id(val){
console.log(`Invoked dest setter with param ${val}`)
}
}
Object.assign(dest, {id:1},{id:2},{id:3})
这段代码的意思是修改过了,中途报错了,在出错之前修改的它就是修改了,不会回滚已完成的修改,值变化了。
8.1.5 对象标识及相等判断
这里+0和-0的判断以及NaN的判断,都很有趣,在全等中+0和-0为true,在Object.is()中会正确判断符号,NaN的情况如下。