Javascript知识点收集
2018-09-11 本文已影响2人
悟C
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);
}