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都会指向新的地址,如下图所示:
判断javascript数据类型的方法
1、typeof
typeof运算符返回一个字符串,表示操作数的类型;
使用方法:(##operand表示要返回类型的对象或基本类型的表达式##)
typeof operandtypeof(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是指某个构造函数##)
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]