数据类型容易忽略的细节

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

数据类型的陷阱

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的新类型中不兼容。

目录
相关文章
|
6月前
|
C#
C#学习相关系列之数据类型类的三大特性(二)
C#学习相关系列之数据类型类的三大特性(二)
|
6月前
|
编译器 C++
【编码艺术:掌握String类函数接口的妙用指南】(三)
【编码艺术:掌握String类函数接口的妙用指南】
|
6月前
|
C语言 C++ 容器
【编码艺术:掌握String类函数接口的妙用指南】(一)
【编码艺术:掌握String类函数接口的妙用指南】
|
机器学习/深度学习 设计模式 算法
类型体系与基本数据类型(第三节)
类型体系与基本数据类型(第三节)
51 0
|
6月前
|
存储 Linux C语言
【编码艺术:掌握String类函数接口的妙用指南】(二)
【编码艺术:掌握String类函数接口的妙用指南】
|
11月前
|
程序员 编译器 C语言
C++风格与C风格类型强转异同
C++风格的强转: C++强制类型转换 C风格的强制类型转换很容易理解,不管什么类型都可以直接进行转换,使用格式如下: 目标类型 b = (目标类型) a; C++也是支持C风格的强制类型转换,但是C风格的强制类型转换可能会带来一些隐患,出现一些难以察觉的问题,所以C++又推出了四种新的强制类型转换来替代C风格的强制类型转换,降低使用风险。 在C++中,新增了四个关键字static_cast、const_cast、reinterpret_cast和dynamic_cast,用于支持C++风格的强制类型转换。 C++风格的强制类型转换能更清晰的表明它们要干什么,程序员只要看一眼这样的代码,立即
109 0
|
6月前
|
存储 安全 Go
掌握Go语言:Go语言类型转换,无缝处理数据类型、接口和自定义类型的转换细节解析(29)
掌握Go语言:Go语言类型转换,无缝处理数据类型、接口和自定义类型的转换细节解析(29)
134 0
|
6月前
|
存储 Linux C++
【编码艺术:掌握String类函数接口的妙用指南】(四)
【编码艺术:掌握String类函数接口的妙用指南】
|
6月前
数据类型容易忽略的细节
数据类型容易忽略的细节
58 0
|
存储 编译器
数据类型的本质分析
数据类型的本质分析
102 0