Skip to content

Commit 1487e22

Browse files
committed
fix: --
1 parent 3abef74 commit 1487e22

File tree

12 files changed

+357
-0
lines changed

12 files changed

+357
-0
lines changed

js-code/js/_filter.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// 实现数组的filter方法
2+
Array.prototype._filter = function(fn) {
3+
if(typeof fn !== 'function') {
4+
throw Error('参数必须是一个函数')
5+
}
6+
const res = []
7+
for(let i = 0, len = this.length; i < len; i++) {
8+
fn(this[i]) && res.push(this[i])
9+
}
10+
return res
11+
}
12+
13+
let arr = [1,2,3,4,5];
14+
// let newArr = arr.filter((item) => {
15+
// return item > 3
16+
// })
17+
// console.log(newArr, arr) // [ 4, 5 ] [ 1, 2, 3, 4, 5 ]
18+
19+
// console.log(arr._filter((item) => {
20+
// return item > 3
21+
// }), arr)// [ 4, 5 ] [ 1, 2, 3, 4, 5 ]

js-code/js/_flat.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// 实现数组的flat方法
2+
function _flat(arr, depth) {
3+
if(!Array.isArray(arr) || depth <= 0) {
4+
return arr
5+
}
6+
return arr.reduce((prev, cur) => {
7+
if(Array.isArray(cur)) {
8+
return prev.concat(_flat(cur, depth-1))
9+
}else{
10+
return prev.concat(cur)
11+
}
12+
},[]);
13+
}
14+
15+
// let arr = [1, [2, [3, 4]]];
16+
// console.log(_flat(arr, 3))
17+
18+
// Debugger attached.
19+
// [ 1, 2, 3, 4 ]
20+
// Waiting for the debugger to disconnect...

js-code/js/_map.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// 实现数组的map方法
2+
3+
Array.prototype._map = function(fn) {
4+
if(typeof fn !== 'function') {
5+
throw Error('参数必须是一个函数')
6+
}
7+
const res = []
8+
for(let i = 0, len = this.length; i < len; i++) {
9+
res.push(fn(this[i]))
10+
}
11+
return res
12+
}
13+
14+
// let arr = [1,2,3,4,5];
15+
// let newArr = arr.map((item) => {
16+
// return item * 3
17+
// })
18+
// console.log(newArr, arr) // [ 3, 6, 9, 12, 15 ] [ 1, 2, 3, 4, 5 ]
19+
20+
// console.log(arr._map((item) => {
21+
// return item * 3
22+
// }), arr)// [ 3, 6, 9, 12, 15 ] [ 1, 2, 3, 4, 5 ]

js-code/js/_push.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// 实现数组的push方法
2+
3+
Array.prototype.myPush = function() {
4+
for(let i = 0; i < arguments.length; i++) {
5+
this[this.length] = arguments[i];
6+
}
7+
return this.length;
8+
}
9+
10+
let arr = [1,2]
11+
console.log(arr.myPush(3), arr) // 3 [1,2,3]

