数据类型
- 基本类型
- number
- string
- boolean
- null
- undefined
- Stymbol 唯一值 (ES6新增)
- 引用类型
- Object
- function
对象的属性的属性名不能是引用类型,如果是引用类型类型,默认会转换成字符串
例1 属性名为boolean类型
const obj={};
const val = true;
obj[val] = 'test';
console.log(obj) // {true : test}
例2 属性名为对象类型
let a = {
x: 100
};
let b = {
y: 200
};
let obj1 = {};
obj1[a] = 'test1';
//=>obj["[object Object]"]="test1";
obj[b] = "test2";
//=>obj["[object Object]"]="test2";
console.log(obj[a] === obj[b]); //=>true
检测数据类型
-
typeof 用法:typeof [value] 返回当前值[value]的数据类型,且返回值为字符串string 优势:适用于基本类型 缺点:无法区分基本类型中的null和引用类型中的数组、对象、正则等,返回的都是"object"
-
instanceof 用法:[value] instanceof [类] 通过检测这个值是否属于这个类, 从而验证是否为这个类型 优势:对于数组、正则、对象可以细分一下 缺点: 基本数据类型无法基于它来进行检测 检测的原理:只要在当前实例的__proto__出现这个类,检测结果就是true 如:Array.prototype = Object.prototype
-
constructor 和instanceof类似,也是非专业检测数据类型的,但是可以这样处理一下 语法:[val].constructor === 类 相对于instanceof来讲基本数据类型也可以处理,而且因为获取实例的constructor实际上获取 的是之间所属的类,所以在检测准确性上比instanceof还好一些 缺点:constructor是可以随意被改动的
-
Object.prototype.toString.call([val]) 在其它数据类型的内置类原型上有toString,但是都是用来转换为字符串的,只有Object基类 原型上的toString是用来检测数据类型的 obj.toString() obj这个实例调用Object.prototype.toString执行,方法执行里面的this 是当前操作的实例obj,此方法就是检测实例this的数据类型的,返回结果:"[Object 所属类]" Object.prototype.toString.call([val]) 基于call强制改变方法中this是[val],就相 当于在检测val的数据类型 <=> ({}).toString.call([val]) 最强大的检测方案