面试题如下,如何能打印出1

var a = ?
if (a == 1 && a == 2 && a == 3) {
    console.log(1)
}

知识点1:分析这道题目,首先我们要想到 == 与 === 的区别

当进行双等号比较时候: 先检查两个操作数数据类型,如果相同, 则进行===比较, 如果不同, 则愿意为你进行一次类型转换, 转换成相同类型后再进行比较, 而===比较时, 如果类型不同,直接就是false

知识点2:== 遇到不同的数据类型 遵循怎样的转换规则

1 对象和string 对象toString 再和string的比较
2 null == undefined
3 NaN 不等于任何值 判断NaN只能用isNaN
4 其他都是转化成数字 object => toString => 转化成数字

知识点3: valueOf和toString的区别以及调用顺序

1 toString() 方法返回一个表示改对象的字符串,如果是对象会返回,toString() 返回 “[object type]”,其中type是对象类型。
2 valueOf方法返回指定对象的原始值,JS会利用 valueOf() 方法用来把对象转换成原始类型的值(数值、字符串和布尔值
具体可参考 搞懂toString 和valueOf
https://www.jianshu.com/p/cf87b92ee365
1、 在进行对象转换时(例如:alert(a)),将优先调用toString方法,如若没有重写toString将调用valueOf方法,如果两方法都不没有重写,但按Object的toString输出。
2、 在进行强转字符串类型时将优先调用toString方法,强转为数字时优先调用valueOf。
3、 在有运算操作符的情况下,valueOf的优先级高于toString。

知识点介绍完了 我们来看这道题的答案
解法一:
用toString
var a = {

i: 1,
toString() {
    return this.i++
}

}
解法2:
用valueOf
var a = {

i: 1,
valueOf () {
    return this.i++
}

}
解法3:
a 为数组
var a = [1, 2, 3]
a.toString = a.shift

添加一个题目

var a = [0]
if(a) {
    console.log(a==true)
} else { 
    console.log(a)
}

小葱
95 声望3 粉丝