instanceof与typeof(写一个方法判断数据类型),prototype与_proto_

本文介绍了JavaScript中的类型检测方法,包括typeof操作符和instanceof运算符的使用,并详细解释了它们的区别及应用场景。此外,还探讨了原型链的概念,包括prototype与_proto_属性的作用及其在实现继承过程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

instanceof与typeof

typeof operand

operand 是一个表达式,表示对象或原始值,其类型将被返回

下表总结了 typeof 可能的返回值。有关类型和原语的更多信息,可查看 JavaScript数据结构 页面。

类型 结果
Undefined "undefined"
Null "object" (见下方)
Boolean "boolean"
Number "number"
String "string"
Symbol (ECMAScript 6 新增) "symbol"
宿主对象(由JS环境提供) Implementation-dependent
函数对象 ( [[Call]] 在ECMA-262条款中实现了) "function"
任何其他对象 "object"


object instanceof constructor

instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上


instanceof 运算符 判断的对象一般有:Array Function Object 等引用类型的实例对象

 

// 定义构造函数
function C(){} 
function D(){} 

var o = new C();

// true,因为 Object.getPrototypeOf(o) === C.prototype
o instanceof C; 

// false,因为 D.prototype不在o的原型链上
o instanceof D; 

o instanceof Object; // true,因为Object.prototype.isPrototypeOf(o)返回true
C.prototype instanceof Object // true,同上

C.prototype = {};
var o2 = new C();

o2 instanceof C; // true

o instanceof C; // false,C.prototype指向了一个空对象,这个空对象不在o的原型链上.

D.prototype = new C(); // 继承
var o3 = new D();
o3 instanceof D; // true
o3 instanceof C; // true

需要注意的是,如果表达式 obj instanceof Foo 返回true,则并不意味着该表达式会永远返回true,因为Foo.prototype属性的值有可能会改变,改变之后的值很有可能不存在于obj的原型链上,这时原表达式的值就会成为false。另外一种情况下,原表达式的值也会改变,就是改变对象obj的原型链的情况,虽然在目前的ES规范中,我们只能读取对象的原型而不能改变它,但借助于非标准的__proto__魔法属性是可以实现的。比如执行obj.__proto__ = {}之后obj instanceof Foo就会返回false了。

写一个方法判断数据类型:

<script>
function judType(vars){
if(vars===null)  return 'null'; 
else if(typeof vars!='object')   return typeof vars;
else{
if(vars instanceof Array){
return 'Array';
}
if(vars instanceof Function){
return 'Function';
}
else if(vars instanceof Object)return 'object';
    }
}
var a=1;
var b="22";
var c=true;
var d;
var e=null;
var g={a:a};
var h=[1,2,3];
var i=function(){};

console.log(judType(a));
console.log(judType(b));
console.log(judType(c));
console.log(judType(d));
console.log(judType(e));
console.log(judType(g));
console.log(judType(h));
console.log(judType(i));

console.log(null==undefined);//true
console.log(null===undefined);//false
</script>


prototype与_proto_

prototype 是原型,是Function对象才有的属性(如果你不信,你尽可尝试其他的数据类型,得到的绝对是undefined),原型主要是用来实现继承,从而用js 进行面向对象编程;
有以下代码:
	var person=function(){
				this.name="animal";
			};
	var p=new person();
	console.log(person.prototype);//object Object
	console.log(p.prototype);//undefined
因为构造函数的实例对象没有prototype,于是有_proto_

所有对象的_proto_都指向其构造函数的prototype,而构造函数的_proto_则都指向Function.prototype,一个空函数(Empty function)

有以下代码:

var person=function(){ this.name="animal"; }; var p=new person(); console.log(person.prototype);//object Objec console.log(person.__proto__);//function Empty() {} console.log(p.prototype);//undefined console.log(p.__proto__);//object Objec console.log(person.prototype==p.__proto__);//true //可见,实例指向函数实例对象的_proto_ 指向  函数的原型prototype;

var man=function (){} man.prototype=new person();//子类原型链继承父类 var littleman=new man(); console.log(littleman.name);//person console.log(man.prototype);//[object Object] console.log(man.__proto__);//function Empty() {} console.log(littleman.prototype);//undefined console.log(littleman.__proto__);//[object Object]
原型链作为实现继承的主要方法。其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。
在JavaScript中,用_ proto_  属性来表示一个对象的原型链。当查找一个对象的属性时,JavaScript 会向上遍历原型链,直到找到给定名称的属性为止!
原型链继承方法 参考博文:http://blog.youkuaiyun.com/prince_fmx/article/details/77619592
注意:prototype与_proto_是属性,typeof是操作符,instanceof是运算符


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值