当前位置:必发365电子游戏 > 编程 > 但是为什么instanceof却判断不出来呢
但是为什么instanceof却判断不出来呢
2019-12-19

  后日写js际遇了贰个instanceof的坑,我们的页面中有一个iframe,笔者在index页面中计算得到了叁个array,然后必要传递到Flight页面

其风流倜傥嵌套的iframe中的一个函数(SearchFlight)中,作为防守性编制程序,作者供给在SearchFlight函数中进行参数检查实验,约等于推断过来的参数风度翩翩

bifa365,定是Array类型。

 

大器晚成:抛出难点

举例,下边有三个页面。

Index.html页面

 1 <!DOCTYPE html>
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4     <title></title>
 5 </head>
 6 <body>
 7 
 8     <iframe name="childframe" src="Flight.html"></iframe>
 9 
10     <script type="text/javascript">
11 
12         window.onload = function () {
13             //航班
14             var airplanes = ["MU", "CA", "CZ"];
15 
16             var result = window.frames[0].flight.SearchFlight(airplanes);
17         };
18     </script>
19 </body>
20 </html>

Flight.html页面

 1 <!DOCTYPE html>
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4     <title></title>
 5 </head>
 6 <body>
 7     <script type="text/javascript">
 8 
 9         var flight = (function () {
10 
11             return {
12                 SearchFlight: function (arr) {
13                     var result = arr instanceof Array;
14                     alert(result);
15                 }
16             };
17         })();
18     </script>
19 </body>
20 </html>

bifa365 1

很诧异的意识instanceof居然不能够决断出arr是多个数组,其实我们用肉眼能够看看,压根它就是三个数组,不过为何instanceof却一口咬定不出去呢?

我们通晓instancof其实是叁个js语法糖,笔者就修正成轻便点的,决断arr.constructor是还是不是指向Array,于是作者把关键字改成如下情势,再来看看看功用。

 1         var flight = (function () {
 2 
 3             return {
 4                 SearchFlight: function (arr) {
 5                     //var result = arr instanceof Array;
 6 
 7                     var result = arr.constructor == Array;
 8 
 9                     alert(result);
10                 }
11             };
12         })();

bifa365 2

从图上看,还真有一点点奇异,明明都是function Array(卡塔尔(قطر‎,为何都不可能等于呢?可是事实就摆在日前,容不得狡辩,只可以放平心态想生龙活虎想,大家

略知后生可畏二Array在js是归于援用类型,既然不对等那就注解他们实乃三个援引,对不对,何况Array是挂在window下的多个属性,window属性

也正是一个窗口的实例,这就印证Index.html是三个window实例,Flight.html也是三个window实例,为了验证下,大家看看三个window

是还是不是等于?

bifa365 3

看完图后,答案就很理解了,以C#的研讨构思一下,既然大的window都不等于,里面包车型客车Array属性自然就不对等,终于问题是找到了,下边

怎么解决呢?

 

二:解决难题

  1. length判断

 这么些相当的轻巧想到,也是最轻便易行的,我们理解各类数组都有length,所以能够简轻便单的看length是或不是留存就足以了,然则这么些亦非百不失一

的,大家领会function中有八个性子length和prototype,那这就反常了。那样自身会错误的把f以为是数组。

bifa365 4

 

2.使用prototype的call方法来促成

 那个办法有个别玄妙,首先大家要知道,每二个function中都会有call方法和prototype属性,而js在Object.prototype中的tostring函数上做了叁个

打包,正是调用tostring.call后,会重回[object constructorName]的字符串格式,这里的constructorName正是call参数的函数名,举例大家把

arr传进去,就能够回到“[但是为什么instanceof却判断不出来呢。object Array]”字符串格式,那么些办法也得以让大家五光十色的论断是不是是Array,不过正如可惜的是,我们看不到这几个call的内

部达成,只好黑盒的难忘了。

 bifa365 5

上一篇:没有了
下一篇:没有了