let a = b = 10
;(function(){
let a = b = 20
})()
console.log(a) // 10
console.log(b) // 20
analysis:
连等操作从右向左执行,相当于 b = 10、let a = b,b没有声明就赋值了,所以会隐式创建为一个全局变量,函数内也一样,并没有声明b,直接对b赋值,因为作用域链,会一层一层向上查找,找到了全局的b,所以全局的b就被修改为了20,而函数内的a因为重新声明了,所以只是局部变量,不影响全局的a,所以a还是10
var name = 'World'
;(function () {
if (typeof name === 'undefined') {
var name = "Jack"
console.info('Goodbye ' + name)
} else {
console.info('Hello ' + name)
}
})() // Goodbye Jack
analysis:
变量提升,var声明变量时会把变量自动提升到当前作用域顶部,所以函数内的name虽然是在if分支内声明的,但是也会提升到外层,因为和全局的变量name重名,所以访问不到外层的name,最后因为已声明未赋值的变量的值都为undefined,导致if的第一个分支满足条件。
console.log(1 + NaN) // NaN
console.log("1" + 3) // '13'
console.log(1 + undefined) // NaN
console.log(1 + null) // NaN
console.log(1 + {}) // 1[object Object]
console.log(1 + []) // 1
console.log([] + {}) // [object Object]