数据类型
- 原始数据类型
Number、String、Boolean、Undefined、Null
Symbol和Biglnt是ES6新增类型:
Symbol独一无二数据类型,解决全局变量冲突问题。
Biglint任意精度格式的整型,安全操作大整数,即使超出Number安全范围 - 引用数据类型
Object、Array、Function、RegExp
堆栈
栈内存存放原始数据类型,堆内存存放应用数据内存。
存储位置不同
原始数据直接存储在栈stack中的简单数据段,空间小,大小固定,属于被频繁使用的数据。
引用数据类型存储在堆heap中的对象,占据空间大、大小不固定。引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值,会先在栈中检索地址,从堆中获得实体。
数据结构
栈,先进后出;
堆,优先队列。
操作系统
栈由编译器分配释放。
堆由开发者分配,开发者不释放,由垃圾回收机制回收。
数据类型检测方法
typeof
console.log(typeof 2); // number
console.log(typeof true); // boolean
console.log(typeof 'str'); // string
console.log(typeof []); // object
console.log(typeof function(){}); // function
console.log(typeof {}); // object
console.log(typeof undefined); // undefined
console.log(typeof null); // object
instanceof
运行机制:判断在其原型链中是否能找出该类型的原型;所以instanceof只能正确判断引用数据原型,不能判断基本数据原型。
console.log(2 instanceof Number); // false
console.log(true instanceof Boolean); // false
console.log('str' instanceof String); // false
console.log([] instanceof Array); // true
console.log(function(){} instanceof Function); // true
console.log({} instanceof Object); // true
constructor
对象实例通过constructor访问构造函数,如果改变其原型,那么就不能拿来判断了
console.log((2).constructor === Number); // true
console.log((true).constructor === Boolean); // true
console.log(('str').constructor === String); // true
console.log(([]).constructor === Array); // true
console.log((function() {}).constructor === Function); // true
console.log(({}).constructor === Object); // true
Object.prototype.toString.call()
Object.prototype.toString.call()使用Object对象的原型方法toString来判断数据类型
var a = Object.prototype.toString;
console.log(a.call(2));
同样是检测对象obj调用toString方法,obj.toString()的结果和Object.prototype.toString.call(obj)的结果不一样,这是为什么?
这是因为toString是Object的原型方法,而Array、function等引用数据类型作为Object的实例,都重写了toString方法。不同的对象类型调用toString方法时,根据原型链的知识,调用的是对应的重写之后的toString方法(function类型返回内容为函数体的字符串,Array类型返回元素组成的字符串…),而不会去调用Object上原型toString方法(返回对象的具体类型)。
所以采用obj.toString()不能得到其对象类型,只能将obj转换为字符串类型;因此,在想要得到对象的具体类型时,应该调用Object原型上的toString方法。
判断数组的方法
Object.portotype.toString.call
Object.prototype.toString.call(obj).slice(8,-1) === 'Array';
//取第八位到倒数第一位对比‘数组’
ES6的Array.isArray()
instanceof关键词
通过Array.prototype.isPortotypeOF()
null和underfined区别
null代表空对象,常用于初始化,undefined代表未定义。
双等号判断两者会返回true,三等号会返回false。
typeof判断类型时,Null类型会返回“object”
其他值到字符串的转换规则
● Null 和 Undefined 类型 ,null 转换为 "null",undefined 转换为 "undefined",
● Boolean 类型,true 转换为 "true",false 转换为 "false"。
● Number 类型的值直接转换,不过那些极小和极大的数字会使用指数形式。
● Symbol 类型的值直接转换,但是只允许显式强制类型转换,使用隐式强制类型转换会产生错误。
● 对普通对象来说,除非自行定义 toString() 方法,否则会调用 toString()(Object.prototype.toString())来返回内部属性 [[Class]] 的值,如"[object Object]"。如果对象有自己的 toString() 方法,字符串化时就会调用该方法并使用其返回值。
其他值转到布尔值
以下这些是假值:
• undefined
• null
• false
• +0、-0 和 NaN
• ""
假值的布尔强制类型转换结果为 false。从逻辑上说,假值列表以外的都应该是真值。
网友评论