原始数据类型包括

    • boolean
    • null
    • undefined
    • number
    • string
    • symbol //es6 新的一种数据类型
    • bigint

    引用数据类型
    object 包括以下

    • Object 普通对象
    • Array 数组对象
    • RegExp 正则对象
    • Date 日期对象
    • Math 算数对象
    • Function 函数对象

    数据类型检测
    typeof 对于原始数据除了null (null是一个历史遗留问题 显示object) 其他都可以正确检测 对于引用数据类型(除了函数类型)都显示object

    数据类型之间的转换
    Javascript中类型转换只有以下三种

    • 转换成数字

      1. Number('abc') //NaN
      2. Number({a:1}) // NaN
      3. Number('123') // 123
    • 转换成布尔值 ```javascript Boolean(0) false Boolean(1) true Boolean(‘’) false Boolean(‘123’) true

    1. - 转换成字符串
    2. | 原始值 | 转换目标 | 说明 |
    3. | --- | --- | --- |
    4. | number | boolean | 除了0 -0 NaN 其他都为true |
    5. | string | boolean | 除了空字符串其他都为true |
    6. | undefined null | boolean | 都是false |
    7. | 引用类型 | boolean | 都为true |
    8. | number | string | 5=> '5' |
    9. | Boolean、函数、Symbol | string | 'true' |
    10. | 数组 | string | [1,2] => '1,2' |
    11. | 对象 | string | '[Object Object]' |
    12. 且对象类型只有null转换为Booleanfalse<br />== ===<br />==不像===那样严格,对于一般情况,只要值相等,就返回true,但==还涉及一些类型转换,它的转换规则如下:
    13. - 两边的类型是否相同,相同的话就比较值的大小,例如1==2,返回false
    14. - 判断的是否是nullundefined,是的话就返回true
    15. - 判断的类型是否是StringNumber,是的话,把String类型转换成Number,再进行比较
    16. - 判断其中一方是否是Boolean,是的话就把Boolean转换成Number,再进行比较
    17. - 如果其中一方为Object,且另一方为StringNumber或者Symbol,会将Object转换成字符串,再进行比较
    18. 对象转原始类型,会调用内置的[ToPrimitive]函数,对于该函数而言,其逻辑如下:
    19. - 如果Symbol.toPrimitive()方法,优先调用再返回
    20. - 调用valueOf(),如果转换为原始类型,则返回
    21. - 调用toString(),如果转换为原始类型,则返回
    22. - 如果都没有返回原始类型,会报错
    23. <br />
    24. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/410294/1602407862779-74e4609e-13ab-4ce5-b7f3-88282a352e87.png#align=left&display=inline&height=288&margin=%5Bobject%20Object%5D&name=image.png&originHeight=426&originWidth=1005&size=139062&status=done&style=none&width=679)
    25. 如何让if(a == 1 && a == 2)条件成立
    26. ```javascript
    27. var a = {
    28. value: 0,
    29. valueOf: function() {
    30. this.value++;
    31. return this.value;
    32. }
    33. };
    34. console.log(a == 1 && a == 2);//true

    一个简单验证数据类型的函数

    1. function isWho(x) {
    2. // null
    3. if (x === null) return 'null'
    4. const primitive = ['number', 'string', 'undefined',
    5. 'symbol', 'bigint', 'boolean', 'function'
    6. ]
    7. let type = typeof x
    8. //原始类型以及函数
    9. if (primitive.includes(type)) return type
    10. //对象类型
    11. if (Array.isArray(x)) return 'array'
    12. if (Object.prototype.toString.call(x) === '[object Object]') return 'object'
    13. if (x.hasOwnProperty('constructor')) return x.constructor.name
    14. const proto = Object.getPrototypeOf(x)
    15. if (proto) return proto.constructor.name
    16. // 无法判断
    17. return "can't get this type"
    18. }

    一些手写的数据类型判断

    1. const _array = [1, 2]
    2. // 判断是否是数组
    3. console.log(_array instanceof Array)
    4. console.log(Array.isArray(_array))
    5. console.log(Object.prototype.toString.call(_array) === '[object Array]')
    6. console.log(_array.constructor === Array)
    7. const _object = { a: 1 }
    8. //判断是否是对象
    9. console.log(_object instanceof Object)
    10. console.log(_object.constructor === Object)
    11. console.log(Object.prototype.toString.call(_object) === '[object Object]')
    12. const _function = function () { }
    13. // 判断是否是function
    14. console.log(typeof (_function) === 'function')
    15. console.log(_function instanceof Function)
    16. console.log(_function.constructor === Function)
    17. console.log(Object.prototype.toString.call(_function) === '[object Function]')
    18. const _null = null
    19. //判断是否是null
    20. console.log(null === null)