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同理。
闭包很常见,例如定义一个全局函数,函数中引用函数外的某个全局变量,这也是闭包。理解作用域链,可以促进对闭包的理解。
闭包本身不难,难的是用闭包技术去实现高阶函数,实现一些设计模式。