js-code/js/ajax.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// AJAZ 是Asynchronous JavaScript and XML的缩写,指的是通过JavaScript的异步通信,从服务器获取XML文档从中提取数据,再更新当前网页的对应部分,而不用刷新整个网页。
2+
3+
// 创建AJAX请求的步骤:
4+
/**
5+
6+
1. 创建一个XMLHttpRequest对象
7+
2. 在这个对象上使用open方法创建一个HTTP请求,open方法所需要的参数是请求的方法,请求的地址,是否异步和用户的认证信息
8+
3. 在发起请求前,可以为这个对象添加一些信息和监听函数。比如说可以通过setRequestHeader方法来为请求添加头信息。还可以为这个对象添加一个状态监听函数。一个XMLHttpRequest对象一共有5个状态,当它的状态变化时会触发onreadystatechange事件,可以通过设置监听函数,来处理请求成功后的结果。
9+
4. 当对象的readyState变为4的时候,代表服务器返回的数据接收完成,这个时候可以通过判断请求的状态,如果状态是2XX或者304的话则代表返回正常。这个时候就可以通过response中的数据来对页面进行更新了。
10+
5. 当对象的属性和监听函数设置完成后,最后调用send方法来向服务器发起请求,可以传入参数作为发送的数据体。
11+
12+
*/
13+
14+
const SERVER_URL = '/server';
15+
let xhr = new XMLHttpRequest();
16+
// 创建Http请求
17+
xhr.open('GET', SERVER_URL, true);
18+
// 设置状态监听函数
19+
xhr.onreadystatechange = function() {
20+
if(this.readyState !== 4) return;
21+
// 当请求成功时
22+
if(this.status === 200) {
23+
handle(this.response);
24+
}else{
25+
console.error(this.statusText);
26+
}
27+
};
28+
// 设置请求失败时的监听函数
29+
xhr.onerror = function() {
30+
console.log(this.statusText);
31+
};
32+
// 设置请求头信息
33+
xhr.responseType = 'json';
34+
xhr.setRequestHeader('Accept', 'application/json');
35+
// 发送Http请求
36+
xhr.send(null)
37+

js-code/js/copy.js

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
// 浅拷贝,一个新的对象 对 原始对象的属性值进行精确地拷贝,如果拷贝的是基本数据类型,拷贝的就是基本数据类型的值,如果是引用数据类型,拷贝的就是内存地址。
2+
// 如果其中一个对象的引用内存地址发生改变,另一个对象也会发生变化。
3+
4+
// 1.Object.assign()是es6中对象的拷贝方法,接受的第一个参数是目标对象,其余参数是源对象,用法:Object.assign(target, source_1, ...),该方法可以实现浅拷贝,也可以实现一维数组的深拷贝。
5+
6+
/**
7+
1.如果目标对象和源对象有同名属性,或者多个源对象有同名属性,则后面的属性会覆盖前面的属性。
8+
2.如果该函数只有一个参数,当参数为对象时,直接返回该对象;当参数不是对象时,会先将参数转为对象然后返回。
9+
3.因为null和undefined不会转化为对象,所以第一个参数不能为null或undefined,会报错。
10+
11+
let target = {a: 1}
12+
let object2 = {b: 2}
13+
let object3 = {c: 3};
14+
Object.assign(target, object2, object3);
15+
console.log(target); // {a: 1, b: 2, c: 3};
16+
17+
*/
18+
19+
/**
20+
21+
2.扩展运算符
22+
使用扩展运算符可以在 构造字面量对象 的时候,进行属性的拷贝。
23+
let cloneObj = {...obj}
24+
25+
let obj1 = {a:1,b:{c:1}}
26+
let obj2 = {...obj1};
27+
obj1.a = 2;
28+
console.log(obj1); //{a:2,b:{c:1}}
29+
console.log(obj2); //{a:1,b:{c:1}}
30+
obj1.b.c = 2;
31+
console.log(obj1); //{a:2,b:{c:2}}
32+
console.log(obj2); //{a:1,b:{c:2}}
33+
34+
*/
35+
36+
/**
37+
数组方法实现数组浅拷贝
38+
Array.prototype.slice
39+
这个方法可以从已有数组中返回选定的元素,array.slice(start, end), 该方法不会改变原始数组。要赋值新变量。
40+
41+
该方法有两个参数,如果两个参数都不屑,就可以实现一个数组的浅拷贝。
42+
43+
let arr = [1,2,3,4];
44+
console.log(arr.slice()); // [1,2,3,4]
45+
console.log(arr.slice() === arr); // false
46+
47+
*/
48+
49+
/**
50+
Array.prototype.concat
51+
concat()方法用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。
52+
53+
该方法有两个参数,两个参数都可选,如果两个参数都不写,就可以实现一个数组的浅拷贝。
54+
55+
56+
let arr = [1,2,3,4];
57+
console.log(arr.concat()); // [1,2,3,4]
58+
console.log(arr.concat() === arr); //false
59+
*/
60+
61+
// 浅拷贝
62+
function shallowCopy(object) {
63+
// 只拷贝对象
64+
if(!object || typeof object !== 'object') return;
65+
// 根据object的类型判断是新建一个数组还是对象
66+
let newObject = Array.isArray(object) ? [] : {};
67+
// 遍历object,并且判断是object的属性才拷贝
68+
for(let key in object) {
69+
if(object.hasOwnProperty(key)) {
70+
newObject[key] = object[key];
71+
}
72+
}
73+
return newObject;
74+
}

