JavaScript数据类型

JavaScript中有一下七种数据类型:Number、String、Null、Undefined、Bool、Object以及Symbal。

基本数据类型

Number、String、Null、Undefined、Bool。
JavaScript的基本数据类型的访问是按值访问的,因为基本数据类型的值是保存在栈中的。

引用数据类型

Object、Function、Array等。
JavaScript的引用数据类型的访问是按引用访问的,引用数据类型的值是存放在栈和堆中的:指针存放在栈中,值存放在堆中。栈区内存保存变量标识符和指向堆内存中该对象的指针,也可以说是该对象在堆内存的地址。

数据类型的区分

  1. typeof 检查
typeof   123   //Number

typeof   'abc'  //String

typeof    true       //Boolean

typeof    undefined   //Undefined

typeof    null        //Object     

typeof    { }           //Object

typeof    [ ]           //Object

typeof    console.log()       //Function

可以看出 typeof 是检查不出来 null、{} 、[] 的。
推荐使用一下方法:

判断基本类型:
Object.prototype.toString.call(null) //"[object Null]"

Object.prototype.toString.call([]) //"[object Array]"

Object.prototype.toString.call({}) //"[object Object]"

Object.prototype.toString.call(123) //"[object Number]"

Object.prototype.toString.call("123") //"[object String]"

Object.prototype.toString.call(undefined) //"[object Undefined]"

Object.prototype.toString.call(true) //"[object Boolean]"

判断引用类型:
Function fn(){console.log(“test”);}
Object.prototype.toString.call(fn);//"[object Function]"

var date = new Date();
Object.prototype.toString.call(date);//"[object Date]"

var reg = /[hbc]at/gi;
Object.prototype.toString.call(reg);//"[object RegExp]"

数据包装类型

数据包装类型包含:Number、String、Boolean。数据包装类型是特殊的引用类型,每当创建一个基本数据类型的时候,就会在后台创建一个对应的数据包装类型对象,用来使基本数据类型可以访问对象上的方法和属性。
举个🌰:

var str = '123';
str.split('');

//后台创建对应的数据包装类型
var str = new String('123')//创建str对象
str.split('');//执行方法
str = null//销毁str

而且,通过构造函数和对象字面量创建的对象是不一样的:

var str = '123';
typeof str // string
var str1 = new String('123');
typeof str1 // object

其他的 Boolean 和 Number 也和 String 类似。

为什么使用Object.prototype.toString.call()?

因为toString方法是Object原型上的方法,而Array、function等类型作为Object的实例,都重写了toString方法。不同的对象的调用toString方法的时候,调用的都是重写的toString方法,而不是Object原型链上的方法。所以如果要得到对象的具体的类型,需要调用Object原型上的toString方法,即使用call将toString的this指向改变。

var fun = function(){
    alert(0)
};
console.log(fun.toString())//返回的是 函数的字符串形式
delete Function.prototype.toString;
console.log(fun.toString())// 返回的是[object Function]

因为删除了Function.prototype上的toString方法之后,根据原型链,它会沿着原型链查找到Object.prototype.toString方法

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!