js回调函数原理(教你判断下跌还是回调)

js回调函数原理(教你判断下跌还是回调)

  1、输入一个值,返回其数据类型**

  function type(para) {

  return Object.prototype.toString.call(para)

  }

  2、数组去重

  function unique1(arr) {

  return […new Set(arr)]

  }

  function unique2(arr) {

  var obj={};

  return arr.filter(ele=> {

  if (!obj[ele]) {

  obj[ele]=true;

  return true;

  }

  })

  }

  function unique3(arr) {

  var result=[];

  arr.forEach(ele=> {

  if (result.indexOf(ele)==-1) {

  result.push(ele)

  }

  })

  return result;

  }

  3、字符串去重

  String.prototype.unique=function () {

  var obj={},

  str=”,

  len=this.length;

  for (var i=0; i < len; i++) {

  if (!obj[this[i]]) {

  str +=this[i];

  obj[this[i]]=true;

  }

  }

  return str;

  }

  ###### //去除连续的字符串

  function uniq(str) {

  return str.replace(/(w)1+/g, ‘$1’)

  }

  4、深拷贝 浅拷贝

  //深克隆(深克隆不考虑函数)

  function deepClone(obj, result) {

  var result=result || {};

  for (var prop in obj) {

  if (obj.hasOwnProperty(prop)) {

  if (typeof obj[prop]==‘object’ && obj[prop] !==null) {

  // 引用值(obj/array)且不为null

  if (Object.prototype.toString.call(obj[prop])==‘[object Object]’) {

  // 对象

  result[prop]={};

  } else {

  // 数组

  result[prop]=[];

  }

  deepClone(obj[prop], result[prop])

  } else {

  // 原始值或func

  result[prop]=obj[prop]

  }

  }

  }

  return result;

  }

  // 深浅克隆是针对引用值

  function deepClone(target) {

  if (typeof (target) !==‘object’) {

  return target;

  }

  var result;

  if (Object.prototype.toString.call(target)==‘[object Array]’) {

  // 数组

  result=[]

  } else {

  // 对象

  result={};

  }

  for (var prop in target) {

  if (target.hasOwnProperty(prop)) {

  result[prop]=deepClone(target[prop])

  }

  }

  return result;

  }

  // 无法复制函数

  var o1=ON.parse(jsON.stringify(obj1));

  5、reverse底层原理和扩展

  // 改变原数组

  Array.prototype.myReverse=function () {

  var len=this.length;

  for (var i=0; i < len; i++) {

  var temp=this[i];

  this[i]=this[len – 1 – i];

  this[len – 1 – i]=temp;

  }

  return this;

  }

  6、圣杯模式的继承

  function inherit(Target, Origin) {

  function F() {};

  F.prototype=Origin.prototype;

  Target.prototype=new F();

  Target.prototype.constructor=Target;

  // 最终的原型指向

  Target.prop.uber=Origin.prototype;

  }

  7、找出字符串中第一次只出现一次的字母

  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;

  }

  }

  }

  8、找元素的第n级父元素

  function parents(ele, n) {

  while (ele && n) {

  ele=ele.parentElement ? ele.parentElement : ele.parentNode;

  n–;

  }

  return ele;

  }

  9、 返回元素的第n个兄弟节点

  function retSibling(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,解决浏览器的兼容问题

  function myChildren(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、判断元素有没有子元素

  function hasChildren(e) {

  var children=e.childNodes,

  len=children.length;

  for (var i=0; i < len; i++) {

  if (children[i].nodeType===1) {

  return true;

  }

  }

  return false;

  }

  12、我一个元素插入到另一个元素的后面

  Element.prototype.insertAfter=function (target, elen) {

  var nextElen=elen.nextElenmentSibling;

  if (nextElen==null) {

  this.appendChild(target);

  } else {

  this.insertBefore(target, nextElen);

  }

  }

  13、返回当前的时间(年月日时分秒)

  function getDateTime() {

  var date=new Date(),

  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);

  function checkTime(i) {

  if (i < 10) {

  i=“0” + i;

  }

  return i;

  }

  return “” + year + “年” + month + “月” + day + “日” + hour + “时” + minute + “分” + second + “秒”

  }

  14、获得滚动条的滚动距离

  function getScrollOffset() {

  if (window.pageXOffset) {

  return {

  x: window.pageXOffset,

  y: window.pageYOffset

  }

  } else {

  return {

  x: document.body.scrollLeft + document.documentElement.scrollLeft,

  y: document.body.scrollTop + document.documentElement.scrollTop

  }

  }

  }

  15、获得视口的尺寸

  function getViewportOffset() {

  if (window.innerWidth) {

  return {

  w: window.innerWidth,

  h: window.innerHeight

  }

  } else {

  // ie8及其以下

  if (document.compatMode===“BackCompat”) {

  // 怪异模式

  return {

  w: document.body.clientWidth,

  h: document.body.clientHeight

  }

  } else {

  // 标准模式

  return {

  w: document.documentElement.clientWidth,

  h: document.documentElement.clientHeight

  }

  }

  }

  }

  16、获取任意元素的任意属性

  function getStyle(elem, prop) {

  return window.getComputedStyle ? window.getComputedStyle(elem, null)[prop] : elem.currentStyle[prop]

  }

  17、绑定事件的兼容代码

  function addEvent(elem, type, handle) {

  if (elem.addEventListener) { //非ie和非ie9

  elem.addEventListener(type, handle, false);

  } else if (elem.attachEvent) { //ie6到ie8

  elem.attachEvent(‘on’ + type, function () {

  handle.call(elem);

  })

  } else {

  elem[‘on’ + type]=handle;

  }

  }

  18、解绑事件

  function removeEvent(elem, type, handle) {

  if (elem.removeEventListener) { //非ie和非ie9

  elem.removeEventListener(type, handle, false);

  } else if (elem.detachEvent) { //ie6到ie8

  elem.detachEvent(‘on’ + type, handle);

  } else {

  elem[‘on’ + type]=null;

  }

  }

  19、取消冒泡的兼容代码

  function stopBubble(e) {

  if (e && e.stopPropagation) {

  e.stopPropagation();

  } else {

  window.event.cancelBubble=true;

  }

  }

  20、检验字符串是否是回文

  function isPalina(str) {

  if (Object.prototype.toString.call(str) !==‘[object String]’) {

  return false;

  }

  var len=str.length;

  for (var i=0; i < len / 2; i++) {

  if (str[i] !=str[len – 1 – i]) {

  return false;

  }

  }

  return true;

  }

  21、检验字符串是否是回文

  function isPalindrome(str) {

  str=str.replace(/W/g, ”).toLowerCase();

  console.log(str)

  return (str==str.split(”).reverse().join(”))

  }

  22、兼容getElementsByClassName方法

  Element.prototype.getElementsByClassName=Document.prototype.getElementsByClassName=function (_className) {

  var allDomArray=document.getElementsByTagName(‘*’);

  var lastDomArray=[];

  function trimSpace(strClass) {

  var reg=/s+/g;

  return strClass.replace(reg, ‘ ‘).trim()

  }

  for (var i=0; i < allDomArray.length; i++) {

  var classArray=trimSpace(allDomArray[i].className).split(‘ ‘);

  for (var j=0; j < classArray.length; j++) {

  if (classArray[j]==_className) {

  lastDomArray.push(allDomArray[i]);

  break;

  }

  }

  }

  return lastDomArray;

  }

  23、运动函数

  function animate(obj, json, callback) {

  clearInterval(obj.timer);

  var speed,

  current;

  obj.timer=setInterval(function () {

  var lock=true;

  for (var prop in json) {

  if (prop==‘opacity’) {

  current=parseFloat(window.getComputedStyle(obj, null)[prop]) * 100;

  } else {

  current=parseInt(window.getComputedStyle(obj, null)[prop]);

  }

  speed=(json[prop] – current) / 7;

  speed=speed > 0 ? Math.ceil(speed) : Math.floor(speed);

  if (prop==‘opacity’) {

  obj.style[prop]=(current + speed) / 100;

  } else {

  obj.style[prop]=current + speed + ‘px’;

  }

  if (current !=json[prop]) {

  lock=false;

  }

  }

  if (lock) {

  clearInterval(obj.timer);

  typeof callback==‘function’ ? callback() : ”;

  }

  }, 30)

  }

  24、弹性运动

  function ElasticMovement(obj, target) {

  clearInterval(obj.timer);

  var iSpeed=40,

  a, u=0.8;

  obj.timer=setInterval(function () {

  a=(target – obj.offsetLeft) / 8;

  iSpeed=iSpeed + a;

  iSpeed=iSpeed * u;

  if (Math.abs(iSpeed) <=1 && Math.abs(a) <=1) {

  console.log(‘over’)

  clearInterval(obj.timer);

  obj.style.left=target + ‘px’;

  } else {

  obj.style.left=obj.offsetLeft + iSpeed + ‘px’;

  }

  }, 30);

  }

  25、封装自己的forEach方法

  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;

  }

  30、获取url中的参数

  function getWindonHref() {

  var sHref=window.location.href;

  var args=sHref.split(‘?’);

  if (args[0]===sHref) {

  return ”;

  }

  var hrefarr=args[1].split(‘#’)[0].split(‘&’);

  var obj={};

  for (var i=0; i < hrefarr.length; i++) {

  hrefarr[i]=hrefarr[i].split(‘=’);

  obj[hrefarr[i][0]]=hrefarr[i][1];

  }

  return obj;

  }

  31、数组排序

  // 快排 [left] + min + [right]

  function quickArr(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]);

  }

  }

  // 递归

  return quickArr(left).concat([p], quickArr(right));

  }

  // 冒泡

  function bubbleSort(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;

  }

  function bubbleSort(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元素,将访问元素本身及其所有后代(不仅仅是它的直接子元素)

  // 对于每个访问的元素,函数将元素传递给提供的回调函数

  function traverse(element, callback) {

  callback(element);

  var list=element.children;

  for (var i=0; i < list.length; i++) {

  traverse(list[i], callback);

  }

  }

  33、原生js封装ajax

  function ajax(method, url, callback, data, flag) {

  var xhr;

  flag=flag || true;

  method=method.toUpperCase();

  if (window.XMLHttpRequest) {

  xhr=new XMLHttpRequest();

  } else {

  xhr=new ActiveXObject(‘Microsoft.XMLHttp’);

  }

  xhr.onreadystatechange=function () {

  if (xhr.readyState==4 && xhr.status==200) {

  console.log(2)

  callback(xhr.responseText);

  }

  }

  if (method==‘GET’) {

  var date=new Date(),

  timer=date.getTime();

  xhr.open(‘GET’, url + ‘?’ + data + ‘&timer’ + timer, flag);

  xhr.send()

  } else if (method==‘POST’) {

  xhr.open(‘POST’, url, flag);

  xhr.setRequestHeader(‘Content-Type’, ‘application/x-

  xhr.send(data);

  }

  }

  34、异步加载script

  function loadScript(url, callback) {

  var oscript=document.createElement(‘script’);

  if (oscript.readyState) { // ie8及以下版本

  oscript.onreadystatechange=function () {

  if (oscript.readyState===‘complete’ || oscript.readyState===‘loaded’) {

  callback();

  }

  }

  } else {

  oscript.onload=function () {

  callback()

  };

  }

  oscript.src=

  document.body.appendChild(oscript);

  }

  35、cookie管理

  var cookie={

  set: function (name, value, time) {

  document.cookie=name + ‘=’ + value + ‘; max-age=’ + time;

  return this;

  },

  remove: function (name) {

  return this.setCookie(name, ”, -1);

  },

  get: function (name, callback) {

  var allCookieArr=document.cookie.split(‘; ‘);

  for (var i=0; i < allCookieArr.length; i++) {

  var itemCookieArr=allCookieArr[i].split(‘=’);

  if (itemCookieArr[0]===name) {

  return itemCookieArr[1]

  }

  }

  return undefined;

  }

  }

  36、实现bind()方法

  Function.prototype.myBind=function (target) {

  var target=target || window;

  var _args1=[].slice.call(arguments, 1);

  var self=this;

  var temp=function () {};

  var F=function () {

  var _args2=[].slice.call(arguments, 0);

  var parasArr=_args1.concat(_args2);

  return self.apply(this instanceof temp ? this : target, parasArr)

  }

  temp.prototype=self.prototype;

  F.prototype=new temp();

  return F;

  }

  37、实现call()方法

  Function.prototype.myCall=function () {

  var ctx=arguments[0] || window;

  ctx.fn=this;

  var args=[];

  for (var i=1; i < arguments.length; i++) {

  args.push(arguments[i])

  }

  var result=ctx.fn(…args);

  delete ctx.fn;

  return result;

  }

  38、实现apply()方法

  Function.prototype.myApply=function () {

  var ctx=arguments[0] || window;

  ctx.fn=this;

  if (!arguments[1]) {

  var result=ctx.fn();

  delete ctx.fn;

  return result;

  }

  var result=ctx.fn(…arguments[1]);

  delete ctx.fn;

  return result;

  }

  39、防抖

  function debounce(handle, delay) {

  var timer=null;

  return function () {

  var _self=this,

  _args=arguments;

  clearTimeout(timer);

  timer=setTimeout(function () {

  handle.apply(_self, _args)

  }, delay)

  }

  }

  40、节流

  function throttle(handler, wait) {

  var lastTime=0;

  return function (e) {

  var nowTime=new Date().getTime();

  if (nowTime – lastTime > wait) {

  handler.apply(this, arguments);

  lastTime=nowTime;

  }

  }

  }

  41、requestAnimFrame兼容性方法

  window.requestAnimFrame=(function () {

  return window.requestAnimationFrame ||

  window.webkitRequestAnimationFrame ||

  window.mozRequestAnimationFrame ||

  function (callback) {

  window.setTimeout(callback, 1000 / 60);

  };

  })();

  42、cancelAnimFrame兼容性方法

  window.cancelAnimFrame=(function () {

  return window.cancelAnimationFrame ||

  window.webkitCancelAnimationFrame ||

  window.mozCancelAnimationFrame ||

  function (id) {

  window.clearTimeout(id);

  };

  })();

  43、jsonp底层方法

  function jsonp(url, callback) {

  var oscript=document.createElement(‘script’);

  if (oscript.readyState) { // ie8及以下版本

  oscript.onreadystatechange=function () {

  if (oscript.readyState===‘complete’ || oscript.readyState===‘loaded’) {

  callback();

  }

  }

  } else {

  oscript.onload=function () {

  callback()

  };

  }

  oscript.src=

  document.body.appendChild(oscript);

  }

  44、获取url上的参数

  function getUrlParam(sUrl, sKey) {

  var result={};

  sUrl.replace(/(w+)=(w+)(?=[&|#])/g, function (ele, key, val) {

  if (!result[key]) {

  result[key]=val;

  } else {

  var temp=result[key];

  result[key]=[].concat(temp, val);

  }

  })

  if (!sKey) {

  return result;

  } else {

  return result[sKey] || ”;

  }

  }

  45、格式化时间

  function formatDate(t, str) {

  var obj={

  yyyy: t.getFullYear(),

  yy: (“” + t.getFullYear()).slice(-2),

  M: t.getMonth() + 1,

  MM: (“0” + (t.getMonth() + 1)).slice(-2),

  d: t.getDate(),

  dd: (“0” + t.getDate()).slice(-2),

  H: t.getHours(),

  HH: (“0” + t.getHours()).slice(-2),

  h: t.getHours() % 12,

  hh: (“0” + t.getHours() % 12).slice(-2),

  m: t.getMinutes(),

  mm: (“0” + t.getMinutes()).slice(-2),

  s: t.getSeconds(),

  ss: (“0” + t.getSeconds()).slice(-2),

  w: [‘日’, ‘一’, ‘二’, ‘三’, ‘四’, ‘五’, ‘六’][t.getDay()]

  };

  return str.replace(/([a-z]+)/ig, function ($1) {

  return obj[$1]

  });

  }

  46、验证邮箱的正则表达式

  function isAvailableEmail(sEmail) {

  var reg=/^([w+.])+@w+([.]w+)+$/

  return reg.test(sEmail)

  }

  47、函数颗粒化

  //是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术

  function curryIt(fn) {

  var length=fn.length,

  args=[];

  var result=function (arg) {

  args.push(arg);

  length–;

  if (length <=0) {

  return fn.apply(this, args);

  } else {

  return result;

  }

  }

  return result;

  }

  48、大数相加

  function sumBigNumber(a, b) {

  var res=”, //结果

  temp=0; //按位加的结果及进位

  a=a.split(”);

  b=b.split(”);

  while (a.length || b.length || temp) {

  //~~按位非 1.类型转换,转换成数字 2.~~undefined==0

  temp +=~~a.pop() + ~~b.pop();

  res=(temp % 10) + res;

  temp=temp > 9;

  }

  return res.replace(/^0+/, ”);

  }

  1、输入一个值,返回其数据类型**

  function type(para) {

  return Object.prototype.toString.call(para)

  }

  2、数组去重

  function unique1(arr) {

  return […new Set(arr)]

  }

  function unique2(arr) {

  var obj={};

  return arr.filter(ele=> {

  if (!obj[ele]) {

  obj[ele]=true;

  return true;

  }

  })

  }

  function unique3(arr) {

  var result=[];

  arr.forEach(ele=> {

  if (result.indexOf(ele)==-1) {

  result.push(ele)

  }

  })

  return result;

  }

  3、字符串去重

  String.prototype.unique=function () {

  var obj={},

  str=”,

  len=this.length;

  for (var i=0; i < len; i++) {

  if (!obj[this[i]]) {

  str +=this[i];

  obj[this[i]]=true;

  }

  }

  return str;

  }

  ###### //去除连续的字符串

  function uniq(str) {

  return str.replace(/(w)1+/g, ‘$1’)

  }

  4、深拷贝 浅拷贝

  //深克隆(深克隆不考虑函数)

  function deepClone(obj, result) {

  var result=result || {};

  for (var prop in obj) {

  if (obj.hasOwnProperty(prop)) {

  if (typeof obj[prop]==‘object’ && obj[prop] !==null) {

  // 引用值(obj/array)且不为null

  if (Object.prototype.toString.call(obj[prop])==‘[object Object]’) {

  // 对象

  result[prop]={};

  } else {

  // 数组

  result[prop]=[];

  }

  deepClone(obj[prop], result[prop])

  } else {

  // 原始值或func

  result[prop]=obj[prop]

  }

  }

  }

  return result;

  }

  // 深浅克隆是针对引用值

  function deepClone(target) {

  if (typeof (target) !==‘object’) {

  return target;

  }

  var result;

  if (Object.prototype.toString.call(target)==‘[object Array]’) {

  // 数组

  result=[]

  } else {

  // 对象

  result={};

  }

  for (var prop in target) {

  if (target.hasOwnProperty(prop)) {

  result[prop]=deepClone(target[prop])

  }

  }

  return result;

  }

  // 无法复制函数

  var o1=jsON.parse(jsON.stringify(obj1));

  5、reverse底层原理和扩展

  // 改变原数组

  Array.prototype.myReverse=function () {

  var len=this.length;

  for (var i=0; i < len; i++) {

  var temp=this[i];

  this[i]=this[len – 1 – i];

  this[len – 1 – i]=temp;

  }

  return this;

  }

  6、圣杯模式的继承

  function inherit(Target, Origin) {

  function F() {};

  F.prototype=Origin.prototype;

  Target.prototype=new F();

  Target.prototype.constructor=Target;

  // 最终的原型指向

  Target.prop.uber=Origin.prototype;

  }

  7、找出字符串中第一次只出现一次的字母

  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;

  }

  }

  }

  8、找元素的第n级父元素

  function parents(ele, n) {

  while (ele && n) {

  ele=ele.parentElement ? ele.parentElement : ele.parentNode;

  n–;

  }

  return ele;

  }

  9、 返回元素的第n个兄弟节点

  function retSibling(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,解决浏览器的兼容问题

  function myChildren(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、判断元素有没有子元素

  function hasChildren(e) {

  var children=e.childNodes,

  len=children.length;

  for (var i=0; i < len; i++) {

  if (children[i].nodeType===1) {

  return true;

  }

  }

  return false;

  }

  12、我一个元素插入到另一个元素的后面

  Element.prototype.insertAfter=function (target, elen) {

  var nextElen=elen.nextElenmentSibling;

  if (nextElen==null) {

  this.appendChild(target);

  } else {

  this.insertBefore(target, nextElen);

  }

  }

  13、返回当前的时间(年月日时分秒)

  function getDateTime() {

  var date=new Date(),

  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);

  function checkTime(i) {

  if (i < 10) {

  i=“0” + i;

  }

  return i;

  }

  return “” + year + “年” + month + “月” + day + “日” + hour + “时” + minute + “分” + second + “秒”

  }

  14、获得滚动条的滚动距离

  function getScrollOffset() {

  if (window.pageXOffset) {

  return {

  x: window.pageXOffset,

  y: window.pageYOffset

  }

  } else {

  return {

  x: document.body.scrollLeft + document.documentElement.scrollLeft,

  y: document.body.scrollTop + document.documentElement.scrollTop

  }

  }

  }

  15、获得视口的尺寸

  function getViewportOffset() {

  if (window.innerWidth) {

  return {

  w: window.innerWidth,

  h: window.innerHeight

  }

  } else {

  // ie8及其以下

  if (document.compatMode===“BackCompat”) {

  // 怪异模式

  return {

  w: document.body.clientWidth,

  h: document.body.clientHeight

  }

  } else {

  // 标准模式

  return {

  w: document.documentElement.clientWidth,

  h: document.documentElement.clientHeight

  }

  }

  }

  }

  16、获取任意元素的任意属性

  function getStyle(elem, prop) {

  return window.getComputedStyle ? window.getComputedStyle(elem, null)[prop] : elem.currentStyle[prop]

  }

  17、绑定事件的兼容代码

  function addEvent(elem, type, handle) {

  if (elem.addEventListener) { //非ie和非ie9

  elem.addEventListener(type, handle, false);

  } else if (elem.attachEvent) { //ie6到ie8

  elem.attachEvent(‘on’ + type, function () {

  handle.call(elem);

  })

  } else {

  elem[‘on’ + type]=handle;

  }

  }

  18、解绑事件

  function removeEvent(elem, type, handle) {

  if (elem.removeEventListener) { //非ie和非ie9

  elem.removeEventListener(type, handle, false);

  } else if (elem.detachEvent) { //ie6到ie8

  elem.detachEvent(‘on’ + type, handle);

  } else {

  elem[‘on’ + type]=null;

  }

  }

  19、取消冒泡的兼容代码

  function stopBubble(e) {

  if (e && e.stopPropagation) {

  e.stopPropagation();

  } else {

  window.event.cancelBubble=true;

  }

  }

  20、检验字符串是否是回文

  function isPalina(str) {

  if (Object.prototype.toString.call(str) !==‘[object String]’) {

  return false;

  }

  var len=str.length;

  for (var i=0; i < len / 2; i++) {

  if (str[i] !=str[len – 1 – i]) {

  return false;

  }

  }

  return true;

  }

  21、检验字符串是否是回文

  function isPalindrome(str) {

  str=str.replace(/W/g, ”).toLowerCase();

  console.log(str)

  return (str==str.split(”).reverse().join(”))

  }

  22、兼容getElementsByClassName方法

  Element.prototype.getElementsByClassName=Document.prototype.getElementsByClassName=function (_className) {

  var allDomArray=document.getElementsByTagName(‘*’);

  var lastDomArray=[];

  function trimSpace(strClass) {

  var reg=/s+/g;

  return strClass.replace(reg, ‘ ‘).trim()

  }

  for (var i=0; i < allDomArray.length; i++) {

  var classArray=trimSpace(allDomArray[i].className).split(‘ ‘);

  for (var j=0; j < classArray.length; j++) {

  if (classArray[j]==_className) {

  lastDomArray.push(allDomArray[i]);

  break;

  }

  }

  }

  return lastDomArray;

  }

  23、运动函数

  function animate(obj, json, callback) {

  clearInterval(obj.timer);

  var speed,

  current;

  obj.timer=setInterval(function () {

  var lock=true;

  for (var prop in json) {

  if (prop==‘opacity’) {

  current=parseFloat(window.getComputedStyle(obj, null)[prop]) * 100;

  } else {

  current=parseInt(window.getComputedStyle(obj, null)[prop]);

  }

  speed=(json[prop] – current) / 7;

  speed=speed > 0 ? Math.ceil(speed) : Math.floor(speed);

  if (prop==‘opacity’) {

  obj.style[prop]=(current + speed) / 100;

  } else {

  obj.style[prop]=current + speed + ‘px’;

  }

  if (current !=json[prop]) {

  lock=false;

  }

  }

  if (lock) {

  clearInterval(obj.timer);

  typeof callback==‘function’ ? callback() : ”;

  }

  }, 30)

  }

  24、弹性运动

  function ElasticMovement(obj, target) {

  clearInterval(obj.timer);

  var iSpeed=40,

  a, u=0.8;

  obj.timer=setInterval(function () {

  a=(target – obj.offsetLeft) / 8;

  iSpeed=iSpeed + a;

  iSpeed=iSpeed * u;

  if (Math.abs(iSpeed) <=1 && Math.abs(a) <=1) {

  console.log(‘over’)

  clearInterval(obj.timer);

  obj.style.left=target + ‘px’;

  } else {

  obj.style.left=obj.offsetLeft + iSpeed + ‘px’;

  }

  }, 30);

  }

  25、封装自己的forEach方法

  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;

  }

  30、获取url中的参数

  function getWindonHref() {

  var sHref=window.location.href;

  var args=sHref.split(‘?’);

  if (args[0]===sHref) {

  return ”;

  }

  var hrefarr=args[1].split(‘#’)[0].split(‘&’);

  var obj={};

  for (var i=0; i < hrefarr.length; i++) {

  hrefarr[i]=hrefarr[i].split(‘=’);

  obj[hrefarr[i][0]]=hrefarr[i][1];

  }

  return obj;

  }

  31、数组排序

  // 快排 [left] + min + [right]

  function quickArr(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]);

  }

  }

  // 递归

  return quickArr(left).concat([p], quickArr(right));

  }

  // 冒泡

  function bubbleSort(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;

  }

  function bubbleSort(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元素,将访问元素本身及其所有后代(不仅仅是它的直接子元素)

  // 对于每个访问的元素,函数将元素传递给提供的回调函数

  function traverse(element, callback) {

  callback(element);

  var list=element.children;

  for (var i=0; i < list.length; i++) {

  traverse(list[i], callback);

  }

  }

  33、原生js封装ajax

  function ajax(method, url, callback, data, flag) {

  var xhr;

  flag=flag || true;

  method=method.toUpperCase();

  if (window.XMLHttpRequest) {

  xhr=new XMLHttpRequest();

  } else {

  xhr=new ActiveXObject(‘Microsoft.XMLHttp’);

  }

  xhr.onreadystatechange=function () {

  if (xhr.readyState==4 && xhr.status==200) {

  console.log(2)

  callback(xhr.responseText);

  }

  }

  if (method==‘GET’) {

  var date=new Date(),

  timer=date.getTime();

  xhr.open(‘GET’, url + ‘?’ + data + ‘&timer’ + timer, flag);

  xhr.send()

  } else if (method==‘POST’) {

  xhr.open(‘POST’, url, flag);

  xhr.setRequestHeader(‘Content-Type’, ‘application/x-

  xhr.send(data);

  }

  }

  34、异步加载script

  function loadScript(url, callback) {

  var oscript=document.createElement(‘script’);

  if (oscript.readyState) { // ie8及以下版本

  oscript.onreadystatechange=function () {

  if (oscript.readyState===‘complete’ || oscript.readyState===‘loaded’) {

  callback();

  }

  }

  } else {

  oscript.onload=function () {

  callback()

  };

  }

  oscript.src=

  document.body.appendChild(oscript);

  }

  35、cookie管理

  var cookie={

  set: function (name, value, time) {

  document.cookie=name + ‘=’ + value + ‘; max-age=’ + time;

  return this;

  },

  remove: function (name) {

  return this.setCookie(name, ”, -1);

  },

  get: function (name, callback) {

  var allCookieArr=document.cookie.split(‘; ‘);

  for (var i=0; i < allCookieArr.length; i++) {

  var itemCookieArr=allCookieArr[i].split(‘=’);

  if (itemCookieArr[0]===name) {

  return itemCookieArr[1]

  }

  }

  return undefined;

  }

  }

  36、实现bind()方法

  Function.prototype.myBind=function (target) {

  var target=target || window;

  var _args1=[].slice.call(arguments, 1);

  var self=this;

  var temp=function () {};

  var F=function () {

  var _args2=[].slice.call(arguments, 0);

  var parasArr=_args1.concat(_args2);

  return self.apply(this instanceof temp ? this : target, parasArr)

  }

  temp.prototype=self.prototype;

  F.prototype=new temp();

  return F;

  }

  37、实现call()方法

  Function.prototype.myCall=function () {

  var ctx=arguments[0] || window;

  ctx.fn=this;

  var args=[];

  for (var i=1; i < arguments.length; i++) {

  args.push(arguments[i])

  }

  var result=ctx.fn(…args);

  delete ctx.fn;

  return result;

  }

  38、实现apply()方法

  Function.prototype.myApply=function () {

  var ctx=arguments[0] || window;

  ctx.fn=this;

  if (!arguments[1]) {

  var result=ctx.fn();

  delete ctx.fn;

  return result;

  }

  var result=ctx.fn(…arguments[1]);

  delete ctx.fn;

  return result;

  }

  39、防抖

  function debounce(handle, delay) {

  var timer=null;

  return function () {

  var _self=this,

  _args=arguments;

  clearTimeout(timer);

  timer=setTimeout(function () {

  handle.apply(_self, _args)

  }, delay)

  }

  }

  40、节流

  function throttle(handler, wait) {

  var lastTime=0;

  return function (e) {

  var nowTime=new Date().getTime();

  if (nowTime – lastTime > wait) {

  handler.apply(this, arguments);

  lastTime=nowTime;

  }

  }

  }

  41、requestAnimFrame兼容性方法

  window.requestAnimFrame=(function () {

  return window.requestAnimationFrame ||

  window.webkitRequestAnimationFrame ||

  window.mozRequestAnimationFrame ||

  function (callback) {

  window.setTimeout(callback, 1000 / 60);

  };

  })();

  42、cancelAnimFrame兼容性方法

  window.cancelAnimFrame=(function () {

  return window.cancelAnimationFrame ||

  window.webkitCancelAnimationFrame ||

  window.mozCancelAnimationFrame ||

  function (id) {

  window.clearTimeout(id);

  };

  })();

  43、jsonp底层方法

  function jsonp(url, callback) {

  var oscript=document.createElement(‘script’);

  if (oscript.readyState) { // ie8及以下版本

  oscript.onreadystatechange=function () {

  if (oscript.readyState===‘complete’ || oscript.readyState===‘loaded’) {

  callback();

  }

  }

  } else {

  oscript.onload=function () {

  callback()

  };

  }

  oscript.src=

  document.body.appendChild(oscript);

  }

  44、获取url上的参数

  function getUrlParam(sUrl, sKey) {

  var result={};

  sUrl.replace(/(w+)=(w+)(?=[&|#])/g, function (ele, key, val) {

  if (!result[key]) {

  result[key]=val;

  } else {

  var temp=result[key];

  result[key]=[].concat(temp, val);

  }

  })

  if (!sKey) {

  return result;

  } else {

  return result[sKey] || ”;

  }

  }

  45、格式化时间

  function formatDate(t, str) {

  var obj={

  yyyy: t.getFullYear(),

  yy: (“” + t.getFullYear()).slice(-2),

  M: t.getMonth() + 1,

  MM: (“0” + (t.getMonth() + 1)).slice(-2),

  d: t.getDate(),

  dd: (“0” + t.getDate()).slice(-2),

  H: t.getHours(),

  HH: (“0” + t.getHours()).slice(-2),

  h: t.getHours() % 12,

  hh: (“0” + t.getHours() % 12).slice(-2),

  m: t.getMinutes(),

  mm: (“0” + t.getMinutes()).slice(-2),

  s: t.getSeconds(),

  ss: (“0” + t.getSeconds()).slice(-2),

  w: [‘日’, ‘一’, ‘二’, ‘三’, ‘四’, ‘五’, ‘六’][t.getDay()]

  };

  return str.replace(/([a-z]+)/ig, function ($1) {

  return obj[$1]

  });

  }

  46、验证邮箱的正则表达式

  function isAvailableEmail(sEmail) {

  var reg=/^([w+.])+@w+([.]w+)+$/

  return reg.test(sEmail)

  }

  47、函数颗粒化

  //是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术

  function curryIt(fn) {

  var length=fn.length,

  args=[];

  var result=function (arg) {

  args.push(arg);

  length–;

  if (length <=0) {

  return fn.apply(this, args);

  } else {

  return result;

  }

  }

  return result;

  }

  48、大数相加

  function sumBigNumber(a, b) {

  var res=”, //结果

  temp=0; //按位加的结果及进位

  a=a.split(”);

  b=b.split(”);

  while (a.length || b.length || temp) {

  //~~按位非 1.类型转换,转换成数字 2.~~undefined==0

  temp +=~~a.pop() + ~~b.pop();

  res=(temp % 10) + res;

  temp=temp > 9;

  }

  return res.replace(/^0+/, ”);

  }

  49、单例模式

  function getSingle(func) {

  var result;

  return function () {

  if (!result) {

  result=new func(arguments);

  }

  return result;

  }

  }

  49、单例模式

  function getSingle(func) {

  var result;

  return function () {

  if (!result) {

  result=new func(arguments);

  }

  return result;

  }

  }

推荐阅读