思考题一:JS 分为哪两大类型?都有什么各自的特点?你该如何判断正确的类型?
JS 分为哪两大类型
JavaScript数据类型可以分为原始(Primitive)类型(又叫基本类型)和对象(Object)类型(又叫引用类型)两大类。
其中基本数据类型共有6种:Undefined、Null、Boolean、Number、String、Symbol (ES6新增)。
除基本数据类型之外的都是引用数据类型,主要包括:Object、Array、Date、RegExp、Function 等。
各自的特点
基本数据类型特点:
- 值被保存在栈内存中,在内存中占据固定大小的空间,;
- 按值访问的,操作的是变量中保存的实际的值;
- 基本类型的变量赋值给基本类型的变量,会创建这个值的一个副本,然后把该值赋值给新的变量的位置;
- 不可以添加属性和方法;
- 比较的是值本身;
引用数据类型特点:
- 值被保存在堆内存中,引用类型变量存储的是引用地址;
- 按引用访问的,操作的是是变量中保存的引用地址;
- 引用类型变量赋值给另外一个引用类型变量时,复制的是原本变量的引用地址;
- 可以添加属性和方法;
- 比较的是引用地址;
如何判断正确的类型
typeof判断typeof操作符返回一个字符串,表示未经计算的操作数的类型。
typeof 对于基本数据类型来说,除了 null 都可以显示正确的类型。
typeof 1 // 'number'
typeof '1' // 'string'
typeof undefined // 'undefined'
typeof true // 'boolean'
typeof Symbol() // 'symbol'
typeof 对于引用类型来说,除了函数之外都会显示 object,所以无法准确判断引用数据类型。
typeof [] // 'object'
typeof {} // 'object'
typeof console.log // 'function'
这时可以考虑使用 instanceof。
instanceof判断instanceof运算符用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上。
({}) instanceof Object // true
([]) instanceof Array // true
(/aa/g) instanceof RegExp // true
(function(){}) instanceof Function // true
但是由于prototype属性是可以被修改的,所以instanceof的判断并不完全可信。
let arr = [];
arr.__proto__ = function(){}
arr instanceof Array // false
arr instanceof Function // true
Object.prototype.toString.call()判断Object.prototype.toString.call()方法返回一个表示该对象的字符串。
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
Object.prototype.toString.call(1) // "[object Number]"
Object.prototype.toString.call('1') // "[object String]"
Object.prototype.toString.call(true) // "[object Boolean]"
Object.prototype.toString.call(Symbol()) // "[object Symbol]"
Object.prototype.toString.call({}) // "[object Object]"
Object.prototype.toString.call([]) // "[object Array]"
Object.prototype.toString.call(new Date()) // "[object Date]"
Object.prototype.toString.call(new RegExp()) // "[object RegExp]"
Object.prototype.toString.call(function(){}) // "[object Function]"
应用
常见的需要判断一个数组,数组有新方法Array.isArray()用于确定传递的值是否是一个 Array。但是由于浏览器兼容性问题,可能存在Array.isArray()方法不存在的情况,所以可以有下面兼容写法。
if (!Array.isArray) {
Array.isArray = function(arg) {
return Object.prototype.toString.call(arg) === '[object Array]';
};
}
本文正在参与「掘金小册免费学啦!」活动, 点击查看活动详情