js中常用的数据类型
JavaScript 变量能够保存多种数据类型,而JavaScript中的数据类型分为基本数据类型和引用数据累心,常用的基本数据类型包括数字(Number)、字符串(String)、布尔值(Boolean)、Null、Undefine、Symbol等,常用的引用数据类型包括Object(对象)、Array(数组)、Function(函数)。基本类型和引用类型存储于内存的位置不同,基本类型直接存储在栈中,而引用类型的对象存储在堆中,与此同时,在栈中存储了指针,而这个指针指向正是堆中实体的起始位置,区别如下:
let a = 10;let b = a;b = 20;console.log(a) //10console.log(b) //20
上述代码中,a、b都是基本数据类型,两者分别修改赋值,相互之间没有任何影响。在看医用类型的例子:
let x = {a:10,b:20}let y = xy.a = 100y.b = 200console.log(x) //{a:100,b:200}console.log(y) //{a:100,b:200}
上述代码中,x、y都是引用类型。在执行了x = y之后,修改y的属性值,x的也跟着变化。因为x和y都是引用类型,指向了同一个内存地址,即两者引用的是同一个值,因此y修改属性时,x的值随之改动。
数据类型检测
- typeof
typeof返回一个表示数据类型的字符串,返回结果包括:number、boolean、string、symbol、object、undefined、function等7种数据类型,但不能判断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 无效typeof new Date(); //object 无效typeof new RegExp(); //object 无效
- instanceof
是用来判断A是否为B的实例,表达式为:A instanceof B,如果A是B的实例,则返回true,否则返回false。instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性,但它不能检测null 和 undefined
[] instanceof Array; //true{} instanceof Object; //truenew Date() instanceof Date; //truenew RegExp() instanceof RegExp //truenull instanceof Null //报错undefined instanceof undefined //报错
- Object.prototype.toString.call()
Object.prototype.toString.call() 是最准确最常用的方式。
Object.prototype.toString.call('') ; // [object String]Object.prototype.toString.call(1) ; // [object Number]Object.prototype.toString.call(true) ; // [object Boolean]Object.prototype.toString.call(undefine) ; // [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]