typeof
- typeof 给出的数据类型与js给出的存在差别:
typeof:number / string / boolean / undefined / function / object,typeof 返回的数据的类型全是 string
js:number / string / boolean / undefined / null / object - typeof 的优先级非常高,比加减乘除的优先级都高,如下例所示:
typeof 2*3;//NaN
typeof (2*3);//"number"
typeof 2+3;// "number3"
instanceof
var simpleStr = "This is a simple string";
var myString = new String();
var newStr = new String("String created with constructor");
var myDate = new Date();
var myObj = {};
var myArr = [];
var myNonObj = Object.create(null);
simpleStr instanceof String; // 返回 false, 检查原型链会找到 undefined
myString instanceof String; // 返回 true
newStr instanceof String; // 返回 true
myString instanceof Object; // 返回 true
myObj instanceof Object; // 返回 true, 尽管原型没有定义
({}) instanceof Object; // 返回 true, 同上
myNonObj instanceof Object; // 返回 false, 一种创建非 Object 实例的对象的方法
myArr instanceof Array // 返回 true
myArr instanceof Object // 返回 true
myDate instanceof Date; // 返回 true
myDate instanceof Object; // 返回 true
- 除了对象和数组使用文字符号创建后,instanceof Object 仍然返回 true。,其余数据类型必须其 实例 是通过 new 关键字创建的,在 instanceof 该数据类型时才能返回 true
- 该方法的另一局限性是无法判断该实例是不是对象,因为对于所有 new 方法创建出来的实例,Object.prototype都在其原型链上。当然构造函数的 prototype 可以改变,改变之后的值可能就不在实例的原型链上了
Object.prototype.toString
var toString = Object.prototype.toString;
toString.call(new Date); // [object Date]
toString.call(new String); // [object String]
toString.call(Math); // [object Math]
toString.call(undefined); // [object Undefined]
toString.call(null); // [object null]
toString.apply([1,2,3]); // [object Array]
toString.call({}); // [object object]
toString.call(123); // [object number]
toString.call('hello'); // [object string]
参考文献:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/toString
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/instanceof