Skip to main content

数据类型

数据类型

  原始类型:
Number
String
Boolean
Undefined
Symbol
BigInt
null
Object
Number
  1. 双精度 64 位二进制的值 (-253 -1) 到 253
  2. +infinity -infinity NaN
  3. Number.MAX_SAFE_INTEGER 最大整数
  4. Number.MIN_SAFE_INTEGER 最小整数
  5. Number.isSafeInteger(instance) 是否为安全数
  6. number.toFixed(2) bug
function toFixed(num, s) {
var times = Math.pow(10, s);
var des = num * times + 0.5;
des = parseInt(des, 10) / times;
return des + "";
}
  1. 浮点数计算 精度丢失 (eg 0.1 + 0.2 !== 0.3) 浮点转为二进制为非有限的 然后求值也是非有限的 转为十进制不准
Symbol
  1. let sy = Symbol('aa')
BigInt
  1. let n1 = BigInt(23) let n2 = 24n
类型判断
  1. typeof
typeof 10; // 'number'
typeof "str"; // 'string'
typeof false; // 'boolean'
typeof undefined; // 'undefined'
typeof 23n; // 'bigint'
typeof Symbol(); // 'symbol'
typeof null; // 'object'
typeof {}; // 'object'
typeof []; // 'object'
typeof function () {}; // 'function'

typeof 的原理:js 在存储变量的时候,会在变量的机器码的低位 1~3 位存储其类型信息 eg: 000: 对象 010: 浮点数 100:字符串 110:布尔 1:整数 null:所有的机器码都是 0 undefined:-2**30 整数来标识

  1. intanceof
  {} instanceof Object // true
[] instanceof Array // true

instanceof 原理:通过判断操作符左边 的proto 是否等于 右边的 prototype 比较原型 eg: return instance.proto === constructorHandler.prototype

  1. constructor
  ''.constructor === String // true
false.constructor === Boolean // true
[].constructor === Array // true
{}.constructor === Object // true
100.constructor === Number // Uncaught SyntaxError: Invalid or unexpected token
null.constructor === null // Uncaught TypeError: Cannot read properties of null (reading 'constructor')
undefined.constructor === undefined // Uncaught TypeError: Cannot read properties of undefined (reading 'constructor')
Object.create(null) === Object // false
  1. Object.prototype.toString.call(type)
Object.prototype.toString.call([]); // '[object Array]'
Object.prototype.toString.call(""); // '[object String]'

原理:Object.prototype.toString 上的方法是可以返回数据类型的 数据类型有内部属性[Class]表示数据类型, 引用数据类型这个属性跟创建改数据对象的内建构造函数相对应,null、undefined 为 Null Undefined; 其他与其封装对象对应 eg number =》 Number