1、实现new
function myNew(fn,...args){
var instance = Object.create(fn.prototype)
var result = fn.call(instance,...args)
return typeof result==='object' ? result : instance
}
2、递归实现深拷贝
function deepClone(source){
const targetObj = source.constructor === Array ? [] : {}
for(let keys in source){
if(source.hasOwnProperty(keys)){
if(sourse[keys] && typeof source[keys] === 'object'){
targetObj[keys] = source[keys].constructor === Array ? [] : {}
targetObj[keys] = deepClone(source[keys])
}else{
targetObj[keys] = sourse[keys]
}
}
}
return targetObj
}
3、函数柯里化
function curry (fn){
var outerargs = Array.prototype.slice.call(arguments,1)
return function(){
var innerargs = Array.prototype.slice.call(arguments)
var finalargs = outerargs.concat(innerargs)
return fn.apply(null,finalargs)
}
}
4、XHR请求
let xhr = new XMLHttpRequest()
xhr.onreadystatechange = function(){
if(xhr.readyState === 4 && xhr.status === 200){
p.innerHTML = xhr.responseText
}
}
xhr.open('post','/post-server')
xhr.setRequestHeader('content-type','application/x-www-form-urlencoded');
xhr.send('class=1234&style=你好')
-----------------------------------
xhr.open('get' , '/get-server?name=张三&age=20');
xhr.send();
5、jsonp
function jsonp({ url, params, callback }) {
return new Promise((resolve, reject) => {
let script = document.createElement('script')
window[callback] = function(data) {
resolve(data)
document.body.removeChild(script)
}
params = { ...params, callback } // wd=b&callback=show
let arrs = []
for (let key in params) {
arrs.push(`${key}=${params[key]}`)
}
script.src = `${url}?${arrs.join('&')}`
document.body.appendChild(script)
})
}
jsonp({
url: 'http://localhost:3000/say',
params: { wd: 'Iloveyou' },
callback: 'show'
}).then(data => {
console.log(data)
})
6、防抖
function debounce(fn,delay){
let timer = null
return function(){
let that = this
let args = arguments
if(timer){
clearTimerout(timer)
}
timer = setTimeout(() =>{
fn.apply(that,args)
},delay)
}
}
7、节流
function throttle(fn , delay){
let flag = true
return function(){
if(!flag )return
let that = this
let args = arguments
flag = false
setTimeout(()=>{
fn.apply(that , args)
flag = true //执行完函数 flag 是 true
} , delay)
}
}
8、call
Function.prototype.call = function (obj,...rest) {
//判断第一个参数是否是null或者undefined,如果是使其指向window
if(obj === null || obj === undefined) return this(...rest)
//给指定的对象添加一个临时方法,方法的函数就是要改变指向的函数
obj.temp = this
//执行方法,改变原来函数体中this的指向
const result = obj.temp(...rest)
//删除添加的临时方法
delete obj.temp
//返回执行结果
return result
}
}
9、apply / bind
//call与apply的没有什么大的差异,只有接受实参的形参数据类型不同,call接受的数值数据,而apply接受的数组数据.
Function.prototype.apply = function (obj,args) {
if(obj === null || obj === undefined) return this(...args)
obj.temp = this
const result = obj.temp(...args)
delete obj.temp
return result
}
//bind方法返回一个新函数,在新函数的内部利用call方法,调用了原来的函数,改变了this的指向.
Function.prototype.bind = function (obj,...args) {
const that = this
return function (...args2) {
return that.call (obj,...args,...args2)
}
}
}
10、寄生组合式继承
function Person(name){
this.name = name
}
Person.prototype.sayName = function(){
console.log("My name is " + this.name + ".");
}
function Student(name,age){
Person.call(this,name)
this.age = age
}
Student.prototype = object.create(Person.prototype)
Student.prototype.constructor = Student
Student.prototype.sayAge = function(){
console.log("My age is " + this.age + ".");
}
11、instance of
function myInstanceof(left, right) {
let prototype = right.prototype
left = left.__proto__
while (true) {
if (left === null || left === undefined)
return false
if (prototype === left)
return true
left = left.__proto__
}
}
12、数组去重
1、Set
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,
undefined, null,null, NaN,NaN,'NaN', 0, 0, 'a', 'a',{},{}];
function arr_unique1(arr){
return [...new Set(arr)];
//或者
//return Array.from(new Set(arr));
}
arr_unique1(arr);
2、forEach
function arr_unique4(arr){
var res = [];
arr.forEach((val,index)=>{
if( res.indexOf(val) === -1 ){
res.push(val);
}
});
return res;
}
console.log(arr_unique4(arr));
13、数组扁平化:将多维数组转化成一维数组
function flatten(arr) {
var res = [];
arr.map(item => {
if(Array.isArray(item)) {
res = res.concat(flatten(item));
} else {
res.push(item);
}
});
return res;
}
function flatten(arr) {
return arr.reduce((result, item)=> {
return result.concat(Array.isArray(item) ? flatten(item) : item);
}, []);
}
function flatten(arr) {
while(arr.some(item=>Array.isArray(item))) {
arr = [].concat(...arr);
}
return arr;
}
14、数组分块
function thunk(arr,size){
let result = [];
while(arr.length > size){
result.push(arr.splice(0,size))
}
arr.length && result.push(arr)
return result
}
15、回文字符串
let str = '上海自来水来自海上'
let str2 = 'sdfsdf上海自来水来自海上'
function isHuiWen(str) {
return str === str.split('').reverse().join('')
}
16、快速排序
function qucikSort(arr) {
// 递归结束条件
if(arr.length <= 1){
return arr; // 不满足条件的情况下,不拆分,返回原数组
}
// 1. 取中间值
let flag = Math.floor(arr.length / 2);
let flagValue = arr.splice(flag, 1)[0];
let leftArr = [];
let rightArr = [];
for (var i = 0; i < arr.length; i++) {
var arrItem = arr[i];
if(arrItem > flagValue){
rightArr.push(arrItem)
}else{ // <=
leftArr.push(arrItem)
}
}
// 递归: 注意点:必须有结束条件,否则就是死循环
leftArr = qucikSort(leftArr);
rightArr = qucikSort(rightArr);
return [...leftArr, flagValue, ...rightArr]
}
17、字符串中出现最多次数的
var arr = 'sfadsflkajerfnksdajdfnldjk'
var obj ={}
for(var i=0 ; i<arr.length ;i++){
if(obj[arr[i]]){
obj[arr[i]] += 1
}else{
obj[arr[i]] = 1
}
}
var max=0
var targetChar = ''
for(key in obj){
if(max < obj[key]){
max = obj[key]
targetChar = key
}
}
console.log(targetChar,max)