JavaScript数据类型判断|小册免费学

193 阅读2分钟

思考题一:JS 分为哪两大类型?都有什么各自的特点?你该如何判断正确的类型?

JS 分为哪两大类型

JavaScript数据类型可以分为原始(Primitive)类型(又叫基本类型)和对象(Object)类型(又叫引用类型)两大类。

其中基本数据类型共有6种:UndefinedNullBooleanNumberStringSymbol (ES6新增)

除基本数据类型之外的都是引用数据类型,主要包括:ObjectArrayDateRegExpFunction 等。

各自的特点

基本数据类型特点:

  • 值被保存在栈内存中,在内存中占据固定大小的空间,;
  • 按值访问的,操作的是变量中保存的实际的值;
  • 基本类型的变量赋值给基本类型的变量,会创建这个值的一个副本,然后把该值赋值给新的变量的位置;
  • 不可以添加属性和方法;
  • 比较的是值本身;

引用数据类型特点:

  • 值被保存在堆内存中,引用类型变量存储的是引用地址;
  • 按引用访问的,操作的是是变量中保存的引用地址;
  • 引用类型变量赋值给另外一个引用类型变量时,复制的是原本变量的引用地址;
  • 可以添加属性和方法;
  • 比较的是引用地址;

如何判断正确的类型

  • typeof 判断 typeof 操作符返回一个字符串,表示未经计算的操作数的类型。

typeof 对于基本数据类型来说,除了 null 都可以显示正确的类型。

typeof 1         // 'number'
typeof '1'       // 'string'
typeof undefined // 'undefined'
typeof true      // 'boolean'
typeof Symbol()  // 'symbol'

typeof 对于引用类型来说,除了函数之外都会显示 object,所以无法准确判断引用数据类型。

typeof []           // 'object'
typeof {}           // 'object'
typeof console.log  // 'function'

这时可以考虑使用 instanceof

  • instanceof 判断 instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
({}) instanceof Object              // true
([]) instanceof Array               // true
(/aa/g) instanceof RegExp           // true
(function(){}) instanceof Function  // true

但是由于prototype属性是可以被修改的,所以instanceof的判断并不完全可信。

let arr = [];
arr.__proto__ = function(){}
arr instanceof Array    // false
arr instanceof Function // true
  • Object.prototype.toString.call() 判断 Object.prototype.toString.call()方法返回一个表示该对象的字符串。
Object.prototype.toString.call(null)         // "[object Null]"
Object.prototype.toString.call(undefined)    // "[object Undefined]"
Object.prototype.toString.call(1)            // "[object Number]"
Object.prototype.toString.call('1')          // "[object String]"
Object.prototype.toString.call(true)         // "[object Boolean]"
Object.prototype.toString.call(Symbol())     // "[object Symbol]"

Object.prototype.toString.call({})           // "[object Object]"
Object.prototype.toString.call([])           // "[object Array]"
Object.prototype.toString.call(new Date())   // "[object Date]"
Object.prototype.toString.call(new RegExp()) // "[object RegExp]"
Object.prototype.toString.call(function(){}) // "[object Function]"

应用

常见的需要判断一个数组,数组有新方法Array.isArray()用于确定传递的值是否是一个 Array。但是由于浏览器兼容性问题,可能存在Array.isArray()方法不存在的情况,所以可以有下面兼容写法。

if (!Array.isArray) {
  Array.isArray = function(arg) {
    return Object.prototype.toString.call(arg) === '[object Array]';
  };
}

本文正在参与「掘金小册免费学啦!」活动, 点击查看活动详情