String.prototype.firstAppear=function(){var obj ={},
len =this.length;for(var i =0; i < len; i++){if(obj[this[i]]){
obj[this[i]]++;}else{
obj[this[i]]=1;}}for(var prop in obj){if(obj[prop]==1){return prop;}}}
functionretSibling(e, n){while(e && n){if(n >0){if(e.nextElementSibling){
e = e.nextElementSibling;}else{for(e = e.nextSibling; e && e.nodeType !==1; e = e.nextSibling);}
n--;}else{if(e.previousElementSibling){
e = e.previousElementSibling;}else{for(e = e.previousElementSibling; e && e.nodeType !==1; e = e.previousElementSibling);}
n++;}}return e;}
10、封装mychildren,解决浏览器的兼容问题
functionmyChildren(e){var children = e.childNodes,
arr =[],
len = children.length;for(var i =0; i < len; i++){if(children[i].nodeType ===1){
arr.push(children[i])}}return arr;}
11、判断元素有没有子元素
functionhasChildren(e){var children = e.childNodes,
len = children.length;for(var i =0; i < len; i++){if(children[i].nodeType ===1){returntrue;}}returnfalse;}
functiongetDateTime(){var date =newDate(),
year = date.getFullYear(),
month = date.getMonth()+1,
day = date.getDate(),
hour = date.getHours()+1,
minute = date.getMinutes(),
second = date.getSeconds();
month =checkTime(month);
day =checkTime(day);
hour =checkTime(hour);
minute =checkTime(minute);
second =checkTime(second);functioncheckTime(i){if(i <10){
i ="0"+ i;}return i;}return""+ year +"年"+ month +"月"+ day +"日"+ hour +"时"+ minute +"分"+ second +"秒"}
functionisPalina(str){if(Object.prototype.toString.call(str)!=='[object String]'){returnfalse;}var len = str.length;for(var i =0; i < len /2; i++){if(str[i]!= str[len -1- i]){returnfalse;}}returntrue;}
Array.prototype.myForEach=function(func, obj){var len =this.length;var _this = arguments[1]? arguments[1]: window;// var _this=arguments[1]||window;for(var i =0; i < len; i++){
func.call(_this,this[i], i,this)}}
26、封装自己的filter方法
Array.prototype.myFilter=function(func, obj){var len =this.length;var arr =[];var _this = arguments[1]|| window;for(var i =0; i < len; i++){
func.call(_this,this[i], i,this)&& arr.push(this[i]);}return arr;}
27、数组map方法
Array.prototype.myMap=function(func){var arr =[];var len =this.length;var _this = arguments[1]|| window;for(var i =0; i < len; i++){
arr.push(func.call(_this,this[i], i,this));}return arr;}
28、数组every方法
Array.prototype.myEvery=function(func){var flag =true;var len =this.length;var _this = arguments[1]|| window;for(var i =0; i < len; i++){if(func.apply(_this,[this[i], i,this])==false){
flag =false;break;}}return flag;}
29、数组reduce方法
Array.prototype.myReduce=function(func, initialValue){var len =this.length,
nextValue,
i;if(!initialValue){// 没有传第二个参数
nextValue =this[0];
i =1;}else{// 传了第二个参数
nextValue = initialValue;
i =0;}for(; i < len; i++){
nextValue =func(nextValue,this[i], i,this);}return nextValue;}
// 快排 [left] + min + [right]functionquickArr(arr){if(arr.length <=1){return arr;}var left =[],
right =[];var pIndex = Math.floor(arr.length /2);var p = arr.splice(pIndex,1)[0];for(var i =0; i < arr.length; i++){if(arr[i]<= p){
left.push(arr[i]);}else{
right.push(arr[i]);}}// 递归returnquickArr(left).concat([p],quickArr(right));}// 冒泡functionbubbleSort(arr){for(var i =0; i < arr.length -1; i++){for(var j = i +1; j < arr.length; j++){if(arr[i]> arr[j]){var temp = arr[i];
arr[i]= arr[j];
arr[j]= temp;}}}return arr;}functionbubbleSort(arr){var len = arr.length;for(var i =0; i < len -1; i++){for(var j =0; j < len -1- i; j++){if(arr[j]> arr[j +1]){var temp = arr[j];
arr[j]= arr[j +1];
arr[j +1]= temp;}}}return arr;}
32、遍历Dom树
// 给定页面上的DOM元素,将访问元素本身及其所有后代(不仅仅是它的直接子元素)// 对于每个访问的元素,函数讲元素传递给提供的回调函数functiontraverse(element, callback){callback(element);var list = element.children;for(var i =0; i < list.length; i++){traverse(list[i], callback);}}
// 时间戳方案functionthrottle(fn,wait){var pre = Date.now();returnfunction(){var context =this;var args = arguments;var now = Date.now();if( now - pre >= wait){
fn.apply(context,args);
pre = Date.now();}}}functionhandle(){
console.log(Math.random());}
window.addEventListener("click",throttle(handle,1000));