typeof
typeof
操作符返回一个字符串,指示未经计算的操作数的类型。
typeof operation
operation是一个表达式,表示对象或原始值,其类型将被返回。
对应不同的数据类型可能的返回值有:
String ==> string
Undefined ==> undefined
Number ==> number
Boolean ==> boolean
Null ==> object
函数对象 ==> function
任何其他对象 ==> object
Symbol(ES6新增的) ==> symbol
(undefined, number, string, boolean)属于简单的值类型,不是对象。剩下的几种情况——函数、数组、对象、null、new Number(10)都是对象。他们都是引用类型。
判断一个变量是不是对象非常简单。值类型的类型判断用typeof,引用类型的类型判断用instanceof。
var fn = function() {};
console.log(fn instanceof Object); // true
在JavaScript中,对象是对象,数组也是对象,函数竟然也是对象!对象里面的一切都是属性,只有属性,没有方法。javascript中的对象可以任意的扩展属性,函数和数组怎么定义属性呢?
typeof $ // 返回 "function",在jquery中$是一个函数
$.trim(' 123 ') // trim就是$的一个属性,属性值是函数
一切(引用类型)都是对象,对象是属性的集合。
instanceof
instanceof
运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。
所有构造函数都继承自Object,而继承Object是自动完成的,不需要我们手动继承。
function fn() {
console.log('fn is a function');
}
fn.a = 1;
fn.b = {
name: 'test'
};
fn.c = function() {
console.log('c is an attribute of the function fn');
}
console.log(typeof fn); // function
fn.c(); // c is an attribute of the function fn
object instanceof constructor
object [要检测的对象] constructor [某个构造函数]
用来检测 constructor.prototype 是否存在于参数 object 的原型链上。
function C() {}
var c = new C();
console.log(c instanceof C); // true
C.prototype = {};
console.log(c instanceof C); // false,因为C.prototype指向了一个空对象,这个空对象不在o的原型链上
obj instanceof Foo
返回true,则并不意味着该表达式会永远返回true,因为Foo.prototype属性的值有可能会改变,改变之后的值很有可能不存在于obj的原型链上,这时原表达式的值就会成为false。
借助于非标准的__proto__
魔法属性,可以改变对象的原型。
判断一个变量是否为数组
导言:
toString()——每个对象都有一个toString()方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString()方法被每个Object对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 “[object type]”,其中type是对象的类型。
判断一个变量是否为数组的通用方法:
var ary = [1, 3, 4, 45];
function isArray(array) {
return Object.prototype.toString.call(array) == '[object Array]';
}
isArray(ary); // true
注意:Array属于引用型数据,在传递过程中,仅仅是引用地址的传递。
console.log(ary.__proto__.constructor == Array); // true.该方法有一定的弊端