JavaScript第四版阅读ing~(5)

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的设置方法,并传入参数

  1. Invoked src getter
  2. 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的情况如下。
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_46013619/article/details/110431263