数据类型
数据类型
原始类型:
Number
String
Boolean
Undefined
Symbol
BigInt
null
Object
Number
- 双精度 64 位二进制的值 (-253 -1) 到 253
- +infinity -infinity NaN
- Number.MAX_SAFE_INTEGER 最大整数
- Number.MIN_SAFE_INTEGER 最小整数
- Number.isSafeInteger(instance) 是否为安全数
- 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 + "";
}
- 浮点数计算 精度丢失 (eg 0.1 + 0.2 !== 0.3) 浮点转为二进制为非有限的 然后求值也是非有限的 转为十进制不准
Symbol
- let sy = Symbol('aa')
BigInt
- let n1 = BigInt(23) let n2 = 24n
类型判断
- 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 整数来标识
- intanceof
{} instanceof Object // true
[] instanceof Array // true
instanceof 原理:通过判断操作符左边 的proto 是否等于 右边的 prototype 比较原型 eg: return instance.proto === constructorHandler.prototype
- 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
- 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