手写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);
}