一、typeof
typeof 操作符返回一个字符串,表示未经计算的操作数的类型。console.log(typeof 3.14); //number
console.log(typeof Math.LN2); //number
console.log(typeof Infinity); //number
console.log(typeof NaN); // number NaN是"Not-A-Number"的缩写
console.log(typeof ""); //string
console.log(typeof "bla"); //string
console.log(typeof (typeof 1)); // string typeof 操作符返回一个字符串
console.log(typeof true); //boolean
console.log(typeof false); //boolean
console.log(typeof function () { }) //function
console.log(typeof Math.sin) //function
console.log(typeof new Function()) //function
console.log(typeof [1, 2, 4]); //object
console.log(typeof new Date()); //object
console.log(typeof null); //object 从一开始出现JavaScript就是这样的
解析:
在 JavaScript 最初的实现中,JavaScript 中的值是由一个表示类型的标签和实际数据值表示的。对象的类型标签是 0。由于 null 代表的是空指针(大多数平台下值为 0x00),因此,
null的类型标签也成为了 0,typeof null就错误的返回了"object".ECMAScript提出了一个修复(通过opt-in),但被拒绝。这将导致typeof null === ‘null’
使用 new 操作符
All constructor functions while instantiated with ‘new’ keyword will always be typeof ‘object’
用“new”关键字实例化时,所有构造函数函数都将始终为“object”类型
var str = new String('String');
var num = new Number(100);
console.log(typeof str); //object
console.log(typeof num); //object
But there is a exception in case of Function constructor of Javascript
但对于javascript的函数构造函数有一个例外
var func = new Function();
console.log(typeof func); //function
语法中需要括号
Parentheses will be very much useful to determine the data type for expressions.
括号对于确定表达式的数据类型非常有用。
var iData = 99;
console.log(typeof iData + ' Amy'); //number Amy
console.log(typeof (iData + ' Amy')); //string
二、instanceof
instanceof运算符测试构造函数的原型属性是否出现在对象的原型链中的任何位置。对于值类型,你可以通过typeof判断,string/number/boolean都很清楚,但是typeof在判断到引用类型的时候,返回值只有object/function,你不知道它到底是一个object对象,还是数组,还是new Number等等。这个时候就可以使用instanceof。使用instanceof有很多细节问题 。
Instanceof 的使用规则是: A instanceof B
A沿着proto这条线来找,同时B沿着prototype这条线来找,如果两条线能找到同一个引用,即同一个对象,那么就返回true。如果找到终点还未重合,则返回false
function Foo() {}
var foo = new Foo();
console.log(foo instanceof Foo); //true
console.log(foo instanceof Object); //true
console.log(Function instanceof Object); //true
参考:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/typeof
https://blog.youkuaiyun.com/qinxuan_1002/article/details/79246355