隐式转换
当对象与原始值进行比较的时候,
- 优先比较valueOf
- 如果valueOf返回的是基础类型,则进行比较,反之则尝试toString方法
- 如果二者都返回对象,则抛出错误
let obj = {
toString() {
console.log("调用了tostring");
return 1
},
valueOf() {
console.log("先调用了valueof");
return {}
}
}
console.log(obj == 1); //true
变量提升函数提升
对于同名标识符,变量声明不会覆盖函数声明,但变量赋值会覆盖
console.log(s);
var s = 2;
function s() {}
console.log(s);
转化后
function s() {}
var s; //未赋值,发现已经有同名函数声明,跳过
console.log(s);
s = 2;
console.log(s);
//result: [Function: s]2