数据类型容易忽略的细节

简介: 数据类型容易忽略的细节

数据类型的陷阱

1. 是不是Object

function isObject(obj) {
  if(typeof obj === 'object') {
    return true;
  }
  return false;
}

第一个问题: . 上面的方法有什么问题?

typeof null // object

第二个问题:为什么typeof null返回的值是"object" ?

typeof原理

js 在底层存储变量的时候,会在变量的机器码的低位1-3位存储其类型信息: 对象:000 浮点数:010 字符串:100 布尔:110 ”。typeof直接根据变量值得内存标识符进行判断并返回的是对应字符串形式的值。

// 类型标记位

// 000: object

// 001: integer

// 010: double

// 100: string

// 110: boolean

第三个问题:为什么不修复这个问题?

注意: 现在的V8引擎不在这样判断数据类型,为了考虑兼容性没有修改,ES6提案修改这个bug但是没有通过。因为修改可能会造成一连串bug。

2.+转为数字

const print = console.log;
function toNumber(val) {
    const result = +val;
    print(result);
    return result
}
// 传统数据类型
toNumber(null) // NaN
toNumber(undefined) // NaN
toNumber(1) // 1
toNumber("123aa") // NaN
toNumber({}) // NaN
toNumber(true) // 1
// ES6的 bigInt和Symbol
toNumber(10n)
toNumber(Symbol.for("a"))

ES6的 bigInt和Symbol无法实现

TypeError: Cannot convert a BigInt value to a number

TypeError: Cannot convert a Symbol value to a number

为什么会这样?

兼容性问题,在ES5中完全兼容,但是在ES6的新类型中不兼容。

目录
相关文章
|
7月前
|
C#
C#学习相关系列之数据类型类的三大特性(二)
C#学习相关系列之数据类型类的三大特性(二)
|
存储 编译器 程序员
C++基础篇之什么是数据类型
C++基础篇之什么是数据类型
|
7月前
|
存储 安全 C语言
【C数据(一)】数据类型和变量你真的理解了吗?来看看这篇
【C数据(一)】数据类型和变量你真的理解了吗?来看看这篇
|
7月前
数据类型容易忽略的细节
数据类型容易忽略的细节
62 0
|
存储 编译器 C#
C# 变量数据类型的使用和案例(基础篇)
C# 变量数据类型的使用和案例(基础篇)
|
存储 编译器
数据类型的本质分析
数据类型的本质分析
103 0
|
存储 编译器 C语言
C语言数据类型类型及语句(各种详细的细节以及基础+持续更新中
C语言数据类型类型及语句(各种详细的细节以及基础+持续更新中
229 0
C语言数据类型类型及语句(各种详细的细节以及基础+持续更新中
C#基础Ⅲ-数据类型
C#基础Ⅲ-数据类型
|
存储 安全 Java
【C#基础】C# 数据类型总结
编程语言 C# 数据类型的介绍 。
108 0
【C#基础】C# 数据类型总结
实战:第五章:EZDML修改数据类型
实战:第五章:EZDML修改数据类型
132 0
实战:第五章:EZDML修改数据类型