zoukankan      html  css  js  c++  java
  • 你可能不知道的js -- 数据类型转换

    请先思考问题:
    (a == 1 && a == 2 && a == 3)可能为true吗?

    答案必然是可以的。

    大家都知道,“ === ”是指类型和值都相等,而“ == ”只需要值相等。当两个数据类型不同的的情况下进行==比较时,会将不同的数据类型转换为同一数据类型,再进行比较。

    什么时候(a == 1 && a == 2 && a == 3)为true?

    解法一: 对象类型转换
    var a = {
      i: 1,
      toString: function () {
        return a.i++
      }
    }
    

    Object类型与Number类型进行比较时,对象类型会转换为Number类型,对象转换为Number时,会尝试调用Object.valueOf()和Object.toString()来获取相应的数字基本类型

    数组类型转换
    let a = [1, 2, 3];
    a.join = a.shift;
    console.log(a == 1 && a == 2 && a == 3)
    

    与上面类型转换一样,数组调用toString()会隐含调用Array.join()方法
    而数组的shift方法的用法:shift()方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。如果数组是空的,那么shift()方法将不进行任何操作,返回undefined值。请注意,该方法不创建新数组,而是直接修改原有的arrayObject

    所以我们可以看到a==1时会调用toString(),toString()方法调用join(),join()等于shift(),则转换为Number类型后为1

    定义a的get
    var val = 0; Object.defineProperty(window, 'a', { get: function() { return ++val; } }); console.log(a == 1 && a == 2 && a == 3);
    

    使用一个get,让a的返回值为三个不同的值

  • 相关阅读:
    mysql对表操作的各种语句
    Map遍历两种方式
    hibernate3
    Spring、mybaits整合
    mybaits注解
    mybaits 框架运用
    mybatis入门
    限制文本框字符数
    Unity3D Mathf函数
    Unity3d 粒子工具注释
  • 原文地址:https://www.cnblogs.com/hubufen/p/11993909.html
Copyright © 2011-2022 走看看