[toc]
#### 1.手写 forEach
forEach((item, index, arr)),无返回值
```js
Array.prototype.mForEach = function (calback) {
for (let i = 0; i < this.length; i++) {
calback(this[i], i, this);
}
};
```
#### 2.手写 map
map((item, index, arr)),返回新数组
```js
Array.prototype.mMap = function (callback) {
let res = [];
for (let i = 0; i < this.length; i++) {
res.push(callback(this[i], i, this)); // 每次都往 res push callback的返回值
}
return res;
};
```
#### 3.手写filter
filter 返回所有满足条件的值
```js
// filter
Array.prototype.mFilter = function (callback) {
let res = [];
for (let i = 0; i < this.length; i++) {
callback(this[i], i, this) && res.push(this[i]);
}
return res;
};
```
#### 4.手写every
全部满足则返回true,有一项不满足则return false,中断遍历
```js
Array.prototype.mEvery = function (callback) {
for (let i = 0; i < this.length; i++) {
if (!callback(this[i], i, this)) {
return false;
}
}
return true;
};
```
#### 5.手写some
只要有一个为 true ,则返回 true,中断
```js
Array.prototype.mSome = function (callback) {
for (let i = 0; i < this.length; i++) {
if (callback(this[i], i, this)) return true;
}
return false;
};
```
#### 6.手写 find
找到第一位
```js
Array.prototype.mFind = function (callback) {
for (let i=0; i<this.length; i++) {
if(callback(this[i], i, this)) return this[i]
}
}
```
#### 7.手写 findIndex
找到第一位的index
```js
Array.prototype.mFindIndex = function (callback) {
for (let i=0; i<this.length; i++) {
if(callback(this[i], i, this)) return i
}
}
```
#### 8.手写reduce
cur 从第一项开始
每次将 callback 中的返回值作为下一次的 pre
如果传了第二个参数,则 pre 从传的参开始, cur 从第0项开始
如果没传第二个参数,则 pre 从第0项开始,cur 从第0项开始
返回最终的 pre
```js
Array.prototype.mReduce = function (callback, ...args) {
let start = 0
prev = null
if (args.length === 0) {
prev = this[0]
start = 1
} else {
pre = args[0]
}
for (let i=start; i<this.length; i++) {
prev = callback(prev, this[i], i, this)
}
return prev
}
```
#### 9.手写fill
fill(value, start, end) 会修改原数组,也会返回新数组
如果end为负数,则表示倒数第几位
```js
Array.prototype.mFill = function (initValue, start=0, end=this.length) {
// 从倒数开始
if (end < 0) {
end = this.length + end
}
for (let i=start; i<end; i++) {
this[i] = initValue
}
return this
}
```
#### 10.join
```js
Array.prototype.mJoin = function(s = ',') {
let str = ''
for(let i=0; i<this.length; i++) {
if (i === this.length - 1) {
str = str + this[i]
} else {
str = str + this[i] + s
}
}
return str
}
```
#### 11.拍平 flat
```js
let arr = [1, 2, [3, 4], [5, 6, [7, 8]]];
Array.prototype.mFlat = function (num = Infinity) {
let arr = this
let i = 0 // 展开层级
while(arr.some(item => Array.isArray(item))) {
arr = [].concat(...arr)
i++
if (i>=num) {
break
}
}
return arr
}
```
- JavaScript
- 1.数组
- 1.数组Api
- 2.判断是否为数组
- 3.手写forEach, map, filter, every, some, reduce
- 4.类数组转化为数组
- 5.reduce实现compose函数
- 7.sort实现与排序
- 2.类型
- 1. let, const, var
- 1. Number 数字
- 3. Boolean 布尔值
- 4. undefined和null
- 2. String 字符串
- 1. 字符串方法
- 2. 操作字符串实例
- 3. startWith&字符串模板
- 5. 类型转换
- 4.深拷贝与浅拷贝
- 7.Symbol类型
- typeof 和 instanceof
- Set
- Map
- 3.this,原型,原型链
- 1.this
- 2.手写call, apply, bind
- 3.模拟new操作符
- 4.手写Object.create
- 4.对象
- proxy代理
- defineProperty数据劫持
- 4.模块化
- 5.http
- ECMAScript
- 0. 调试&兼容性&错误处理
- 3. 运算
- 4. 对象(三种引用类型&正则)
- 1. 数组
- 1. 数组的六种遍历方法
- 2. 数组的增删查改
- 3. 操作数组(展开、join、排序...)
- 4. 补充五种ES6方法
- 2. 函数
- 3. JSON
- 4. 正则
- 附:正则表达式特殊字符
- 5. 面向对象
- es6的继承
- 6. 控制语句
- 7. ajax
- 8. promise
- 9. 闭包
- 1. 闭包产生三个相同随机数
- 2. 闭包实现点赞
- 10.箭头函数
- _isEmpty
- Object.assign(target, obj, obj)
- Math.ceil, round,
- DOM
- 3.1 节点
- 3.2 DOM操作元素
- 3.3 fragment DOM碎片
- 5. 事件
- BOM
- 1. window
- 2. navigation检测访问类型
- 3. screen窗口大小内容大小
- 4. history
- promise
- 1.promise使用
- 2.手写promise
- 3.手写promise.all
- 生成器generator
- 1.generator的使用
- 2.简单实现generator
- 手写async await
- async/await
- 5.防抖节流
- 难点深入
- 1. 浏览器&js特点
- 2. JS堆栈与深浅拷贝
- 3. 详解a++和++a的区别
- 4. JS&jQuery获取元素的方法
- 5. NodeList和HTMLCollection区别
- 6. var与let的区别
- 7. this 与 bind call apply
- 8. get与post请求的区别
- 9. 闭包
- Dom demo
- 1. JQuery--页面点击切换效果
- 2. JQuery-load实现头尾封装
- 3. JS--添加移除属性名
- 4. jQuery--eq()与index()
- 5. table隔行变色
- 6. 改变函数this的指向
- 7. jQuery each遍历
- ECMAScript demo
- 1. 斐波那契数列
- 2. 数组去重
- 3. 自调用函数生成随机数
- 浏览器、DOM
- 1.从输入url到页面加载的全过程
- 2.http与https
- 3.v8垃圾回收机制
- 4.dom事件
- 5.跨域
- 6.强缓存和协商缓存
- 3.eventloop,宏任务和微任务
- 1.什么是任务
- 2.执行顺序例题
- 3.执行顺序例题,添加script
- 4.执行顺序,多个宏任务
- 4.HTTP
- 1.经典五层模型
- 2.http发展历史
- 3.http三次握手
- 4.URI,URL,URN
- 1.http协议
- 2.https
- http状态码
- 5.script标签defer和async区别
- cookie
- connect: keep-alive