加油,夏慧敏,热爱生活
早期 es6之前
每个执行上下文都会被关联到一个变量环境中Vo, 在源代码中的变量和函数的声明也会被当作属性添加到Vo中,对于函数来说,参数也会被Vo中
es6之后
每个执行上下文会被关联到一个变量环境中,在执行代码中变量和函数的声明会被作为环境记录添加到变量环境中,对于函数来说,参数也会被作为环境记录添加到变量环境中
重复定义 | 定义变量的作用域 | 作用域提升 | 暂时性死区 | ||
---|---|---|---|---|---|
var | 可以 | 函数作用域 | 可以 | 无 | 全局作用域时会成为window属性 |
let | 不可以 | 块级作用域 | 不可以 | 有 | |
const | 不可以 | 块级作用域 | 不可以 | 有 |
if(){
块级作用域
}
for(){
块级作用域
}
函数的参数默认值:
ES6 之前, 当传入的值为 false, 0 ,'' ...会产生bug
function foo(m,n){
m = m || 'aaa'
n = n || 'bbb'
}
foo('',false) // 程序里就会赋后面的值
ES6 之后
function foo(m='aaa',n='bbb'){
}
对象参数的默认值和解构:
方法一
function foo({name,age}={name:'why,age:18}){
console.log(name,age)
}
方法二
function foo({name='why',age=18}={}){
console.log(name,age)
}
函数的剩余参数:
function foo(m,n,...agrs){
console.log(m,n)
conosle.log(agrs)
}
foo(20,30,20,5,30)
剩余参数和arguments的区别
箭头函数:
const names = ["abc","cba" ,"nba"]
const name = "why"2
function foo(x,y, z) {
console.log(x,y,z)
}
foo(...names) = foo("abc","cba" ,"nba")
foo(...name) = foo('w','h','y')
const newNames = [...names, ...name] // 看下面的总结
console.Log(newNames)
const newNames ={...name , age:18}
let m= 8 // 默认情况下是十进制,
let n=0b100 // 二进制
let n2=0o100 // 八进制
let n3=0x100 // 十六进制
symbol
const s1= Symbol() // 其实symbol 是个函数
const s2= Symbol()
console.log(s1,s2) //false
1. 定义属性时使用
const obj={
[s1]:'abc'
[s2]:'bac'
}
2.新增属性时使用
obj[s2]='nab'
获取:
console.log(obj[s1],obj[s2]) //不能以点语法形式获取
const sKeys = Object.getOwnPropertySymbols(obj) // 先获取所有symbol 的key
for (const item of obj[sKeys]){
}
const set = new Set()
set.add(10)
set.add(20)
set.add(10)
console.log(set) // 10,20 因为set存放的元素不会重复
const set2 = new Set()
set2.add({})
set2.add({})
console.log(set) // {},{} 因为set 存放的是两个地址
const obj={}
set2.add(obj)
set2.add(obj)
console.log(set) // {} 因为存放的是一个地址
const arr=[1,2,3,4,5,1,2,3]
const arrSet = new Set(arr) // 通过 set 去重
console.log(arrSet) // 但是这里拿到的是set结构,我们需要array类型
const arrNew=Array.from(arrSet) // 方式一
const arrNew2=[...arrSet] // 方式二
console.log(arrNew,arrNew2)
常见的属性和方法:
console.log(arrNew.size) // 长度4
arrSet.add(10) // 添加
arrSet.delete(10) // 删除
arrSet.clear() // 清除
arrSet.has(10) // 是否包含
WeakSet使用:
和Set类似的另外一个数据结构称之为WeakSet,也是内部元素不能重复的数据结构
那么和Set有什么区别呢?
WeakSet常见的方法
Array.includes:
是否包含object.keys
和 object.value
对于对象来说就是对象的属性和值,对于数组来说是索引和值,const obj = {
name:'why'
age:18
}
console.log(object.keys) //['name','age']
const obj2 = [1,2,3]
console.log(object.keys) //['0','1','2']
const obj3 = '012'
console.log(object.value) //['0','1','2']
object.entries
获取对象可枚举的属性和值分别放入两个数组,返回一个数组是这个两个数组的集合const obj = {
name:'why'
age:18
}
console.log(obj.entries(obj)) //[['name','age'],['why','18']]
Padding
字符串填充const mes='hello world'
const newMes=mes.padStart(15,'*') // 如果不传第二个参数默认是空格
const newMes=mes.padEnd(15,'*')
flat
和 flatMap
对数组进行降维
trim
和 trimStart
和 trimEnd
去空格
js 可表示的数字是有限的,超出可能运算不太准确,对于超出的数值可以在数值后面加n,如果运算数字也要加n表示,可以通过 bigInt
转化
??
空值运算符
const foo = undefined
const bar= foo || "default yalue" // 弊端: 对于''空字符串和0 和false会走默认值
const bar = foo ?? "defualt value" // 准确的 unde 和 null值
console.log(bar)
?.
空值选择器let obj={
name:'xia',
friend:{
name:'wang'
}
}
console.log(obj.friend.name)
console.log(obj.friend2.name) // 阻止代码正常运行
//如果某个属性为null 或者 undefined ,就会提前阻止执行,
console.log(obj?.friend2.name) //避免null.XX或undefined.XX 造成后面代码产生问题
proxy
建议看下我的响应式原理