Skip to content

Instantly share code, notes, and snippets.

@chengmu
Created August 16, 2013 10:23
Show Gist options
  • Save chengmu/6248781 to your computer and use it in GitHub Desktop.
Save chengmu/6248781 to your computer and use it in GitHub Desktop.
Javascript Ninja Notes

js传参

按值(value)传递, 但传过来的参数本身是个引用,因此若修改其内部值,原对象便会修改

var a = { b: 1 }
function c(o) { o.b=2 }
function d(o) { o = {} }
c(a)   //a = {b:2} 
d(a)   //a = {b:2}

arguments.callee

  • 存储函数方法&计数的好办法
 var store = {
        nextId: 1,                                        //#1
        cache: {},                                        //#2
        add: function(fn) {                               //#3
          if (!fn.id) {                                   //#3
            fn.id = store.nextId++;                       //#3
            return !!(store.cache[fn.id] = fn);           //#3
          }                                               //#3
        }
      };
  • 记忆 Self-memoizing functions Memoization
function isPrime(value) {
        if (!isPrime.answers) isPrime.answers = {};                  //#1
        if (isPrime.answers[value] != null) {                        //#2
          return isPrime.answers[value];                             //#2
        }                                                            //#2
        var prime = value != 1; // 1 can never be prime
        for (var i = 2; i < value; i++) {
          if (value % i == 0) {
            prime = false;
            break;
          }
        }
        return isPrime.answers[value] = prime;                       //#3
      }
  • 回文
      function isPalindrome(text) {
        if (text.length <= 1) return true;
        if (text.charAt(0) != text.charAt(text.length - 1)) return false;
        return isPalindrome(text.substr(1,text.length -2));
      }

      assert(isPalindrome(""),"blank")
      assert(isPalindrome("x"),"single")
      assert(isPalindrome("oxo"),"odd")
      assert(isPalindrome("abba"),"even")
      assert(isPalindrome("abbar"),"not")
  • 模拟数组的对象
      var elems = {

        length: 0,                                                //#1

        add: function(elem){                                      //#2
          Array.prototype.push.call(this, elem);
        },

        gather: function(id){                                     //#3
          this.add(document.getElementById(id));
        }
      };
  • 使用arguments数组
  • eg: 合并对象;与最大数相乘
function merge(root){                                   //#1
        for (var i = 1; i < arguments.length; i++) {
          for (var key in arguments[i]) {
            root[key] = arguments[i][key];
          }
        }
        return root;
      }

function multiMax(multi){
        return multi * Math.max.apply(Math,
          Array.prototype.slice.call(arguments, 1));           //#1
      }
  • function.length & arguments.length 进行函数重载
function addMethod(object, name, fn) {
  var old = object[name];                        //#1
  object[name] = function(){
    if (fn.length == arguments.length)           //#2
      return fn.apply(this, arguments);           //#2
    else if (typeof old == 'function')           //#3
      return old.apply(this, arguments);         //#3
  };
}
  • 绑定this
 function bind(context,name){                                 //#1
        return function(){                                         //#1
          return context[name].apply(context,arguments);           //#1
        };                                                         //#1
      }                            
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment