数据类型
- null
- undefined
- boolean
- number
- string
- object
- symbol
- Bigint
typeof
typeof null; //object
typeof undefined; //undefined
typeof false; //boolean
typeof 1; //number
typeof "1"; //string
typeof {}; //object
typeof Symbol(); //string
typeof 123n; // bigint
typeof function () {}; //function
问题1
function实际上也是对象但它属于object的子类型,是可调用对象,虽然它不是内置类型但typeof可以区分函数和其它对象
问题2
typeof null得到object,原因是对象在底层都表示为二进制,在Javascript中二进制低三位都为0的话会被判断为object,null的二进制全为0,所以执行typeof时会返回"object"
Object.prototype.toString
var toString = function (v) {
console.log(Object.prototype.toString.call(v).slice(8, -1));
};
toString(null); //Null
toString(undefined); //Undefined
toString(false); //Boolean
toString(1); //Number
toString("1"); //String
toString({}); //Object
toString(Symbol()); //Symbol
toString(123n); //BigInt
toString(function () {}); //Function
toString(new Date()); //Date
toString([]); //Array
toString(/reg/gi); //RegExp
上面的typeof无法判断null也无法判断array/date/reg等,这时候可以用Object.prototype.toString,这也是类型判断的终极手段。不过Object.prototype.toString得到的值也是可以通过Symbol.toStringTag 来修改的
var arr = [];
arr[Symbol.toStringTag] = "Hello";
Object.prototype.toString.call(arr); //[object Hello]
instanceof
instanceof是用来比较一个对象是否为某一个构造函数的实例,实际上它执行的操作就是不断寻找对象的原型链对象比较是否等于构造函数的原型,实现如下。
function myInstanceof(obj, Con) {
let pro = Con.prototype;
while (obj.__proto__) {
if (obj.__proto__ === pro) return true;
obj = obj.__proto__;
}
return false;
}
//这里可以看出是通过和构造函数的原型比较得出的结果
function A() {}
function B() {}
var a = new A();
a.__proto__ = B.prototype;
a instanceof A; //false
a instanceof B; //true
另外instanceof可以通过对象方法的形式调用
a instance A
//等价于
A[Symbol.hasInstance](a)
网友评论