js-code/js/curry.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// 函数柯里化的实现
2+
// 函数柯里化指的是一种将使用多个参数的一个函数转换成一些列使用一个参数的函数的技术
3+
4+
function curry(fn, args) {
5+
// 获取函数需要的参数长度
6+
let length = fn.length
7+
args = args || [];
8+
return function() {
9+
let subArgs = args.slice(0);
10+
// 拼接得到现有的所有参数
11+
for(let i = 0; i < arguments.length; i++) {
12+
subArgs.push(arguments[i]);
13+
}
14+
// 判断参数的长度是否已经满足函数所需参数的长度
15+
if(subArgs.length>=length) {
16+
// 如果满足,执行函数
17+
return fn.apply(this, subArgs);
18+
} else {
19+
// 如果不满足,递归返回柯里化的函数,等待参数的传入
20+
return curry.call(this, fn, subArgs);
21+
}
22+
};
23+
}
24+
25+
function curryES6(fn, ...args) {
26+
return fn.length <= args.length ? fn(...args) : curry.bind(null, fn, ...args);
27+
}

js-code/js/dateFormat.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
const dateFormat = (dateInput, format) => {
2+
var day = dateInput.getDate()
3+
var month = dateInput.getMonth() + 1
4+
var year = dateInput.getFullYear()
5+
format = format.replace(/yyyy/, year)
6+
format = format.replace(/MM/, month)
7+
format = format.replace(/dd/, day)
8+
return format
9+
}
10+
11+
// dateFormat(new Date('2020-12-01'), 'yyyy/MM/dd') // 2020/12/01
12+
// dateFormat(new Date('2020-04-01'), 'yyyy/MM/dd') // 2020/04/01
13+
// dateFormat(new Date('2020-04-01'), 'yyyy年MM月dd日') // 2020年04月01日

js-code/js/deepcopy.js

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
// 浅拷贝:将一个对象的属性值复制到另一个对象,如果有的属性的值为引用类型的话,那么会将这个引用的地址复制给对象,因此两个对象会有同一个引用类型的引用。
2+
// 浅拷贝可以使用Object.assign, 扩展运算符,Array.prototype.slice,Array.prototype.concat
3+
4+
5+
/**
6+
7+
深拷贝:如果遇到属性值为引用类型的时候,它新建一个引用类型并将对应的值复制给它,因此对象获得的一个新的引用类型而不是一个原有类型的引用。
8+
9+
深拷贝对于一些对象可以使用JSON的两个函数来实现,但是由于JSON的对象格式化比js的对象格式更加严格,所以如果属性值里边出现函数或者Symbol类型的值时,会转换失败
10+
11+
JSON.stringify()
12+
13+
JSON.parse(JSON.stringify(obj))是目前比较常用的深拷贝方法之一
14+
15+
原理是利用JSON.stringify将js对象序列化(JSON字符串),再使用JSON.parse来反序列化(还原)js对象。
16+
17+
这个方法可以简单粗暴的实现深拷贝,但是还存在问题,拷贝的对象中如果有函数,undefined,symbol,当使用过JSON.stringify()进行处理之后,都会消失。
18+
19+
let obj1 = { a: 0,
20+
b: {
21+
c: 0
22+
}
23+
};
24+
let obj2 = JSON.parse(JSON.stringify(obj1));
25+
obj1.a = 1;
26+
obj1.b.c = 1;
27+
console.log(obj1); // {a: 1, b: {c: 1}}
28+
console.log(obj2); // {a: 0, b: {c: 0}}
29+
30+
函数库lodash的_.cloneDeep方法
31+
该函数库也有提供_.cloneDeep用来做 Deep Copy
32+
33+
var _ = require('lodash');
34+
var obj1 = {
35+
a: 1,
36+
b: { f: { g: 1 } },
37+
c: [1, 2, 3]
38+
};
39+
var obj2 = _.cloneDeep(obj1);
40+
console.log(obj1.b.f === obj2.b.f);// false
41+
42+
43+
*/
44+
45+
function deepCopy(object) {
46+
if(!object || typeof object !== 'object') return;
47+
let newObject = Array.isArray(object) ? [] : {}
48+
for(let key in object) {
49+
if(object.hasOwnProperty(key)) {
50+
newObject[key] = typeof object[key] === 'object' ? deepCopy(object[key]) : object[key]
51+
}
52+
}
53+
return newObject;
54+
}

