if( )里强制类型转换成布尔类型,bar变成了未定义。
未声明就赋值是全局变量,做题认真分析AO和GO。
++只能对变量,原始值不能++
B
call 和 this 的作用在函数执行时改变this的指向(最完整的说法)
bind 详细见mdn
作用域是静态的。函数执行的上下文由函数定义的位置决定,并不是执行的位置决定。注意这里是 console.log(value) 和 console.log(this.value) 不一样!
输出结果是 { m : 2 } 和 { n :1,m : { m : 2 }}
理解引用值的赋值是地址和值一起赋给b,并且即使原来a 的地址改变了,b被赋予的地址依然是原来那个。
a.m = a = { m : 2 };这一行代码要从右往左执行,先改变了a 的地址,再给原来a的地址添加了一个属性m
有关原型链的知识还是有点乱。
记住:
- 只有函数function才具有prototype属性。这个属性是一个指针,指向一个对象,这个对象的用途就是包含所有实例共享的属性和方法(我们把这个对象叫做原型对象)。例如这道题里的 Foo.prototype
- 所有的对象都有__proto__ 属性(对象,函数),指向构造该对象的构造函数的原型。
- 原型对象也有一个属性,叫做constructor,这个属性包含了一个指针,指回原构造函数。
这道题要理解上面的第三点 constructor 是去原型对象里面找的,但是这里 Foo.prototype 已经被自定义了,变成了一个空对象,空对象的constructor 是 Object
构造函数new 之后 就一定返回一个对象,因此内部如果return 是原始值,不影响,但是如果是引用值,就返回引用值。
未解
看仔细一点,两个函数其实都没有返回值。
预编译的问题,if 里面的var a 在预编译的时候就被提升了。还有 in 运算符
输出结果是百度、腾讯、阿里。qureySelectorAll() 是静态地取到节点的集合,不像getElementById是动态的。
还有就是 parentNode.replaceChild(newChild, oldChild) 语法中,要替换的新节点oldChild。如果它已经存在于DOM中,则首先将其删除。注意这一点。