Js数据类型和存储

Posted by Asser's Blog on May 22, 2019

js数据类型判断和内存存储方式

JavaScript数据类型

基本类型

String, Number, Boolean, Null, Undefined,Symbol,BigInt (后面两个为es6之后新增) > 引用类型

Array, Object, Function

数据存储方式

基本类型

数据全部固定长度,存储在栈内存中 > 引用类型

数据会存储在堆内存中,而堆内存的地址存放在栈内存中。即栈内存中存储的是堆内存的引用指针。 > 常见问题分析(修改b之后a为什么跟着变了)
var a = [1, 2, 3, 4];
var b = a;
b.push(5);
console.log(a); // [1, 2, 3, 4, 5]

我个人理解,出现上述问题的原因如下:

用于变量提升,var b = a; 这一步操作其实可以看成两步操作,即var b; b = a;变量b被声明,在栈内存中开辟出一块新的内存来供b使用,接着将a变量在栈内存中的值赋值给b,即b中存储的依旧是一个指向堆内存地址的指针。而数组的push操作是对堆内存的内容进行修改的,所以会出现b修改后a也跟着变化的情况。

基本类型判断

type of

typeof '123' // "string"
typeof 1123 // "number"
typeof true // boolean
typeof [1, 2, 3] // "object"
typeof undefined // 'undefined'
typeof null // 'object'
typeof function(){} // "function"

用于判断一个变量是否被声明很有效

instanceof

'1231' instanceof String // false
new String('1231') instanceof String // true
1231 instanceof Number // false
new Number(123) instanceof Number // true
[] instanceof Array // true
[] instanceof Object // true

Object.prototype.toString()

const getType = (variable) =>  Object.prototype.toString.call(variable);

getType('aa') // "[object String]"
getType(1231) // '[object Number]'
getType(null) // "[object Null]"
getType([]) // "[object Array]"
getType({}) // "[object Object]"
getType(undefined) // "[object Undefined]"
getType(() => {}) // "[object Function]"

可以完美判断全部变量类型