为什么面试官要我写 instanceof
发布时间:2025-05-23 11:06:43 发布人:远客网络
一、为什么面试官要我写 instanceof
1、在前端面试中,instanceof是一个常见的问题。面试官通常会要求面试者手写 instanceof的实现,以测试他们对 JavaScript类型系统和原型链的理解。
2、在 JavaScript中数据分为基本类型和引用类型。
3、在实际工作中,我们常常需要判断一个变量的类型。对于基本类型(null除外)和 Function我们可以使用 typeof进行判断。对于引用类型我们则需要使用 instanceof进行判断。
4、MDN定义:instanceof是 JavaScript的一个二元操作符,用于测试构造函数的 prototype属性是否出现在对象的原型链中的任何位置。换句话说,instanceof可以用于判断一个对象是否由某个构造函数创建的。
5、在这个例子中,auto是 Car的一个实例,所以auto instanceof Car返回 true。
6、注意:左侧可以是任意类型,而右侧必须是一个函数的实例。参数错误时会报错。
7、每个对象都有一个__proto__属性。在对象创建的时候会将 __proto__属性指向它的构造函数的 prototype属性上。并且构造函数的 prototype属性本身也是一个对象。它也有自己的 __proto__属性。通过 __proto__-> prototype这样串联形成一个链条,这个链条就是原型链。原型链的终点是 Object,Object.prototype.__proto__的值为 null。
8、每个对象的构造函数都可以在原型链上找到,因此instanceof通过原型链可以判断对象是否由某个构造函数创建。
9、下面是一个简易的 instanceof实现:
10、当传入的参数是对象时,如果操作成功Reflect.getPrototypeOf(target)返回对象的原型,如果操作失败(比如,目标不是对象)则返回 false。
11、本文介绍了 JavaScript类型判断的方法。对instanceof的概念、用法和实现进行了说明。
二、JavaScript中判断对象类型的几种方法总结_基础知识
我们知道,JavaScript中检测对象类型的运算符有:typeof、instanceof,还有对象的constructor属性:
1) typeof运算符 typeof是一元运算符,返回结果是一个说明运算数类型的字符串。如:"number","string","boolean","object","function","undefined"(可用于判断变量是否存在)。但 typeof的能力有限,其对于Date、RegExp类型返回的都是"object"。如:
所以它只在区别对象和原始类型的时候才有用。要区一种对象类型和另一种对象类型,必须使用其他的方法。如:instanceof运算符或对象的 constructor属。
2)instanceof运算符。 instanceof运算符要求其左边的运算数是一个对象,右边的运算数是对象类的名字或构造函数。如果 object是 class或构造函数的实例,则 instanceof运算符返回 true。如果 object不是指定类或函数的实例,或者 object为 null,则返回 false。如:
new Date instanceof Date;// true
所以,可以用instanceof运算符来判断对象是否为数组类型:
3)constructor属性。 JavaScript中,每个对象都有一个constructor属性,它引用了初始化该对象的构造函数,常用于判断未知对象的类型。如给定一个求知的值通过typeof运算符来判断它是原始的值还是对象。如果是对象,就可以使用constructor属性来判断其类型。所以判断数组的函数也可以这样写:
return typeof arr=="object"&& arr.constructor== Array;
很多情况下,我们可以使用instanceof运算符或对象的constructor属性来检测对象是否为数组。例如很多JavaScript框架就是使用这两种方法来判断对象是否为数组类型。但是检测在跨框架(cross-frame)页面中的数组时,会失败。原因就是在不同框架(iframe)中创建的数组不会相互共享其prototype属性。例如:
var iframe_arr=new window.frames[0].Array;
alert(iframe_arr instanceof Array);// false
alert(iframe_arr.constructor== Array);// false
在Ajaxian上看到了一种精确的检测方法,跨原型链调用toString()方法:Object.prototype.toString()。可以解决上面的跨框架问题。当Object.prototype.toString(o)执行后,会执行以下步骤: 1)获取对象o的class属性。 2)连接字符串:"[object"+结果(1)+"]" 3)返回结果(2)例如:
Object.prototype.toString.call([]);//返回"[object Array]"
Object.prototype.toString.call(/reg/ig);//返回"[object RegExp]"
这样,我们就可以写一个健壮的判断对象是否为数组的函数:
return Object.prototype.toString.call(arr)==="[object Array]";
此种方法得到国外多个javaScript大师的认可,在即将发布的jQuery 1.3中将使用这种方法来检测数组。 prototype.js的一个维护者写了下面这个函数,用于获取对象的类型名
* Returns internal [[Class]] property of an object
* When the toString method is called, the following steps are taken:
* 1. Get the [[Class]] property of this object.
* 2. Compute a string value by concatenating the three strings"[object", Result(1), and"]".
* __getClass(/foo/);//=>"RegExp"
* __getClass(true);//=>"Boolean"
* __getClass(undefined);//=>"Window"
* __getClass(Element);//=>"Constructor"
return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1];
扩展一下,用于检测各种对象类型:
types: ["Array","Boolean","Date","Number","Object","RegExp","String","Window","HTMLDocument"]
for(var i= 0, c; c= is.types[i++ ];){
return Object.prototype.toString.call(obj)=="[object"+ type+"]";
alert(is.Date(new Date));// true
alert(is.RegExp(/reg/ig));// true
三、javascript中如何判断类型汇总
1、我们在写封装的插件或者函数时,常常用到JS的数据类型判断,典型的案例就是深度拷贝函数用到数据类型判断,这个知识点在面试的时候也是经常考到的一个问题。本文就来给大家总结了下javascript中判断类型的相关资料,下面话不多说了,来一起看看详细的介绍吧
2、一个字符串始终是一个字符串,所以这一块是很容易。除非使用new(new String)调用,否则typeof将返回“object”。所以也要包含那些可以使用的字符串instanceof。
3、// Returns if a value is a string
4、 return typeof value==='string'|| value instanceof String;
5、From typeof more things than just an ordinary number will return"number" like NaN and Infinity. To know if a value really is a number the function isFinite is also required.
6、从类型更多的东西,而不仅仅是普通的数字将返回像NaN和无限的“数字”。要知道值是否真的是数字,函数isFinite也是必需的。
7、// Returns if a value is really a number
8、 return typeof value==='number'&& isFinite(value);
9、在javascript数组中不是像java和其他语言中那样的真正数组。它们实际上是对象,因此typeof将为它们返回“对象”。要知道某些东西是否真的是一个数组,它的构造函数可以与Array进行比较。
10、// Returns if a value is an array
11、 return value&& typeof value==='object'&& value.constructor=== Array;
12、// ES5 actually has a method for this(ie9+)
13、// Returns if a value is a function
14、 return typeof value==='function';
15、很多东西都是javascript中的对象。要知道值是否是可以具有属性并循环的对象,可以将其构造函数与Object进行比较。它不适用于从类创建的对象,因此可以使用instanceof运算符。
16、// Returns if a value is an object
17、 return value&& typeof value==='object'&& value.constructor=== Object;
18、大多数情况下,您不需要显式检查null和undefined,因为它们都是假值。然而,要做到这一点,下面的功能就可以了。
19、// Returns if a value is undefined
20、 return typeof value==='undefined';
21、对于布尔值, typeof就足够了,因为它返回true和false的“boolean”。
22、// Returns if a value is a boolean
23、 return typeof value==='boolean';
24、RegExp是对象,因此唯一需要检查的是构造函数是否为RegExp。
25、// Returns if a value is a regexp
26、 return value&& typeof value==='object'&& value.constructor=== RegExp;
27、javascript中的错误与许多其他编程语言中的“异常”相同。它们有几种不同的形式,例如Error,TypeError和RangeError。一个instanceof语句对他们来说已经足够了,但我们还要确保我们还检查错误所具有的“message”属性。
28、// Returns if value is an error object
29、 return value instanceof Error&& typeof value.message!=='undefined';
30、日期实际上不是javascript中的数据类型。但要知道是否有某个Date对象,可以使用instanceof进行检查。
31、// Returns if value is a date object
32、 return value instanceof Date;
33、 return typeof value==='symbol';