数据类型

164 阅读3分钟

说明:跟随MDN 数据类型与数据结构 [3] 进行复习

  • js 数据类型包含基础数据类型和对象;

基础数据类型

  • 基础数据类型:undefined、null、Boolean、Number、BigInt、String、Symbol
  • 所有基本数据类型的值都不可变,基本数据类型没有方法。但在基本类型上访问属性时,比如str.length,js自动将值装入包装器对象中并访问对象上的属性 [4] ;undefined、null没有Object wrapper(对象包装器); 对象包装器在访问属性时被创建、在该属性引用结束时销毁 [2]

基础数据类型如何判断其类型

除null外,都可使用typeof 判断出其数据类型;null 使用 === null判断

详解undefined与null

[9] : juejin.cn/post/715652…

数值类型

  • 数值类型包括Number、BigInt; Number(数字类型)包含浮点数、+Infinity、-Infinity、NaN; BigInt可表示任意精度的整数,可以安全地存储和操作大整数,甚至超过数字类型的安全整数限制;
  • BigInt转换成布尔时,行为同数字类型;BigInt不能与数字类型相互转换;

对象

  • 对象有数据属性(Value\Enumerable\Writable\Configurable)和访问属性(Get\Set\Enumerable\Configurable);
  • 对象类型包含

    • 标准对象和函数;
    • 日期;
    • 结构化数据:JSON;
    • 带键的集合 [8] :Maps(使{key: value}中key不被转换成字符串)、Sets(不重复的类数组结构)、WeakMaps、WeakSets;
    • 有序集: 数组和类型数组

对象类型的判断

  • typeof: typeof object

    • 返回结果为:‘object’ or 'function'('function'包含:function、 class)
    • 为什么class也是function? 因为js没有类,用原型链实现的类;类与构造函数详见: [6] juejin.cn/post/715652…
  • instanceof: object instanceof constructor

    • instanceof用于检测constructor.prototype是否存在于参数object的原型链上 [7] ;比如:

      • 检测dog是不是继承自animal;
      • let c = 'abc'; c instanceof String // true; c instanceof Object // true
    • 原型链可被使用__proto__修改,所以使用instanceof判断对象类型不可靠

  • Object.prototype.toString.call() 可用于检测对象类型

    image-20221020161812079.png

js标准内置对象

[5] JavaScript 标准内置对象 - JavaScript | MDN (mozilla.org)

小结

Object.prototype.toString.call()可以具体判断出value的数据类型;

typeof可以用于基本数据类型的判断;

instanceof可以判断出其原型链上是否出现过constructor.prototype

其他

文中“对象包装器在访问属性时被创建、在该属性引用结束时销毁”该段话存在争议。比如:

如何解释第一段代码执行比第二段快呢?

var s1='a';
var temp;var d0=new Date();for(var i=0;i<1000000;i++){temp = s1.length+s1+s1.substr()} console.log((new Date()-d0) + '----' + temp)


var s1=new String('a');
var temp;var d0=new Date();for(var i=0;i<1000000;i++){temp = s1.length+s1+s1.substr()} console.log((new Date()-d0) + '----' + temp)

参考资料

[1] Undefined类型与Null类型的区别,相同

[2] js包装对象(最核心)

[3] JavaScript 数据类型和数据结构 - JavaScript | MDN (mozilla.org)

[4] 基本类型 - 术语表 | MDN (mozilla.org)

[5] JavaScript 标准内置对象 - JavaScript | MDN (mozilla.org)

[6] js 对象与类 -- ES5、ES6构造函数与类创建对象的详细区别

[7] instanceof - JavaScript | MDN (mozilla.org)

[8] Set 和 Map 数据结构

[9] js 详解undefined与null