JS的数据类型|青训营笔记

59 阅读2分钟

javascript的数据类型

大体分为7种,其中基本数据类型6种,引用数据类型1种:

基本数据类型:string、number、boolean、null、undefined、symbol

引用数据类型:Object(object、function、array、data、regExp...)

区别:

1、声明变量时的存储分配

基本数据类型存储栈中,占用内存大小是固定的;

引用数据类型存储在堆中,占用内存大小是随内容大小变化的;

2、不同内存分配机制也带来了不同的访问机制

不可以直接访问堆内存空间的位置及直接操作堆内存的空间,只能操作对象在栈内存的引用地址;

基本数据类型直接访问到,引用数据类型访问引用地址,根据引用地址找到堆中实体;

3、复制变量时不同

基本数据类型:var a = 1;var b = a; 是将a的值赋值给b

引用数据类型:var a = { };var b = a;是将a的引用地址赋值给b,这时候改变b同样也会改变a;如下所示:

var a = [0,1,2,3,4,5]
var b = a
var c = 1

b[6] = 6
console.log(a)
//[0,1,2,3,4,5,6]

开始a、b引用的同一个地址,当我们新增数组元素时,会新开辟一个新内存(抛弃旧数组内存)来存放我们改变之后的新数组,随后a、b都会指向新的地址,如下图所示: image.png

判断javascript数据类型的方法

1、typeof

typeof运算符返回一个字符串,表示操作数的类型;

使用方法:(##operand表示要返回类型的对象或基本类型的表达式##)

  1. typeof operand
  2. typeof(operand)
typeof 123		 // number
typeof '文学'	        // string  
typeof undefined        // undefined
typeof true		// boolean  
typeof Symbol		// function 
typeof null		// object  
typeof {}		// object  
typeof []		// object  

从上面例子可以看出,typeof可以精准的判断基本数据类型(null除外)

2、instanceof

instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上;

使用方法:(##object 是指某个实例对象constructor是指某个构造函数##)

  1. Object instanceof constructor
function A(){	}
function B(){	}

var a = new A()

a instenceof A		//true
a instenceof B		//false

3、Object.prototype.toString.call()

Object.prototype.toString.call()方法:

Object.prototype.toString.call(123)		// [object Number]
Object.prototype.toString.call('文学')		// [object String]
Object.prototype.toString.call(undefined)	// [object Undefined]
Object.prototype.toString.call(true)	        // [object Boolean]
Object.prototype.toString.call(Symbol)		// [object Function]
Object.prototype.toString.call(null)		// [object Null]
Object.prototype.toString.call({})		// [object Object]
Object.prototype.toString.call([])		// [object Array]