函数封装
- 判断一个数是否素数isPrimeNumber
- 判断一年是否闰年isLeapYear
- 根据操作符计算两个数的和差积商calc
- 选择排序selectSort
- 冒泡排序bubbleSort
基础编程
[
[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10],
[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20],
[21, 22, 23, 24, 25]
]
- 编写函数map(arr,myRule) 把数组中的每个元素按照myRule定义的规则映射为新元素,返回映射后的数组
- 手写一个自动倒计时的定时炸弹,按用户输入的秒数进行倒计时,用一颗【设置/拆除】按钮进行操作控制;
API默写(入参+返回值含义)
- HTTP协议请求头+响应头
- DOM增删改查(元素/内容/属性/样式)
- 正则相关的5大API
- 数组的批处理API:forEach,filter,map,every,some,find,reduce
const arr = [1,2,3,4,5,6,7,8,9]
动态页面
- 顶部通栏 + 返回顶部按钮
- Tab切换;
- 打字游戏:随机出现字母+自动计分+ESC退出;
- 将以下数据渲染为隔行变色的表格
var arr = [
{
name: 'Jack',
age: 18,
gender: '男'
},{
name: 'Rose',
age: 20,
gender: '女'
},{
name: 'Top',
age: 22,
gender: '男'
}
]
原型链练习:
- ES5/6两种语法实现Animal-Person-Student三级继承关系;
- 创建一个Student对象xiaoming,令其eat、think、study,这三个方法分别定义在Animal、Person、Student类中;
- Student覆写Object的toString方法,显式学生的姓名和专业;
- 精确打印xiaoming的类型;
- 判断xiaoming是不是Obect、Animal、Person、Student类的实例;
组件封装
画图
- 原型链
- HTTP缓存机制
- 事件循环原理图
- TCP三次握手/四次挥手原理图
- 浏览器渲染原理图
原理解释(场景+原理+API)
- 值传递/引用传递
- 事件传播/派发机制
- 事件委托
- 谈谈对原型链的理解
- 地址栏URL回车后发生了什么
- 同源策略,跨域方案
- 谈谈对JS异步/事件循环/JS单线程模型的理解
- Promise的原理是什么?如果没有Promise会不会自己封装一个
- 谈谈对闭包的理解
- 谈谈对函数式编程的理解(闭包、高阶函数、柯里化、组合、管道、函数缓存)
- JsonWebToken的理解
编程手撸
- 选择排序/冒泡排序
- 深拷贝
- 手撸函数防抖与节流
- 使用连环异步回调实现求5的阶乘:
function multiply(a,b,callback){
setTimeout(
()=>callback(a*b),
2000
)
}
√ 要求基于multiply函数,经过多次运算求得5的阶乘;
√ 使用Promise链式回调和async-await两种方式实现;
function getSearchParams(url){
}
ajax({
url,
dataType: "form",
data: { name: "admin", pwd: "123456" },
onSuccess: (data) => console.log(data),
onFail: (err) => console.log("err=", err),
});
ajaxPromise({
url: "http://www.httpbin.org/post",
method: "POST",
dataType: "form",
data: { name: "heige", pwd: "123456" },
})
.then((data) => console.log("data=", data))
.catch((err) => console.log("err=", err));



function score(name){
}
const stus = ["张三","李四","王五"...后面还有好几吨学生]
let name = "随便谁",key="随便什么学科",value=随便什么分数
设置任意学生的任意成绩
查询任意学生的全部成绩
const map = new MyMap()
map.set("name","张三")
map.set("age",20)
map.set("gender","男")
map.forEach(
(value,key)=>console.log(key,value)
)
for(let entry of map.entries()){
console.log(entry)
}
console.log(map.size)
console.log(map.get("name"))
console.log(map.get("age"))
console.log(map.has("name"))
console.log(map.has("myname"))
map.delete("age")
map.clear()
console.log(map.size)
const stus = [1,2,3...100]
const empties = [12,34,56,78]
let n = [1,96]以内的随机整数
console.log(pick(3))
function pick(n){
}
- 手撸观察者模式:实现彩票机周期性地发布【开售】【开奖】事件,玩家开售时下注,开奖时购买,一旦中奖则彩票机停止工作;
- 实现任意多个入参的函数fn的柯里化
const curry = (fn) => {
};
const add = (a, b, c, d) => a + b + c + d;
const cadd = curry(add);
console.log(cadd(1, 2, 3, 4));
console.log(cadd(1)(2)(3)(4));
console.log(cadd(1, 2)(3)(4));
const pipe = 实现之;
const compose = 实现之;
const len = (n) => (n + "").length;
const pow = (n) => n * n;
const cubicRoot = (n) => Math.cbrt(n);
console.log(compose(len, pow, cubicRoot)(1000));
function add(a, b) {
return a + b;
}
function multiply(a, b, callback) {
setTimeout(() => callback(a * b), 1000);
}
function promisify(fn) {
}
const padd = promisify(add)
padd(2,3).then(
value => console.log("value=",value)
)
const pmul = promisify(multiply);
pmul(2, 3)
.then((values) => {
console.log("value=", values);
return pmul(values[0], 4);
})
.then((values) => {
console.log("value=", values);
return pmul(values[0], 5);
})
.then((values) => console.log(values[0]));
var MongoClient = require("mongodb").MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url, function (err, db) {
if (err) throw err;
var dbo = db.db("runoob");
var myobj = { name: "菜鸟教程", url: "www.runoob" };
dbo.collection("site").insertOne(myobj, function (err, res) {
if (err) throw err;
console.log("文档插入成功");
db.close();
});
});
function getCollection(dbName, collectionName) {
}
function doCreate(dbName, collectionName, dataObj) {
}
function addUser(user) {
return doCreate(dbName, collectionName, user);
}
<!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>微框架3</title>
</head>
<body>
<p id="pMyname">{name}</p>
<p id="pMyage">{age}</p>
<p id="pGender">{gender}</p>
<script>
function defineReactive(data, keys = []) {
}
</script>
<script>
const data = {};
defineReactive(data, [
{ name: "age", listeners: [hMyage, pMyage] },
{ name: "name", listeners: [hMyname, pMyname] },
{ name: "gender", listeners: [pGender] },
]);
data.name = "黑哥";
data.age = 18;
data.gender = "男";
setInterval(() => {
data.name = Date.now();
data.age = data.age + 1;
data.gender = data.gender === "男" ? "女" : "男";
}, 1000);
</script>
</body>
</html>