js-code/js/flatten.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// let arr = [1, [2, [3, 4, 5]]];
2+
3+
// function flatten(arr) {
4+
// let result = [];
5+
// for(let i = 0; i < arr.length; i++) {
6+
// if(Array.isArray(arr[i])) {
7+
// // flatten(arr[i])
8+
// result = result.concat(flatten(arr[i]))
9+
// } else {
10+
// result.push(arr[i])
11+
// }
12+
// }
13+
// return result;
14+
// }
15+
16+
// function flattenReduce(arr) {
17+
// return arr.reduce(function(prev, next){
18+
// return prev.concat( Array.isArray(next) ? flatten(next) : next)
19+
// }, [])
20+
// }
21+
22+
/**
23+
flat 方法的语法:arr.flat([depth])
24+
25+
*/
26+
27+
function flatten(arr) {
28+
return arr.flat(Infinity);
29+
}

js-code/js/promise-ajax.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// promise封装ajax
2+
function getJSON(url) {
3+
// 创建一个promise对象
4+
let promise = new Promise(function(resolve, reject) {
5+
let xhr = new XMLHttpRequest();
6+
// 创建一个http请求
7+
xhr.open('GET', url, true);
8+
// 设置状态的监听函数
9+
xhr.onreadystatechange = function() {
10+
if(this.readyState !== 4) return;
11+
// 当请求成功或失败时,改变promise的状态
12+
if(this.status === 200) {
13+
resolve(this.response)
14+
} else {
15+
reject(new Error(this.statusText))
16+
}
17+
};
18+
// 设置错误监听函数
19+
xhr.onerror = function() {
20+
reject(new Error(this.statusText));
21+
};
22+
// 设置响应的数据类型
23+
xhr.responseType = 'json'
24+
// 设置请求头信息
25+
xhr.setRequestHeader('Accept', 'application/json');
26+
// 发送http请求
27+
xhr.send(null)
28+
})
29+
}

js-code/js/setArr.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
2+
const setArr = function(array) {
3+
return Array.from(new Set(array))
4+
}
5+
6+
// const array = [1, 2, 3, 5, 1, 5, 9, 1, 2, 8];
7+
// console.log(setArr(array)) // [1, 2, 3, 5, 9, 8]
8+
9+
// es5: 使用map存储不重复的数字
10+
function uniqueArray(array) {
11+
let map = {}
12+
let res = []
13+
for(let i = 0; i < array.length; i++) {
14+
if(!map.hasOwnProperty([array[i]])) { // 对象属性[]
15+
map[array[i]] = 1
16+
res.push(array[i])
17+
}
18+
}
19+
return res
20+
}

0 commit comments

Comments
 (0)