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]"
可以完美判断全部变量类型