zoukankan      html  css  js  c++  java
  • javascript的隐式类型转换(使(a==1&&a==2&&a==3) 成立)

    一些团队规定禁用 == 运算符换用=== 严格相等。以工程标准衡量,== 带来的便利性抵不上其带来的成本,团队协作时候你看到别人代码中的 ==,有些时候需要判断清楚作者的代码意图是确实需要转型,还是无所谓要不要转型只是随手写了,增加了一些额外的成本。但是我比较喜欢的一本书  You don't know JS,中作者也写道过一个我比较赞同的观点

    Many developers feel that === is more predictable, so they advocate always using that form and staying away from ==. I think this view is very shortsighted. I believe == is a powerful tool that helps your program, if you take the time to learn how it works.

    简译为

    很多开发者认为 === 的行为更加容易预测,从而主张使用 === 而远离 ==。我认为这种观点是非常短视的,如果你花点时间去搞清楚它的工作原理,== 将是你开发的强大工具。

    究竟谁对谁错也没有定论,但是去了解一些隐式转换的规则,对我们开发和调试bug都非常有帮助。这些规则规定很烦多,一个个看过来很无趣也不能全记住。我们下面从这个问题的一些答案中去探究其中的一小部分规则。

    下面代码中 a 在什么情况下会打印 1?

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

    利用重写toString/valueOf

    let a = { 
    i: 1,
    toString () { //或者valueOf 
    return a.i++ //先返回后加 
    } 
    } 
    if(a == 1 && a == 2 && a == 3) { 
    console.log('1');
     }

    数组对象:

    toString 方法返回一个字符串,该字符串由数组中的每个元素的 toString() 返回值经调用 join() 方法连接(由逗号隔开)组成,改写join方法为shift,每次返回第一个元素,并删除。

    var a = [1,2,3];
    a.join = a.shift;

    if(a == 1 && a == 2 && a == 3) {
    console.log('1');
    }

    ES6的symbol:

    Symbol.toPrimitive就是其中一个,它指向一个方法,表示该对象被转为原始类型的值时,会调用这个方法,返回该对象对应的原始类型值。这里就是改变这个属性,把它的值改为一个 闭包 返回的函数。

    let a = {[Symbol.toPrimitive]: ((i) => () => ++i) (0)}; 

    if(a == 1 && a == 2 && a == 3) {
    console.log('1');
    }
  • 相关阅读:
    codevs2606 约数和问题
    UOJ150 运输计划
    codevs1279 Guard 的无聊
    codevs1997 守卫者的挑战
    codevs1291 火车线路
    codevs1217 借教室
    codevs1281 Xn数列
    codevs1218 疫情控制
    codevs1199 开车旅行
    BZOJ1941 [Sdoi2010]Hide and Seek
  • 原文地址:https://www.cnblogs.com/Joe-and-Joan/p/11562106.html
Copyright © 2011-2022 走看看