参考资料 前端面试宝典


// 对数组去重
cosnt mySet = new Set([3,1,4,1,5,9,2,6,5,3,5,8])
// 转化回数组
const norepeatArr = [...mySet]
mySet.add(value) //添加元素
mySet.has(value) //判断某元素是否存在
mySet.size //元素数量
const contacts = new Map()
//设置或覆盖key-value
contacts.set(‘Jessie’, {phone: “213-555-1234”, address: “123 N 1st Ave”})
contacts.has(‘Jessie’) //查询key是否存在
contacts.get(‘Hilary’) //查询key对应的value
contacts.delete(‘Raymond’) //删除key-value
contracts.size //查询键值对的数量
//ajaxApi(url,parmas)的返回值是promise对象
//阻塞等待promise对象resolve数据出来
const data = await ajaxApi(url,parmas)
async function fn(){//内含await}
async ()=>{//内含await}
const fn = async ()=>{//内含await}
async fn(){
try{
// ajaxApi(url,parmas)的返回值是promise对象
// 如果promise毁约(reject),则错误信息由try-catch的catch获得
const data = await ajaxApi(url,parmas)
}catch(err){
//此处的err即promise所reject出的错误信息
hanleErr(err)
}
}
/* 子组件App进去 增强型的父组件XApp出来 */
const withMouse = (App) => {
class XApp extends Component {
constructor(props) {
super(props);
// 为子组件注入响应式数据x,y
this.state = {
x: 0,
y: 0,
};
}
/* 鼠标移动动态修改状态x,y的值 */
onMouseMove = (e) => {
this.setState(() => ({
x: e.pageX,
y: e.pageY,
}));
};
render() {
// 在此以外做的一切事情都是增强
// return
return (
// 给子组件的顶层DOM添加鼠标移动监听器
<div onMouseMove={this.onMouseMove}>
{/* 为子组件注入响应式数据x,y */}
{/* */}
<App {...this.props} {...this.state} />
</div>
);
}
}
// 普通的App进来 增强型App出去
// 增强1:在顶层DOM身上绑定了鼠标移动事件监听器
// 增强2:注入了响应式数据x,y即鼠标实时移动到的位置
return XApp;
};
import React, { Component } from 'react'
/* 对鼠标移动的state与事件的封装提取 */
class Mouse extends Component {
constructor(props) {
super(props);
// 老鼠baby自带响应式数据
this.state = {
x: 0,
y: 0
}
}
/* 在DOM事件中改变响应式数据 */
onMouseMove = (e) => {
this.setState({
x: e.pageX,
y: e.pageY
})
}
render() {
return (
// 老鼠baby自带DOM事件监听——用以动态改变响应式数据
<div onMouseMove={this.onMouseMove}>
{/* 拿出我妈给我的renderFn(x,y)执行得到DOM */}
{this.props.renderFn(this.state.x, this.state.y)}
</div>
)
}
}
class App extends Component {
render() {
return (
<div>
{this.props.name}
<br />
{/* 将一只老鼠子组件放在此处 即相当于把【实时显式鼠标移动位置】放在这 */}
{/* { height: "1000px", backgroundColor: "#eee" }}>鼠标实时位置:{x},{y} */}
<Mouse
// 告诉我的baby拿到响应式数据x,y后如何渲染JSX
renderFn={
(x, y) => <div style={{ height: "1000px", backgroundColor: "#eee" }}>鼠标实时位置:{x},{y}</div>
}
/>
</div>
)
}
}
export default App
v-auth="3"当用户的等级不足3时将该按钮disable掉或隐藏掉;WithCustomAuth(MyButton,3)在返回JSX的时候使用条件渲染function WithCustomAuth(Com,level){
function Parent(props){
reurn ({
authFromRedux >= level
? <Com {...props} />
: <a href="/login">登录</a>
})
}
return Parent
}
var app = require('express')();
var server = require('http').Server(app);
var WebSocket = require('ws');
// 服务端监socket监听在8080 等待客户端连接
var wss = new WebSocket.Server({ port: 8080 });
// 准备客户端存储对象
const clients = {}
/* 有客户端请求接入 入参ws即为接入的客户端socket对象 */
wss.on('connection', function connection(ws) {
console.log('server: receive connection from client');
// 将该客户端存下来 时间戳:socket
clients[Date.now()] = ws
console.log("clients",Object.keys(clients));
// 接收到该客户端发来的消息
ws.on('message', function incoming(message) {
console.log('message',message);
ws.send('got it:'+message);
// 转发给它想要发送的其它客户端
const [to,msg] = message.toString().split(":")
clients[to*1].send(message.toString())
});
// 该客户端主动断开连接
ws.on("close",function(code,reason){
console.log("客户端已断开连接");
})
// 与该客户端的连接发送错误
ws.on("error",function(err){
//处理错误
})
// 立刻给刚刚接入的客户端发送消息
ws.send('welcome!');
});
/* 在http的3000端口返回页面给客户端 */
app.get('/', function (req, res) {
res.sendfile(__dirname + '/index.html');
});
app.listen(3000);
客户端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<input type="text" placeholder="please enter..." id="ipMsg">
<button id="btn">发送消息</button>
<button id="btnClose">断开连接</button>
<script>
// 发起远程连接请求websocket长连接
var ws = new WebSocket('ws://localhost:8080');
// 连接成功时打印一下
ws.onopen = function () {
console.log('ws onopen');
// ws.send('from client: hello');
};
// 收到服务端的消息时打印一下
ws.onmessage = function (e) {
console.log('ws onmessage');
console.log('from server: ' + e.data);
};
// 点击按钮给服务端发送消息
btn.onclick = function(e){
ws.send(ipMsg.value);
}
// 点击按钮断开与服务端的连接
btnClose.onclick = function(e){
ws.close()
console.log("连接已断开");
}
</script>
</body>
</html>
function Parent(props){
const callMe = (sonFn)=>sonFn()
return (
<>
<Son callback={callMe}>
</>
)
}
function Son({callback}){
const sonFn = (sonFn)=>alert('老爸调用到我了')
return (
<>
<button onClick={callback(sonFn)}>让父组件调用我的函数</button>
</>
)
}
map.set(key,value),let value = map.get(key),map.delete(key),map.size等
class MyMap {
constructor(){
this.dataObj = {}
this.size = 0
}
set(key,value){
if(!this.dataObj.hasOwnProperty(key)){
this.size ++
}
this.dataObj[key] = value
}
get(key){
return this.dataObj[key]
}
delete(key){
delete this.dataObj[key]
this.size --
}
}
const mm = new MyMap()
mm.set("name","OOP小菜鸡")
console.log(mm.get("name"));
console.log(mm);
import {Button} from "antd"
//同步引入 编译时引入 无论用户访问不访问都引入
//import Home from "@/views/Home.vue"
//异步加载 运行时加载 用户访问该页面时才临时去加载
// 注释部分代表Webpack打包时将该组件打包为about.js这样一个异步chunk
const About = ()=>import(/* webpackChunkName: "about" */,"@/views/About.vue")
mode:productionfunction CommentItem({item}){
return <>
<h3>item.username</h3>
<span>item.date</span>
{/*渲染item的子回复replies*/}
{
item.replies.map(
it=><CommentItem item={it}/>
)
}
</>
}
[参考链接] (https://juejin.cn/post/7087904975400992798)
“这不需要测试,肯定是好的,不用担心”
