Javascript知识点收集

1. ~x等同于-(x+1),在-(x+1)中唯一能够得到0(或者严格说是-0)得x值是-1,也就是说如果x为-1时,~和一些数值在一起会返回假值0,其他情况则返回真值。我们可以用~配合indexOf:
var test = '台风来了!';

if (~test.indexOf('来了')) {
  console.log('台风来了!');
}

if (~test.indexOf('走了')) {
  console.log('台风走了!');
} else {
  console.log('台风没走!');
}
//=>台风来了!
//=>台风没走
2. 其类型和布尔类型之间得相等比较,规则:
  • 如果Type(x)是布尔类型,则返回ToNumber(x) == y 的结果
  • 如果Type(y)是布尔类型,则返回x == ToNumber的结果
var x = '42'
var y = true

console.log(x == y)
// => false
3. 相等比较的一个坑:
function doSomething1(a) {
  if (a == "") {           // ""先进行Number("") 为0,然后0 == 0
    console.log('执行了1')
  }
}

function doSomething2(a, b) {
  if (a == b) {                    // []先进行toString() 为 ""
    console.log('执行了2')
  }
}

doSomething1(0)
//=> '执行了1'
doSomething2("", [])
//=>'执行了2'

(1) 如果Type(x)是数字,Type(y)是字符串,则返回x == ToNumber(y)的结果
(2) 如果type(x)是字符串,Type(y)是数字,则返回ToNumber(x) == y的结果

4. 对象作为映射的主要缺点是不能使用非字符串作为键,下面举个例子
var m = {};
var x = { id: 1 };
var y = { id: 2 };
m[x] = "foo";
m[y] = "bar";

m[x];  // "bar"
m[y]; // "bar"

这里发生了什么?x和y两个对象字符串化都是"[object object]",所以m中只设置了一个键。

5.函数节流的代码实现:
function throttle(fn, interval) {
  var _self = fn,
      timer,
      firstTime = true;
  
  return function() {
    var args = arguments,
        _me = this;
    
    if (firstTime) {
      _self.apply(_me, args);
      return firstTime = false;
    }

    if (timer) {
      return false;
    }

    timer = setTimeout(function() {
      clearTimeout(timer);
      timer = null;
      _self.apply(_me, args);
    }, interval || 500);
  }
}

6.懒性加载函数,通过第一次加载重写函数来避免重复的嗅探工作:
function addEvent(elem, type, handler) {
  if (window.addEventListener) {
    addEvent = function (elem, type, handler) {
      elem.addEventListener(type, handler, false);
    }
  } else if (window.attachEvent) {
    addEvent = function (elem, type, handler) {
      elem.attachEvent('on' + type, handler);
    }
  }
  addEvent(elem, type, handler);
}

你可能感兴趣的:(Javascript知识点收集)