JavaScript数据类型及检测类型

JavaScript分为基本数据类型和引用数据类型。

基本数据类型(原始类型):

* String

* Number

* Boolean

* Undefined

* Null

* Symbol

引用数据类型(对象类型):

*Object (对象,数组,函数)

一、基本数据类型

1.保存在栈内存中(空间小、大小固定、被频繁使用);

直接存储在变量访问的位置,可直接访问。

2.值是不可变的;

3. 变量赋值给另一个变量时,会将原始值的副本赋值给新变量,此后这两个变量是完全独立的,只是value相同。

二、引用数据类型

1.同时保存在栈内存和堆内存(占据空间大、大小不固定);

如果存储在栈中,将会影响程序运行的性能,这是因为:`引用值的大小会改变,所以不能把它放在栈中,否则会降低变量查寻的速度。相反,放在变量的栈内存中的值是该对象存储在堆中的地址。`

2.不可直接访问,在访问对象类型数据时,首先得到的是这个对象在堆内存中的引用地址,再拿这个地址去对应的获得这个对象,即按引用访问。

JavaScript数据类型及检测类型

引用类型的存储需要内存的栈区和堆区共同完成,栈区内存保存变量标识符和指向堆内存中该对象的指针,也可以说是该对象在堆内存的地址;

当解释器寻找引用值时,会首先检索其在栈内存中的地址,取得地址后从堆内存中获得实体。

3.将一个拥有对象内存地址的变量赋值给另一个变量时,是将这个地址赋值给了那个变量,并不是变量本身,所以说这两个变量的引用地址都指向了堆内存中的同一个对象,所以其中“一个”改变,“另一个”也会发生改变。

JavaScript数据类型及检测类型

三、数据类型检测

typeof and instanceof

1.typeof(可返回一个表示数据类型的字符串:number、boolean、string、symbol、object、undefined、function),但是不能判断null,array等。

typeof Symbol(); // symbol 有效

typeof ''; // string 有效

typeof 1; // number 有效

typeof true; //boolean 有效

typeof undefined; //undefined 有效

typeof new Function(); // function 有效

typeof null; //object 无效

typeof [] ; //object 无效

数组和null返回未object,可以使用instanceof进行判断。

2.instanceof(用来检测一个对象在其原型链中是否存在一个构造函数的prototype属性)

[] instanceof Array; //true

{} instanceof Object;//true

null instanceof Object;//false

貌似在对象的检测上要比typeof强,但是instanceof是存在弊端的。

console.log(1 instanceof Number)//false console.log(new Number(1) instanceof Number)//true

对于基本数据类型,字面量方式创建的值与标准的实例方式创建的值在instanceof检测中有区别。

var arr = [1, 2, 3];

console.log(arr instanceof Array) // true

console.log(arr instanceof Object);  // true

function fn(){}

console.log(fn instanceof Function)// true

console.log(fn instanceof Object)// true

JavaScript数据类型及检测类型

可以发现,在类的原型继承中,检测的结果也未必准确。

还有instanceof不能检测null和undefined

JavaScript数据类型及检测类型

对于null和undefined,对于的数据类型应该是null和undefined,但是。。。

3.Object.prototype.toString.call()准确判断数据类型方法,获取对象原型上的toString方法,执行方法,让toString方法中的this指向第一个参数的值。

Objec中的toString的作用是返回当前方法执行的this,其中第一个object代表当前实例对象数据类型,第二个代表this所属的类型。

Object.prototype.toString.call('') ;   // [object String]

Object.prototype.toString.call(1) ;    // [object Number]

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

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

Object.prototype.toString.call(null) ; // [object Null]

Object.prototype.toString.call(new Function()) ; // [object Function]

Object.prototype.toString.call(new Date()) ; // [object Date]

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

Object.prototype.toString.call(new RegExp()) ; // [object RegExp]

Object.prototype.toString.call(new Error()) ; // [object Error]

Object.prototype.toString.call(document) ; // [object HTMLDocument]

Object.prototype.toString.call(window) ; //[object global] window是全局对象global的引用