[关闭]
@lizlalala 2017-01-05T10:16:41.000000Z 字数 2627 阅读 1228

util笔记

util 单例 闭包


  1. arr swap

    1. Array.prototype.swap = function(lIndex,rIndex){
    2. var temp = this[rIndex];
    3. this[rIndex] = this[lIndex];
    4. this[lIndex] = temp;
    5. return this;
    6. }

    或者用call

    1. swap.call(nums,baseIndex,targetIndex);
    2. function swap(i,j){
    3. var temp;
    4. temp = this[j];
    5. this[j] = this[i];
    6. this[i] = temp;
    7. return this;
    8. }
  2. bubbleSort

    1. function bubbleSort(){
    2. var swap = false;
    3. var arr = this.queue,
    4. lastIndexOfNotSortedArr = arr.length-1;
    5. do{
    6. swap = false;
    7. for(var i=1;i<=lastIndexOfNotSortedArr;i++){
    8. if(arr[i-1]>arr[i])
    9. {
    10. arr.swap(i-1,i);
    11. swap = true;
    12. }
    13. }
    14. lastIndexOfNotSortedArr -=1;
    15. }while(swap)
    16. }
  3. removeDuplicate
    用hash

    1. function removeDuplicate(){
    2. var hashDict = {};
    3. this.queue.forEach(function(data){
    4. hashDict[data] = true;
    5. });
    6. return Object.keys(hashDict);
    7. },
  4. 日期格式化

    1. function format(time,fmt){
    2. let dateObj = new Date(parseInt(time));
    3. var o = {
    4. "M+": dateObj.getMonth() + 1, //月份
    5. "d+": dateObj.getDate(), //日
    6. "h+": dateObj.getHours(), //小时
    7. "m+": dateObj.getMinutes(), //分
    8. "s+": dateObj.getSeconds(), //秒
    9. };
    10. if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (dateObj.getFullYear() + "").substr(4 - RegExp.$1.length));
    11. for (let k in o)
    12. if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    13. return fmt;
    14. }
  5. push dynamic arr to arr
    楼主最近在刷leetcode,递归中会有不断push数组到result数组中的问题。但是碍于js的引用传值...结果经常就是一溜的同样的数组。微笑脸.jpg
    需要复制。。

    1. var a = [].concat(arr);
    2. es6就直接这样好了:
    3. b = [...arr];
  6. find target in a sorted array
    如果有则返回第一次出现的位置,如果不存在,则返回的是它如果要插入的话应该在的位置。leetcode 二分查找相关题目应用。

    1. function searchIndex(target1){
    2. var i = 0,
    3. j = nums.length; //attention!
    4. while (i < j) {
    5. var mid = Math.floor((i + j) / 2);
    6. if (nums[mid] < target1)
    7. i = mid + 1; //i是最左边的===target的元素
    8. else
    9. j = mid;
    10. }
    11. return i;
    12. }

    需要注意的是:

    • j的初始值应该是nums.length而不是nums.length-1
    • 其次。循环终止条件不能是 while(i<=j) 因为终止条件中i = mid。而循环中有j = mid。如果while(i<=j)的话,就会导致死循环。
  7. 数组应用

    1. function newObj(){
    2. var Constructor = [].shift.call(arguments);
    3. var that = Object.create(Constructor.prototype);
    4. Constructor.apply(that,arguments);
    5. return that;
    6. }
    7. var People = function(name,age){
    8. this.name = name;
    9. this.age = age;
    10. }
    11. People.prototype = {
    12. getName: function(){
    13. return this.name
    14. },
    15. getAge: function(){
    16. return this.age;
    17. }
    18. }
    19. var luchen = newObj(People,"luchen","23");


    划重点:
    其实跟我们平时用构造函数差不多。觉得比较好的是newObj里面的实现。-
    补充下:

    1. // 类似于arraylikeObj.slice()
    2. var arr = Array.prototype.slice.call(arraylikeObj);
    3. //arguments.shift()第一个出队列
    4. var argument1 = [].shift.call(arguments)
    5. var leftArguments = arguments
  8. 闭包实现单例
    利用的就是闭包可以一直访问外部变量,而外部变量也因为闭包的引用持久的存在于内存中。

  1. const singleton = (function(){
  2. let param;
  3. return function(initialValue){
  4. return param || (param = initialValue);
  5. };
  6. })();
  7. singleton({someKey:value}) === singleton({someKey:value})

还有一种更彻底的高阶函数的方式:

高阶函数是至少满足以下条件的函数:
参数为函数
返回值为函数

  1. var getSingle = function(fn){
  2. var ret;
  3. return function(){
  4. return ret || ret = fn.apply.call(arguments);
  5. }
  6. }
  7. var getScript = getSingle(function(){
  8. return document.createElement('script');
  9. })
  10. getScript() === getScript()
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注