Open
Description
javaScript的类型 包含了 ‘基本数据类型’ 和 ‘引用数据类型’
基本数据类型
- String
- Number
- Boolean
- Symbol
- BigInt
- Null
- Undefined
引用数据类型 (Object)
- Object (普通对象)
- Array (数组对象)
- Date (日期对象)
- RegExp(正则)
- Function (函数)
- Math(数据函数)
- ...等
基本数据类型 和 引用 数据类型的存储方式
- 基本数据类型存储在栈内存(后进先出),被引用或拷贝时,会创建一个完全相等的变量;
- 引用类型存储在堆内存(先进先出),存储的是地址,多个引用指向同一个地址。
如何判断 数据类型
- typeof 可以准确检测基本数据类型 除 null(值为'object') 之外
- instanceof 方法去判断 这个对象是否是之前那个构造函数生成的对象
let Car = function() {}
let benz = new Car()
benz instanceof Car // true
- 通过 Object.prototype.toString 官网说明 去判断数据类型
原理:
当 toString 方法被调用的时候,下面的步骤会被执行:- 如果 this 值是 undefined,就返回 [object Undefined]
- 如果 this 的值是 null,就返回 [object Null]
- 让 O 成为 ToObject(this) 的结果
- 让 class 成为 O 的内部属性 [[Class]] 的值
- 最后返回由 "[object " 和 class 和 "]" 三个部分组成的字符串
console.log(Object.prototype.toString.call(undefined)) // [object Undefined]
console.log(Object.prototype.toString.call(null)) // [object Null]
var date = new Date();
console.log(Object.prototype.toString.call(date)) // [object Date]
var number = 1; // [object Number]
var string = '123'; // [object String]
var boolean = true; // [object Boolean]
var und = undefined; // [object Undefined]
var nul = null; // [object Null]
var obj = {a: 1} // [object Object]
var symbol = symbol(1) // [object Symbol ]
var array = [1, 2, 3]; // [object Array]
var date = new Date(); // [object Date]
var error = new Error(); // [object Error]
var reg = /a/g; // [object RegExp]
var func = function a(){}; // [object Function]
console.log(Object.prototype.toString.call(Math)); // [object Math]
console.log(Object.prototype.toString.call(JSON)); // [object JSON]
function a() {
console.log(Object.prototype.toString.call(arguments)); // [object Arguments]
}
a();
如何实现一个 instanceof
function myInstanceof(left, right) {
// 这里先用typeof来判断基础数据类型,如果是,直接返回false
if(typeof left !== 'object' || left === null) return false;
// getProtypeOf是Object对象自带的API,能够拿到参数的原型对象
let proto = Object.getPrototypeOf(left);
while(true) { //循环往下寻找,直到找到相同的原型对象
if(proto === null) return false;
if(proto === right.prototype) return true;//找到相同原型对象,返回true
proto = Object.getPrototypeof(proto);
}
}
// 验证一下自己实现的myInstanceof是否OK
console.log(myInstanceof(new Number(123), Number)); // true
判断对象是否为空 EmptyObject
function isEmptyObject( obj ) {
var name;
for ( name in obj ) {
return false;
}
return true;
}
关于BigInt 的出现解释
在 JavaScript 中,语言所能够保证“安全”(精确)地进行计算的最大整数是 2^53 - 1 ,也就是 9007199254740991 (常量 Number.MAX_SAFE_INTEGER)超过了这个数值,JS 就会产生一些意想不到的问题。比如:
9007199254740991 + 1 // => 结果是 9007199254740992
9007199254740991 + 2 // => 结果也是 9007199254740992
BigInt的提出,解决超过最大整数计算问题, n: 表示超过最大精度的运算
9007199254740991n + 1n // => 结果是 9007199254740992n
9007199254740991n + 4n // => 结果是 9007199254740995n
实现一个类型校验工具
function getType(obj) {
const lowerCaseTheFirstLetter = (str) => str[0].toLowerCase() + str.slice(1);
const type = typeof obj;
if (type !== 'object') {
return type;
}
return lowerCaseTheFirstLetter(
Object.prototype.toString.call(obj).replace(/^\[object (\S+)\]$/, '$1')
);
}
getType([]); // "array"
getType('123'); // "string"
getType(null); // "null"
getType(undefined); // "undefined"
getType(); // "undefined"
getType(function () {}); // "function"
getType(/123/g); // "regExp"
getType(new Date()); // "date"
getType(new Map()); // "map"
getType(new Set()); // "set"