JavaScript 基础知识

1. 对象的方括号语法

var o = {},
    a = {key : 'x'},
    b = {key : 'y'};
o[a] = 1,
o[b] = 2;
console.log(o[a]);

//例子来自于京程一灯袁志佳老师的周末抽测题。

方括号中的所有键都将转换为字符串类型,因为JavaScript中的对象只能使用String类型作为键类型。 

例如,在上面的代码中,当将键 a 添加到 o 时,JavaScript将调用 a.toString() 方法,并将此结果字符串用作新键。参考 MDN

所以 o[a] -> o[a.toString()] -> o['[object Object]'],  o[b] -> o[b.toString()] -> o['[object Object]'], 这样 o[b] 就覆盖了 o[a]。

o[a] === 2。

 

2. transitionend事件也会冒泡。

 

3. 如何让 (a == 1 && a == 2 && a ==3) 等于true?

思路1: 定义a为对象,重写a的 valueOf 或 toString 方法

var a = {
    i : 1,
    valueOf: function(){
        return this.i++;        
    }                
}

console.log( a == 1 && a == 2 && a ==3 );

为什么重写 valueOf 或 toString 就可以了呢? 可以参考 ECMAScript官方文档,有助于理解抽象相等比较(也就是 == 运算符)的具体流程: Abstract Equality Comparison   ToPrimitive  OrdinaryToPrimitive

思路2: 定义a为数组,用a.shift 覆盖 a.join。

var a = [1,2,3];
a.join = a.shift;
console.log( a
== 1 && a == 2 && a ==3 );

 

因为数组比较时,内部调用的是数组的 toString 方法,  而 数组的 toString 又是调用数组的join方法。具体流程可参考 ECMAScript 官方文档

 

4. DOM事件流,分三个阶段,捕获阶段,处于目标阶段,冒泡阶段。

要注意的一点是:处于目标阶段时,假如目标节点的子元素没有绑定相同类型的事件,也就意味着事件流,捕获到目标节点的位置,不再往下流动了,

此时,当前目标节点的事件执行顺序并不是先执行捕获阶段事件,再执行冒泡阶段事件。而是根据事件函数的添加顺序(代码的先后顺序)来执行的。

 

5. '2' > '150000' === true。

因为字符串比较是一个一个字符来对比的,比较到 '2' > '1' 就直接返回 true 了。

日常开发中,获取input的value值来比对时,注意这个坑。

 

6. this

一句话总结:谁调用我,我就指向谁。

除了箭头函数,箭头函数的效果,类似于 fn.bind(this);

严格模式下, 函数中的this, 指向 undefined。

 

7. 闭包

首先不要把闭包想成很高深的东西,闭包就是函数。

一个函数内,返回了一个函数,这个返回的函数中引用了自身外的某个变量,那这就是闭包。返回一个Object同理。

闭包很常见,例如定义一个全局函数,函数中引用函数外的某个全局变量,这也是闭包。理解作用域链,可以促进对闭包的理解。

闭包本身不难,难的是用闭包技术去实现高阶函数,实现一些设计模式。

 

posted @ 2018-01-01 12:06  jkCaptain  阅读(133)  评论(0编辑  收藏  举报