您当前的位置:首页 > 互联网教程

为什么面试官要我写 instanceof

发布时间:2025-05-23 11:06:43    发布人:远客网络

为什么面试官要我写 instanceof

一、为什么面试官要我写 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';