美文网首页
a == 1 && a == 2 && a == 3

a == 1 && a == 2 && a == 3

作者: 励公子 | 来源:发表于2019-11-25 15:14 被阅读0次

js中有7种数据类型,可以分为两类:

  • 基础类型(原始值):
    UndefinedNullStringNumberBooleanSymbol(es6新出的)
  • 复杂类型(对象值):
    object

什么情况下能正确打印‘success’?

var  a = ???
if(a == 1 && a == 2 && a == 3 ){
    console.log('success')
}
  1. 关系运算符:会把其他数据类型转换成number之后再比较关系
  2. 首先我们排除掉原始数据类型(Undefined、Null、Boolean、Number 和 String、Symbol),a应该是个复杂数据类型
  3. 复杂数据类型在隐式转换时会利用valueOftoString,然后再转成Number运算(valueOf和toString是所有对象原型链顶层原型Object.prototype里的方法,所以每个对象都继承这两方法)

由此得知,我们可以重写复杂数据类型在隐式转换过程中所涉及的方法来达到效果

// 方法1
var a = {
    i: 0,
    valueOf() { // 这里的valueOf()也可以替换成toString()
        return ++this.i
    }
}
if(a == 1 && a == 2 && a == 3 ){
    console.log('success')
}

// 方法2
var a = {
    arr: [3, 2, 1],
    valueOf() { // 这里的valueOf()也可以替换成toString()
        return this.arr.pop()
    }
}
if (a == 1 && a == 2 && a == 3) {
  console.log('success')
}

在隐式转换为number时,执行以下流程:

1、如果当前值已经是一个原始类型,则直接返回它
2、否则,如果当前值是一个对象,则先调用valueOf()方法,如果结果是原始类型则直接返回
3、否则,调用这个对象的toString()方法,如果结果是原始类型,则返回toString()结果
4、否则,抛出TypeError异常

具体隐式转换规则可参考here

  1. 所以上题在运行时会先判断 a 的类型,此时typeof a('object'),不是原始类型,因此会先调用a.valueOf()
  2. 由于我们重写了valueOf(),因此会执行重写后的valueOf(),每一次都会(得到自增后的值)or(返回a.arr的尾元素,并更新a.arr),结果是原始类型所以不会再继续调用toString()
  3. 得出三次执行结果为 1, 2, 3, 满足条件

~~欢迎交流指正

相关文章

  • 1-1-3-3-2-2-1-2

    【加鞭而行】 子龙急加鞭,不想趷跶一声,连马和人,颠入土坑之内。张郃挺枪来刺。 忽然一道红光,从土坑中滚起,那匹马...

  • 1-1-3-3-2-2-2

    【倒马便走】 却说子龙倒马便走,张郃紧追不舍 前方突现一大土坑,子龙——(请选择) 急拉缰住马 急加鞭而行

  • 1-1-3-3-2-1-2

    【邀糜夫人上马】 子龙心中一动,遂邀糜夫人上马。两人共骑,逃出战场。子龙感到从未有过的幸福。 子龙很快访遍名医,治...

  • 1-1-3-3-2-2-1

    【挺枪便刺】 子龙挺枪便刺,张郃举枪架之。 两人战约十余合,不分胜负。云不敢恋战,夺路而走。张郃紧追不舍。 不想前...

  • 1-1-3-3-2-2-1-1

    【急拉缰绳】 子龙行路前方为一土坑,忙拉缰绳住马。身后张郃赶到,一枪刺中子龙后心,将子龙搠倒在地。 可怜赵子龙单骑...

  • 1-1-3-3-2-2

    【忙抱过阿斗】 子龙忙抱过阿斗,糜夫人已落入枯井中而死。 子龙解开勒甲绦,放下掩心镜,将阿斗抱护在怀。又恐曹军盗尸...

  • 数组排序

    如何把[1,1,1,2,2,2,3,3,3] 变成[[1,1,1],[2,2,2],[3,3,3]] 方法1 va...

  • 我用123领悟儒释道大家看看对不对

    儒1=1 2=2 3=3 释1=0 2=0 3=0 道1=2 2=3 3=1

  • 18.列表 list

    [1, 2, 3, 4, 2, 3, 1, 1, 0] [1, 0, 2, 3, 4, 2, 3, 1, 1] [...

  • Python3 shelve用法

    数据读写 输入结果 {'1': 1, '2': 2, '3': 3}{'1': 1, '2': 2, '3': 3...

网友评论

      本文标题:a == 1 && a == 2 && a == 3

      本文链接:https://www.haomeiwen.com/subject/ieqjwctx.html