【一】JavaScript数据类型
1,JavaScript共有6种基本类型,也叫值类型,USBNNS:Undefined、String、Boolean、Number、Null、Symbol(ES6新增)
注意:也就是说,我们不用非要去给变量赋一个字符串的值,去区分它和别的变量的值不同,因为去给每个变量取个语义化而又不同的值是一件伤脑子的事,当我们只需要知道每个变量的值都是百分百不同的即可,这时候我们就可以用Symbol。
2,JavaScript共有3种引用数据类型,对象Object、数组Array、函数Function
【二】typeof操作符
typeof操作符返回一个字符串,表示未经计算的操作数的类型。
类型 结果
String "string"
Number "number"
Boolean "boolean"
Undefined "undefined"
Object "object"
function函数对象 "function"
Symbol(ES6新增) "symbol"
宿主对象(由JS环境提供) Implementation-dependent
["a", "b"] "object"
null "object"
NaN "number"
注意:typeof的结果共有7种,对应7种数据类型,特殊的有2种,数组Array和null都对应object
此外,还有一些数据根据创建方式的不同,typeof时会返回不同的结果
typeof 1 //'number'
typeof new Number(1) //'object'
typeof 'str' //'string'
typeof new String('str') //'object'
如果需要判断数据类型,建议使用Object.prototype.toString
【三】Object.prototype.toString
Object.prototype.toString.call(1); // '[object Number]'
Object.prototype.toString.call(new Number); //'[object Number]'
Object.prototype.toString.call([]); // '[object Array]'
封装一个靠谱的类型检测函数:
function classOf(obj) {
return Object.prototype.toString.call(obj).slice(8, -1);
}
classOf([]); //'Array'
【四】instanceOf
instanceof运算符用于测试构造函数的prototype属性是否出现在对象的原型链中的任何位置
使用示例:
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
var auto = new Car('Honda', 'Accord', 1998);
console.log(auto instanceof Car);
// expected output: true
console.log(auto instanceof Object);
// expected output: true
原理剖析:
function instance_of(L, R) {//L 表示左表达式,R 表示右表达式
var O = R.prototype;// 取 R 的显示原型
L = L.__proto__;// 取 L 的隐式原型
while (true) {
if (L === null)
return false;
if (O === L)// 这里重点:当 O 严格等于 L 时,返回 true
return true;
L = L.__proto__;
}
}