一些小点
1.基本数据类型:String Number Boolean Undefine Null Symbol BigInt
2. 引用数据类型:Object Funtion Array
3. 定义变量的方式 let const var
4. toString()返回对象类型的字符串表示,valueOf()返回对象本身
创建对象的方式
1. 普通模式
let p = {
name: "muggle",
call: function(){
cnosole.log(this.name)
}
}
2. new模式
let p = new Object()
p.name = "muggle"
p.call = function(){}
3. 工厂模式
Function Person(){
return {
name:""muggle",
call(){}
}
}
let p = Person()
4. 构造函数模式
Function Person(){
this.name = name;
this.call = function(){};
}
let p = new Person()
5. class模式
Class Person{
construtor(name){
this.name = name;
}
call(){}
}
let p = new Person()
6. Oject.create()
let Person = {}
let p = Object.create(Person);
内置对象(三个方面:使用方式,属性,方法)
1. String
let str = ""
let str = new String("")
let str = `hello,${name}!`
str.length
str.toUpperCase()
str.toLowerCase()
str.slice(start,end)
str.trim()
str.replace(searchValue,newValue)
str.replaceAll(searchValue,newValue)
str.split(separator)
str.concat(str1,str2...)
str.repeat(count)
2. Number
let n = 1
let n = new Number()
Number.MAX_VALUE
Number.MIN_VALUE
Number.POSITIVE_INFINITY
Number.NEGATIVE_INFINITY
Number.isFinite(n)
Number.isInteger(n)
Number.isNaN(n)
Number.parseFloat(str)
Number.ParseInt(str)
3. Boolean
let isTrue = new Boolean(x)
4.Symbol
let sym = Symbol("key")
let obj = {
[sym]:"muggle"
}
Symbol.for("key")
Symbol.KeyFor("key")
不能用于普通对象的for循环遍历
5. BigInt
let n = BigInt()
6. Array
let arr = []
let arr = new Array()
arr.length
Array.from()
Array.of(a,b,c)
Array.isArray()
arr.push(value)
arr.pop()
arr.unshift(value)
arr.shift()
arr.splice(start,count)
arr.splice(start,count,value)
arr.splice(2,0,3,4)
arr.concat(arr1)
arr.slice(start,stop)
arr.join(separator)
arr.forEach((item,index) => console.log(item,index))
arr.map((item) => item * 2)
arr.filter((item) => item %2 ===0)
arr.find((item) => item>2 )
arr.findIndex((intem) => item>2)
arr.sort((a,b) => a-b)
arr.sort((a,b) => b-a)
arr.sort()
arr.reverse()
7. Set(WeakSet)
let set = new Set(arr)
set.size
set.add(a).add(b).add(c)
set.delete(value)
set.has(value)
set.keys()
set.values()
set.entries()
set.clear()
set.forEach((value) => console.log(value))
WeakSet只能存储对象、不支持遍历,未引用的对象会被垃圾回收
8. Map(WeakMap)
let map = new Map(['a', 1] , ['b', 2] )
map.size
map.set(key,value)
map.get(key)
map.delete(key)
map.has(key)
map.keys()
map.values()
map.entries()
map.forEach((v,k) = > console.log(k , v))
9. Date
let date = new Date()
date.getFullYear()
date.getMonth()
date.getDate()
date.getDay()
date.getHour()
date.getMintes()
date.getSeconds()
date.getTime()
date.toString()
date.toDateSrting()
date.toTimeString()
10. Math
直接调用,不需要实例化
Math.PI
Math.E
Math.ln2
Math.abs(x)
Math.ceil(x)
Math.floor(x)
Math.round(x)
Math.max(x,y,z)
Math.min(x,y,z)
Math.pow(x,y)
Math.quart(x)
Math.sin(x)/cos(x)/tan(x)
Math.log(x)
Math.log10(x)
Math.random()
11. RegExp()
let regex = /abc/
let regex = new RegExp("模式","标志")
regex.test(str)
/abc/
. \d \D(数字) \w \W(字母) \s \S(空白)
^开始 $结束 []集合 [^]集合取反
g全局匹配 i忽略大小写
12. Error
let error = new Error("something wrong!")
error.message
error.name
error.stack
throw new Error("error")
13. JSON
const jsonString = {
"name":"muggle",
"age":23,
"course": ["a","b","c"]
}
JSON.parse(jsonString)
JSON.stringify(obj)
14. console
console.log()
console.info()
console.warn()
console.error()
console.assert()
console.table(obj/arr)
15. Function
function Fn(){}
let Fn = function(){}
let f= new Fn();
let f= (a) => "hello" + a
Fn.length
Fn.constructor
Fn.apply(thisArg, [a,b,c])
Fn.call(thisArg, a, b, c)
Fn.bind(thisArg, a, b, c)
16. Object
Object.create(Person)
Object.assign(target, ...sources)
Object.keys(obj)
Object.values(obj)
Object.entries(obj)
Object.getPrototypeof(obj)
Object.setPrototypeOf(obj,obj_prototype)
obj.hasOwnProperty(key)
obj.isPrototypeOf(otherObj)
判断类型的方式
1. typeof
`typeof` 操作符可以用来判断原始类型(如 `string`、`number`、`boolean`、`undefined`)和对象类型(如 `object` 和 `function`),数组是一个特殊的对象,null也被判定为对象(历史遗留)
2. instanceof
arr instanceof Array
3. Object.prototype.toString.call()
in操作符和for
1. in 操作符
(1) key in Object
key字符串或Symbol,表示检查的键(obj的键为属性,arr的键为索引)
Object是对象或数组
in检查对象自身和原型链,Object.hasOwmProperty只检查自身
返回true/false
(2) key in obj
const obj = {name:'muggle', age:23}
console.log("name" in obj)
(3) key in arr
const arr = [3,4,5]
console.log(0 in arr)
console.log(5 in arr)
2. for
(1) forEach((value,key)=>{} 遍历arr,map,set的键和值,不能遍历对象
arr.forEach
map.forEach
set.forEach
(2)for(let key in obj){} 遍历对象的键(obj的属性,arr的索引)
for(let key in obj){
console.log(key,obj.key)
}
for(let key in arr){
console.log(key)
}
(3)for(let value of obj){} 遍历可迭代器的值(obj,arr,map,set,string)
for(let value of arr){
console.log(value)
}
const map = new Map([{name:'muggle'},{age:23}])
for (let {key,value} in map){
console.log()
}
数组去重、数组排序
1. 数组去重
let uniqueArr= new Set(arr)
2. 数组排序
arr.sort((a,b) => a-b)
arr.sort((a,b) => b-a)
继承(本质要实现子类继承父类的属性和方法)
1. 原型链继承
Child.prototype = new Parent()
Child.prototype.constructor = Child
2. 构造函数继承
Parent.call(this, a, b, c)
3. 组合继承
Parent.call(this, a, b, c)
Child.prototype = new Parent()
Child.prototype.constructor = Child
4. class继承
class parent {
constructor(name, age) {
this.name = name;
this.age = age;
}
getName() {
console.log(this.name);
}
}
class child extends parent{
constructor(name, age, school) {
super(name, age);
this.school = school;
}
getSchool() {
console.log(this.school);
}
}
let c = new child('zhangsan', 18, 'beijing');
c.name = 'lisi';
c.school = 'shanghai';
c.getName();
c.getSchool();
解构赋值(前面解构=后面完整)和rest(...arg)
解构赋值:将数组或对象的值提取到变量中
1. 解构数组
const arr = [1,2,3]
const [A,B,C] = arr
console.log(A)
2. 解构对象
const obj = {name:'muggle' , age:23}
const {name,age} = obj
const {name:username , age:userage} = obj
console.log(name)
console.log(username)
3. 嵌套解构
const obj ={name:'muggle' info:{age:23,addr:'NY'}}
const {info:{age,addr}} = obj
cosole.log(age)
4. 解构用于函数传参
想象成赋值,形参 = 实参
function person({name,age}){
console.log(name,age)
}
person({name:'muggle',age:23})
Rest参数:将多个剩余的值收集到一个数组或对象中
1. 数组rest
const arr = [1,2,3,4,5]
const [A,B,...C] = arr
console.log(C)
2. 对象rest
const obj = {name:'muggle',age:23,addr:'NY'}
const {name,...info} = obj
console.log(info)
3. 函数传参
function num(...numbers){
numbers.forEach(value=>console.log(value))
}
num(1,2,3)
浏览器特有的全局对象(属性、方法)
1. Window
最顶层的全局对象,其属性和方法可以直接调用(BOM)
document
innerWidth\innerHeight
localStorage\sessionStorage
location
navigaror
screen
alert("")
prompt(message,defaultValue)
setTimeout(callback,delay)
setInterval(callback,interval)
open(url,target)
scrollTo(x,y)
2. document
HTML文档,访问和操作页面内容(DOM)
document.body
document.head
document.title
document.forms
document.images
<div id='myDiv' class='highlight'>hello</div>
document.getElementById(id)
document.getElementsByClassName(classname)
selector = #id .class tagName tagName[attribute]
document.querySelector(selector)
document.querySelectorAll(selector)
document.createElement(tagName)
document.parent.appendClild(node)
3. Navigator(浏览器相关信息)
navigator.userAgent
navigator.language
navigator.online
navigator.platform
navigator.geolocation.getCurrentPositon(successCallback,errorCallback)
navigator.share(data)
4. location(当前页面的URL)
location.href
location.protocol
location.hostname
location.pastname
location.search
location.assign(url)
location.reload()
location,replace(url)
5. history (浏览器会话历史)
history.length
history.back()
history.forward()
history.go(delta)
history.pushState(state,title,url)
history.relaceState(state.title.url)
事件
0. 对一个标签进行操作
const btn = document.getElementById("myButton");
btn.addEventListener("click",function(){})
1. 事件对象EventTarget
HTML元素、文档、窗口等都接入了EventTarget接口,都可以使用event的属性和方法
event.type
event.target
event.bubbles
event.preventDefault()
event.stopPropagation()
btn.addEventListener("click",function(event){
event.stopPropagation();
})
2. 常用事件类型type
click
dblclick
keydown 按下
keyup 松开
keypress a
input
change
mouseenter
mouseleave
mouseover
mouseout
submit
focus
blur
load
resize
scroll
contextmenu
drag
drop
focusin
focusout
3. 事件监听与绑定
(1) 通过HTML属性绑定
<button id="myButton" onclick="alert("")"></button>
(2) 通过JS绑定
const btn = document.getElementById("myButton");
btn.addEventListener("click",function(){
alert("");
})
(3)常用监听绑定函数
btn.addEventListener(type,callback,options/useCapture)
btn.removeEventListener(type,callback,options/useCapture)
btn.dispatchEvent(type)
useCapture:默认为false,即默认冒泡触发)
options:capture(true,捕获时触发函数) once(true,只触发一次函数) passive(true,禁止调用preventDefault()) signal
4. 事件传播
(1)捕获阶段(window - document - 最外层父元素 - 目标元素)
设置btn.addEventListener(event,callback,true)触发,第三个元素默认为false,即默认事件在冒泡阶段触发
(2)目标阶段(事件到达目标元素,触发事件处理器)
(3)冒泡阶段(目标元素 - 最外层父元素 - document - window)
例如,当用户点击一个按钮时,事件首先在按钮上触发,然后冒泡到它的父元素、祖先元素,直到到达 document 元素。
btn.addEventListener("click" , function(event){
event.stopPropagation();
})
5. 事件委托
(1)基于事件冒泡,原理是将事件监听器绑定到父元素上,这样子元素的处理事件可以通过事件冒泡机制由父元素捕获处理。
(2)优化性能,假设有成千上百个按钮,逐个绑定事件监听器会消耗大量内存,如ul和li就可以使用事件委托。
(3)动态添加元素,事件监听器被绑定到父元素上,可以随意添加子元素,后续都能触发事件。
操作DOM元素
除了上述获取元素+给元素绑定监听器+触发事件操作DOM元素外,还有一些常用属性和方法
document.getElementById('id').textContent
document.getElementById('id').innerText
document.getElementById('id').innerHTML
document.getElementById('id').outerHTML
document.getElementById('id').value
document.getElementById('id').style.color
document.getElementById('id').classList.add('active')
document.getElementById('id').getAtrribute('id')
document.getElementById('id').setAtrribute('class','myClass')
document.getElementById('id').hasAtrribute('href')
document.getElementById('id').focus()
setTimeout和setInterval(两者用法一致)
setTimeout 延迟xx毫秒后执行回调函数
setInterval 间隔xx毫秒重复执行一次回调函数
const timeId = setTimeout(function(a, b){} , 2000 , a , b)
clearTimeout(timeId)
try...catch
用于捕获错误
try{
}catch(error){
}
promise
1. Promise有三种状态:pendding fulfilled rejected
2. Promise对象是一个构造函数,用来生成Promise实例。接收一个函数作为参数,而这个函数的参数为resolve和reject函数,resolve将pendiing变为fulfilled,可以传入一个成功值给resolve,表示异步操作成功;reject将pendding变为rejected,可以传入一个失败值给reject,表示异步操作失败。
const promise = new Promise((resolve,reject) =>{
if(异步操作成功){
return resolve(value)
}else{
return reject(error)
}
})
关于传入resolve和reject的值的类型,可以是字符串,也可以是其他类型,reject通常传入一个error对象的实例,resolve也可以传入一个promise
一般调用完resolve和reject之后promise的任务就完成了,确保不会再执行下面的语句,最好给其加上return。
3. Promise.prototpe.then()
接收两个回调函数作为参数,第一个回调是上一个promise对象状态为resolved时调用,第二个回调是上一个promise对象为rejected时调用,两个回调都接收上一个promise中传入resolve/reject函数的值作为参数。两个回调不一定都要提供。
then两个回调中的return值,就作为下一个then的传入值
promise.then(value=>{
console.log(value)
return "then.value"
},error=>{
console.log(error)
return "then.error"
})
4. Promise.prototype.catch() == .then(null,rejection)
用于捕获Promise对象reject返回的值,相当于then的第二个操作
catch能捕获promise的错误也能捕获then的错误。promise的错误有冒泡性质,会一直向后传递,直至被捕获。一般不用then的第二个参数,用catch代替
promise.then(value=>{
console.log(value)
return "then.value
}).catch(error=>{
console.log(error)
return "catch.error"
})
5. Promise.prototype.finally()
无论成功失败在Promise执行结束后执行,做一些清理工作
promise.then(value=>{}).catch(error=>{}).finally(()=>{})
6. 抛出3种错误写法
const promise = new Promise((resolve,reject)=>{
throw new Error('error')
})
// try...catch也主要用于捕捉同步错误
const promise = new Promise((resolve,reject)=>{
try{
throw new Error('error')
}catch(e){
reject(e)
}
})
const promise = new Promise((resolve,reject)=>{
reject(new Error('error'))
})
promise.catch((error)=>{
console.log(error) // Error:error
})
7. Promise.all
接收一个数组/Iterator接口的,用于将多个promise实例,包装成一个新的promise
const p = Promise.all([p1,p2,p3])
当p1,p2,p3都为fulfilled时,p才为fulfilled
当有一个为rejected时,p就为rejected
const p1 = new Promise((resolve,reject)=>{
resolve('success')
}).then(value=>{
console.log(value)
}).catch(error=>{
console.log(error)
})
const p2 = new Promise((resolve,reject)=>{
reject('error')
}).then(value=>{
console.log(value)
}).catch.(error=>{
console.log(error)
})
Promise.all([p1,p2]).then((value=>{
console.log(value) // ["success","error"]
})).catch(error=>{
console.log(error) // 并不会捕获p2的错误,因为p2自身有catch已捕获错误并返回一个成功的promise。若p2没有catch,promise.all就变成调用reject(), 则会触发promise.all.catch,输出就为单独的error
})
8. Promise.resolve()
Promise.resolve('success') 等价于
new Promise((resolve)=>{
resolve('success')
})
9. Prmosie.reject()
Promise.reject('error') 等价于
new Promise((reject)=>{
reject('error')
})
aysnc...await (基于promise)
1. aysnc 定义异步函数的方式
async function foo(){}
async foo = function(){}
const foo = async()=>{}
const obj = {
async foo(){}
}
class Person{
construtor(){}
async foo(){}
}
const p = new Foo()
2. async...await
async: 定义一个异步函数,返回一个promise对象,return的值作为then的参数。顺序执行,遇到await停止,待await完成继续执行
await: 后面跟一个promise,返回promise的结果,如果没有跟promise就返回对应值,相当于return。所以await最好用一个try..catch包裹捕捉错误,不然await的promise出错会被async promise调用的catch捕捉,影响判断。只能用在async中。
async funtion foo(){
try{
await p1()
await p2()
}catch(error){
console.log(error)
}
}
如果想要p1 p2同时触发(请求并发执行),使用promise.all
proxy
用于修改某些默认行为,在访问目标对象之前设一层拦截
proxy的构造和方法
let proxy = new Proxy(obj,{
get:(obj,key)=>{},
set:(obj,key,value)=>{},
apply:(obj,this,...arg)=>{},
has:(obj,key)=>{},
....
})
Class
module语法: import export 动态导入
早期模块加载:CommonJs,同步加载,单一导出,require()运行时加载
如今模块加载:ES Modules,可异步加载,多种导出,静态导入
1. 导出export
export const name = 'muggle'
export function add(a,b){
return a+b
}
export {name,add}
export {name as studentName}
const name = 'muggle'
export name
2. 导入import
import {name,add} from './xxx.js'
import {name as studentName} from './xxx.js'
import * as student from './xxx.js'
student.name
student.add(1,2)
3. 默认导出export default
导入导出都不需要{},default就作为默认接口,所以export时不需要命名,import时可以任意命名,只能有一个default
const name = 'muggle'
export default name
export default function(a,b){
return a+b
}
import add from './xxx.js'
4. 动态导入import()
import('./xxx.js')
返回一个promise,可以按需加载,条件加载(放在if之后),动态url(使用模板字符串)
路由懒加载使用这种方式
this
闭包
正则表达式
同步异步中断
localstorage和sessionstorage
JSON.stringfy()将对象或值转化为字符串,常用于发送
JSON.parse()将JSON字符串解析为对象
两者用法一样,不同的是localStorage是持久性存储,需要手动清除,同一域下所有标签页共享数据。sessionStorage仅在当前标签页有效。
localStorage.setItem('itemName',JSON.stringfy(itemValue))
JSON.parse(localStorage.getItem('itemName'))
localStorage.removeItem('itemName')
localStorage.clear()