zoukankan      html  css  js  c++  java
  • 类型转换

    反过来也一样:
    var x = "42";
    var y = false;
    x == y; // false
    Type(y) 是布尔值,所以 ToNumber(y) 将 false 强制类型转换为 0,然后 "42" == 0 再变成
    42 == 0,结果为 false。
    也就是说,字符串 "42" 既不等于 true,也不等于 false。一个值怎么可以既非真值也非假
    值,这也太奇怪了吧?
    这个问题本身就是错误的,我们被自己的大脑欺骗了。
    "42" 是一个真值没错,但 "42" == true 中并没有发生布尔值的比较和强制类型转换。这里
    不是 "42" 转换为布尔值(true),而是 true 转换为 1,"42" 转换为 42。
    这里并不涉及 ToBoolean,所以 "42" 是真值还是假值与 == 本身没有关系!
    重点是我们要搞清楚 == 对不同的类型组合怎样处理。== 两边的布尔值会被强制类型转换
    为数字。
    很奇怪吧?我个人建议无论什么情况下都不要使用 == true 和 == false。
    请注意,这里说的只是 ==,=== true 和 === false 不允许强制类型转换,所以并不涉及
    ToNumber。
    例如:
    var a = "42";
    强制类型转换 | 81
    // 不要这样用,条件判断不成立:
    if (a == true) {
    // ..
    }
    // 也不要这样用,条件判断不成立:
    if (a === true) {
    // ..
    }
    // 这样的显式用法没问题:
    if (a) {
    // ..
    }
    // 这样的显式用法更好:
    if (!!a) {
    // ..
    }
    // 这样的显式用法也很好:
    if (Boolean( a )) {
    // ..
    }
    避免了 == true 和 == false(也叫作布尔值的宽松相等)之后我们就不用担心这些坑了

  • 相关阅读:
    spin lock自旋锁 双链表操作(多线程安全)(Ring0)
    Interlocked单向链式栈
    自旋锁(Spin Lock)
    可等待定时器(获取系统时间)
    APC注入(Ring3)
    IOCP IO完成端口
    异步设备IO OVERLAPPED结构(设备内核对象 事件内核对象 可提醒IO)
    读写锁 SRWLOCK
    shell查看进程
    linux dmesg命令
  • 原文地址:https://www.cnblogs.com/guidan/p/10694921.html
Copyright © 2011-2022 走看看