数据类型
数据类型
js
的数据类型有两类:
- 基本数据类型(7 种):
Number
String
Boolean
null
undefined
Symbol
BigInt
- 引用数据类型:
Object
Object
包含: Object、Array、Function、Data、Regex
Math
是内置对象,它不是一个构造器,所有属性与方法都是静态的,不支持 BigInt
不同类型在内存中的存储
- 直接声明方式创建的基本类型,存放在栈内存中;
- 使用
new
创建基本类型(包装类型),是存在堆内存中,但存储的是指向栈内存的引用; new
创建的基本类型与声明式的同值但不全等,因为typeof
类型不同。
JS
const a = 'string';
const b = new String('string');
typeof a // 'string'
typeof b // 'object'
const a = 'string';
const b = new String('string');
typeof a // 'string'
typeof b // 'object'
以上说法存疑,目前红宝书等资料都说 js 分为栈内存与堆内存,但 ECMA 标准并没有定义内存的分类,由浏览器的编译器自己实现,目前 V8 引擎说法是基本类型也会存放在堆内存中。(待考证)
类型判断
1. typeof
- 能区分基本数据类型
- 但
Object、Array、Null
都返回object
特殊情况
JS
typeof null === 'object'
typeof function() {} === 'function'
typeof Date === 'function'
typeof null === 'object'
typeof function() {} === 'function'
typeof Date === 'function'
2. instanceof
- 只能判断类实例对象,不支持基本数据类型
- 能够区分
Object、Array、Function
e.g {} instanceof Object
3. Object.prototype.toString.call()
类型判断准确,但写法不容易记
JS
var toString = Object.prototype.toString;
console.log(toString.call(1)); //[object Number]
console.log(toString.call(true)); //[object Boolean]
console.log(toString.call('mc')); //[object String]
console.log(toString.call([])); //[object Array]
console.log(toString.call({})); //[object Object]
console.log(toString.call(function(){})); //[object Function]
console.log(toString.call(undefined)); //[object Undefined]
console.log(toString.call(null)); //[object Null]
var toString = Object.prototype.toString;
console.log(toString.call(1)); //[object Number]
console.log(toString.call(true)); //[object Boolean]
console.log(toString.call('mc')); //[object String]
console.log(toString.call([])); //[object Array]
console.log(toString.call({})); //[object Object]
console.log(toString.call(function(){})); //[object Function]
console.log(toString.call(undefined)); //[object Undefined]
console.log(toString.call(null)); //[object Null]
4. 其它
- 判断数组
Array.isArray()