Maison  >  Article  >  interface Web  >  Comment déterminer si une variable est un tableau dans ES6

Comment déterminer si une variable est un tableau dans ES6

青灯夜游
青灯夜游original
2022-03-08 16:50:223424parcourir

Dans es6, vous pouvez utiliser la méthode isArray() de Array pour déterminer si une variable est un tableau. Cette méthode est utilisée pour déterminer si un objet est de type tableau. La syntaxe est "Array.isArray(obj)" ; l'objet est un tableau, il renvoie vrai. Sinon, renvoie faux.

Comment déterminer si une variable est un tableau dans ES6

L'environnement d'exploitation de ce tutoriel : système Windows 7, ECMAScript version 6, ordinateur Dell G3.

Déterminer si une variable est un tableau dans ES5

Dans ES5, nous avons au moins les 5 façons suivantes pour déterminer si une valeur est un tableau :

var a = []; 
// 1.基于instanceof 
a instanceof Array; 
// 2.基于constructor 
a.constructor === Array; 
// 3.基于Object.prototype.isPrototypeOf 
Array.prototype.isPrototypeOf(a); 
// 4.基于getPrototypeOf 
Object.getPrototypeOf(a) === Array.prototype; 
// 5.基于Object.prototype.toString 
Object.prototype.toString.apply(a) === '[object Array]';

Ce qui précède, à l'exception de Object. prototype.toString À l'exception du code>, aucune autre méthode ne peut déterminer correctement le type de la variable. <code>Object.prototype.toString外,其它方法都不能正确判断变量的类型。

要知道,代码的运行环境十分复杂,一个变量可能使用浑身解数去迷惑它的创造者。且看

var a = {
    __proto__: Array.prototype
}; 
// 分别在控制台试运行以下代码 
// 1.基于instanceof 
a instanceof Array; // => true 
// 2.基于constructor 
a.constructor === Array; // => true 
// 3.基于Object.prototype.isPrototypeOf 
Array.prototype.isPrototypeOf(a); // => true 
// 4.基于getPrototypeOf 
Object.getPrototypeOf(a) === Array.prototype; // => true

以上,4种方法将全部返回true,为什么呢?我们只是手动指定了某个对象的__proto__属性为Array.prototype,便导致了该对象继承了Array对象,这种毫不负责任的继承方式,使得基于继承的判断方案瞬间土崩瓦解。

不仅如此,我们还知道,Array是堆数据,变量指向的只是它的引用地址,因此每个页面的Array对象引用的地址都是不一样的。iframe中声明的数组,它的构造函数是iframe中的Array对象。如果在iframe声明了一个数组x,将其赋值给父页面的变量y,那么在父页面使用y instanceof Array ,结果一定是false的。而最后一种返回的是字符串,不会存在引用问题。实际上,多页面或系统之间的交互只有字符串能够畅行无阻。

在ES6中判断变量是否为数组

鉴于数组的常用性,在ES6中新增了Array.isArray方法,使用此方法判断变量是否为数组,则非常简单,如下:

Array.isArray([]); // => true 
Array.isArray({0: &#39;a&#39;, length: 1}); // => false

实际上,通过Object.prototype.toString

Il faut savoir que l'environnement d'exécution du code est très complexe, et qu'une variable peut utiliser toutes sortes d'astuces pour confondre son créateur. Regardons ce qui précède

if (!Array.isArray){ 
    Array.isArray = function(arg){ 
        return Object.prototype.toString.call(arg) === &#39;[object Array]&#39;; 
    }; 
}
. Les 4 méthodes retourneront vrai. Pourquoi ? Nous venons de spécifier manuellement l'attribut __proto__ d'un objet comme Array.prototype, ce qui a fait hériter de l'objet Array. Cette méthode d'héritage irresponsable a provoqué l'effondrement instantané du système de jugement basé sur l'héritage. Non seulement cela, nous savons également qu'Array est constitué de données de tas et que la variable pointe uniquement vers son adresse de référence, donc l'adresse référencée par l'objet Array de chaque page est différente. Pour un tableau déclaré dans une iframe, son constructeur est l'objet Array dans l'iframe. Si un tableau x est déclaré dans l'iframe et affecté à la variable y de la page parent, alors y instanceof Array est utilisée sur la page parent et le résultat doit être faux. Le dernier renvoie une chaîne, il n'y a donc pas de problème de référence. En fait, les interactions entre plusieurs pages ou systèmes ne sont possibles qu'avec des chaînes.

🎜🎜Déterminer si une variable est un tableau dans ES6🎜🎜🎜🎜Compte tenu de l'utilisation courante des tableaux, la méthode Array.isArray est ajoutée dans ES6. Utiliser cette méthode pour déterminer si une variable est un tableau est très simple. , comme suit : 🎜rrreee 🎜En fait, utiliser Object.prototype.toString pour déterminer le type d'une valeur est également une norme pour les principales bibliothèques grand public. Par conséquent, le polyfill d'Array.isArray ressemble généralement à ceci : 🎜rrreee🎜[Recommandations associées : 🎜tutoriel vidéo javascript🎜, 🎜front-end web🎜]🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn