Skip to content

JavaScript 数据类型 #13

Open
Open
@JslinSir

Description

@JslinSir

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 方法被调用的时候,下面的步骤会被执行:
    1. 如果 this 值是 undefined,就返回 [object Undefined]
    2. 如果 this 的值是 null,就返回 [object Null]
    3. 让 O 成为 ToObject(this) 的结果
    4. 让 class 成为 O 的内部属性 [[Class]] 的值
    5. 最后返回由 "[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"

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions