JS-手写方法

482 阅读2分钟

手写call方法

Function.prototype.newCall = function(context){
    if(context === null || context === undefined){
        context = window;
    }
    if(typeof context != "object" && typeof context!= "function"){
        context = Object(context)
    }
    var arr = Array.from(arguments).slice(1);
    var key = Date.now().toString(36);
    context[key] = this;
    eval("context[key]("+arr.toString()+")");
    delete context[key]
}

手写Tab切换

// 获取元素
var mTitle = document.getElementById('title');
var mCon = document.getElementById('con');
var mH2s = oTitle.getElementsByTagName("h2");
var mLis = oCon.getElementsByTagName("li");

// 减少读取次数
var mH2sLength = mH2s.length;

// 外边的for仅仅是为了给所有的h2绑定点击事件
for(var i = 0;i<mH2sLength;i++){
    mH2s[i].onclick = function(){
        // 内层的for是为了遍历所有的h2 判断哪一个是点击的h2
        for(var i=0;i<mH2sLength;i++){
            if(mH2s[i] === this){
                mH2s[i].classList.add("active");
                mLis[i].classList.add("show");
            }else{
                mH2s[i].classList.remove("active");
                mLis[i].classList.remove("show");
            }
        }
    }
}

手写斐波那契数列

/*
	需求require:使用一个数组,保存50长度的斐波那契数列值
	斐波那契数列前两个值是0和1
	0 1 1 2 3 5 8 13 21 34
*/
var arr = [0,1];
for(var i =2;i<50;i++){
    arr[i] = arr[i-1] + arr[i-2];
}
console.log(arr);

手写快排

var arr =[1,3,2,1,6,3,2,7,3,2,6,9,7,5,6];
function quickSort(arr){
    if(arr.length<=1){
        return arr;
    }
    var center = arr.pop();
    var left = [],
        right = [];
    arr.forEach(function(item,index){
        if(item>center){
            right.push(item);
        }else{
            left.push(item);
        }
    })
    var re = quickSort(left).concat(center,quickSort(right));
    return re;
}

手写冒泡

//手写冒泡
function maopao(arr){
    for(var i =0;i<arr.length;i++){
        for(var j = 0;j<arr.length-i;j++){
            if(arr[j]>arr[j+1]){
                var temp = arr[j+1];
                arr[j+1] = arr[j];
                arr[j] = temp;
            }
        }
    }
    return arr;
}


var arr = [1,2,5,2,3,2,6,3];
maopao(arr);

手写拼接时间戳(yyyy-mmm-dd hh:ms:ss)

function getTime(){
    var nowDate = new Date();
    var yy = nowDate.getFullYear();
    var mm = nowDate.getMonth()+1;
    var dd = nowDate.getDate();
    
    var hh = nowDate.getHours();
    var ms = nowDate.getMinutes();
    var ss = nowDate.getSeconds();
    var re = yy +"-"+ mm +"-"+ dd +" "+hh+":"+ms+":"+ss;
    console.log(re)
    
}
setInterval(function(){
    getTime()
},1000)

手写浅拷贝

var obj = {
    name:"小明",
    age:12,
    say:function(){
        console.log("会说");
    },
    skill:["篮球","足球","羽毛球"],
    score:{
        china:120,
        english:130,
        math:140
    }
}

var newObj = {}
for(var key in obj){
    newObj[key] = obj[key]
}

console.log(newObj);

手写深拷贝

var obj = {
    name:"小明",
    age:12,
    say:function(){
        console.log("会说");
    },
    skill:["篮球","足球","羽毛球"],
    score:{
        china:120,
        english:130,
        math:140
    }
}

function checkType(o){
    return Object.prototype.toString.call(o).slice(8,-1).toLowerCase();
}

function deepCopy(obj){
    if(checkType(obj) === "object"){
        var newObj = {};
    }else if(checkType(obj)==="Array"){
        var newObj = [];
    }else{
        return obj;
    }
    for(var key in obj){
        newObj[key] = deepCopy(obj[key]);
    }
    return newObj;
}

手写数组去重

数组去重方法1

`创建一个新数组,把值依次添加到新数组中,如果新数组已经存在,则忽略不再添加`

```js
var arr = [1,2,4,2,1,5,7,2,3,8,3,5,7];
var newArr = [];
arr.forEach(function(item,index){
    if(newArr.indexOf(item)===-1){
        newArr.push(item);
    }
})

数组去重方法2

for for嵌套

var arr = [1,2,4,2,1,5,7,2,3,8,3,5,7];
for(var i =0;i<arr.length;i++){
    for(var j = i+1;j<arr.length;i++){
        if(arr[i]===arr[j]){
            arr.splice(j,1);
            j--;
        }
    }
}

数组去重方法3

检测每一个值的第一次出现的位置 是不是当前值的下标,如果是则第一次出现,否则已经出现过了

var arr = [1,2,4,2,1,5,7,2,3,8,3,5,7];
arr.forEach(function(item,index){
    if(arr.indexOf(item)===index){
        newArr.push(item)
    }
})

数组去重方法4

var arr = [1,2,4,2,1,5,7,2,3,8,3,5,7];
var newArr = arr.filter(function(item,index){
    return arr.indexOf(item) === index;
})

手写随机数

function newRandom(a,b){
    return Math.floor(Math.random()*(b-a)+a);
}