使用对象
基础
- 对象里面存的是引用
o[k]计算属性delete o.k'k' in o属性存在否- 不存在为
undefined - 应用
null表示空值和未知 for(let key in o){}
- 不存在为
- 属性顺序:先整数用升序,其他按时间
- 克隆与合并
Object.assign({},o1,o2...)let clone = {...o1,...o2}- 深度克隆可以用lodash库
- 箭头函数的
this是函数外部的this - 构造函数
- 大写开头
- 只用new执行 没参数可省略括号
function User(name){this.name=name}new使(构造)函数创建并返回thisreturn一般没有 带对象的话就返回该对象
- 可选链
?.a.b.c若b不存在就会报错a.b?.c若b不存在就返回undefined- 变体
a.func?.()a?.[key] - 只读不写
symbollet id = Symbol('description')- 转字符串
id.toString()id.description - 常用于对象隐藏属性
- 全局 Symbol (相同名字相同实体)
let id = Symbol.for('key')Symbol.keyFor(id)=>'key'
- 系统 symbol 微调对象
Symbol.iteratorSymbol.toPrimitive- ...
- 原始值转换
- 在进行运算时转为数字
- 在输出时时转为文字
Symbol.toPrimitiveobj.valueOf()obj.toString()- 返回原始类型而非对象
- 迭代
Object.keys(obj)返回所有键的数组Object.values(obj)返回所有值的数组Object.entries(obj)返回所有[键,值]的数组Object.fromEntries(Object.entries(prices).map())迭代操作
数组
for(let i of arr){}避免用for inarr.length=0清除数组- 一些方法
.at(pos)支持负数.pop() .push(data) .shift() .unshift(data)首尾增删.splice(start[,num,add1,add2...])支持负数.slice([start],[end])切片 返回新数组.concat([arr2,arg...])合并数组或值.forEach((item,index,array)=>{})每个元素运行一下函数.indexOf(item,pos) .lastIndexOf() .includes()检索.find((item,index,array)=>{}) .findIndex() .findLastIndex()返回true的第一个item/undefined 或 index/-1.filter((item,index,array)=>{})匹配所有true的元素.map((item,index,array)=>{})每个元素运行后返回结果数组.sort((a,b)=>a-b)元素默认当字符串来排序(a,b)=>a.localeCompare(b)比较文字
.reverse()颠倒.split(delim[,n]).join(glue)转数组和转字符串.reduce((accumulator,item,index,array)=>{}[,initial]).reduceRight()根据数组计算单值let res = arr.reduce((sum,i)=>sum+i , 0)- 初始值默认
arr[0]
Array.isArray(arr)是否数组.some(func).every(func)有几个/每个都满足函数.fill(value,start,end)填充Array(7).fill(0)常用于动态规划
.copyWithin(target,start,end)复制自身部分到target.flat(depth).flatMap(func)扁平化Array.of(7)=>[7]Array.from(obj)类数组和可迭代转数组[...obj]
thisArg略
可迭代对象
Symbol.iterator方法 返回一个有next()方法的对象(迭代器)next()返回{done, value}done=true时结束
js
//方法1
let range = {
from: 1,
to: 5
};
range[Symbol.iterator] = function() {
return {
current: this.from,
last: this.to,
next() {
// 4. 它将会返回 {done:.., value :...} 格式的对象
if (this.current <= this.last) {
return { done: false, value: this.current++ };
} else {
return { done: true };
}
}
};
};
//方法2
let range = {
from: 1,
to: 5,
[Symbol.iterator]() {
this.current = this.from; //初始
return this;
},
next() {
if (this.current <= this.to) {
return { done: false, value: this.current++ };
} else {
return { done: true };
}
}
};
for (let num of range) {
alert(num); // 1, 然后是 2, 3, 4, 5
}- 可迭代 支持
for of - 类数组 有数字索引和
length - 字符串可迭代也是类数组
Array.from(obj[,mapfunc,thisArg])将可迭代或类数组转成数组
Map & WeakMap
- Map的键支持任何类型
- 支持
for of按插入顺序 - 方法
new Map()创建 map。.set(key, value)根据键存值。.get(key)根据键返回值.has(key)key是否存在.delete(key)删除.clear()清空.size返回元素个数.keys().values().entries()返回键\值\全的可迭代对象.forEach((value, key, map) => {})
- Map和对象互转
- 数组
new Map([[k1,v1],[k2,v2]]) - 对象
new Map(Object.entries(obj)) - 数组
Object.fromEntries([[],[]]) - Map
Object.fromEntries(map)
- 数组
WeakMap的键为对象.get(key).set(key,value).delete(key).has(key)- 主要用于额外数据的存储,类似缓存
- 当对象不可达时,键值就被清除
Set & WeakSet
- 不重复
- 支持
for of按插入顺序 - 方法
new Set(iterable)用可迭代对象创建.add(value)添加值,返回 set.delete(value)删除值,存在 true 否则 false.has(value)是否存在.clear()清空.size返回个数.forEach((value, valueAgain, set) => {}为了与 Map 兼容.keys().values().entries()返回值\值\全的可迭代对象
WeakSet只能添加对象- add has delete
- 不可迭代
- 对象不可达时,值就被清除
解构赋值
数组解构
let [a,b]="a b".split(' ')let [a,,c]="abc"for(let [k,v] of Object.entries(obj)/Map){}[a,b]=[b,a][a,b,...c]='abcdefg'[a='a',b='b']=['c']
对象解构
let {a,b}={a:1,b:2,c:3}let {width:w=100}={}key:改名=默认值- 支持
...剩余模式 - 没有let时
({}={})
嵌套解构
javascript
let options = {
size: {
width: 100,
height: 200
},
items: ["Cake", "Donut"],
extra: true
};
// 为了清晰起见,解构赋值语句被写成多行的形式
let {
size: { // 把 size 赋值到这里
width,
height
},
items: [item1, item2], // 把 items 赋值到这里
title = "Menu" // 在对象中不存在(使用默认值)
} = options;智能函数参数
js
let options = {
title: "My menu",
items: ["Item1", "Item2"]
};
function showMenu({title = "Untitled", pay = 100, items = []}={}){}
showMenu(options);
showMenu({}); //全部取默认值
showMenu(); //加了={}就能这样了日期和时间
- 创建
new Date()当前时间new Date(ms)通过时间戳创建 可负new Date('2022-08-08')*同下文Date.parse()new Date(y,m,d,h,m,s,ms)- y四位 两位为19xx
- m 0~11
- d 默认1
- h m s ms 默认0
- 查方法
.getFullYear().getMonth()0-11.getDate().getHours().getMinutes().getSeconds().getMilliseconds().getDay()0-6.getTime()时间戳getTimezoneOffset()时差
- 设置方法
.setFullYear(year, [month], [date]).setMonth(month, [date]).setDate(date).setHours(hour, [min], [sec], [ms]).setMinutes(min, [sec], [ms]).setSeconds(sec, [ms]).setMilliseconds(ms).setTime(milliseconds)
- 使用查写组合可以任意加减
- 运算转数字为时间戳
- 类方法
Date.now()返回当前时间戳Date.parse(str)返回时间戳- YYYY-MM-DDTHH:mm:ss.sssZ
- '2012-01-26T13:51:50.417-07:00'
Json
JSON.stringify(value[, replacer, space])转json- 忽略 方法 Symbol undefined
replacer要转换的名单,可为函数space美化- 可以用
toJSON(){}自定义
JSON.parse(str[, reviver])转对象- 可以转数组
reviver(key,value)=>{} 进行一些额外操作