Maison > Article > interface Web > Sujet JavaScript 6 : Détection de type
JavaScriptSujet spécial sur la détection des types de données
Répertoire
Tutoriel vidéo javascript)
Avant-proposDans "Types de données JavaScript", nous Le problème de détection de type simple a également été évoquée.
En tant qu'étudiants front-end, nous devrions tous savoir que typeof et instanceof peuvent être utilisés pour déterminer le type de données JavaScript au moment de l'exécution. Alors, comment le déterminent-ils ? Un millier de personnes écriront-elles mille méthodes de jugement ?
Cet article explique comment déterminer le type de données, du type général de à l'instance spécifique à l'objet, en passant par isNull, isNumber, isString et d'autres méthodes ~
. 1. typeoftypeof :
Renvoie une chaîne indiquant le type de l'opérande non calculé. 操作符
Nous savons tous qu'avant ES6, JavaScript avait six types de données, à savoir :
typeof null => 'object'
typeof function(){} => 'function'
donc dans la plupart des cas, nous pouvons utiliser typeof pour détecter des données de base types, Cependant, après avoir détecté le
typeof [] === 'object'; //truetypeof {} === 'object'; //truetypeof null === 'object'; //true
Object
Résumé Lors de la détection du type d'origine de Js , à l'exception de
Sauf, tous les autres renvoient les lettres minuscules du nom du type correspondant. typeof null
object
Lorsque nous déterminons le type d'objet, nous pouvons utiliser instanceof :
Si vous n'êtes pas familier avec les prototypes et les chaînes de prototypes, vous souhaiterez peut-être jeter un œil à cet article Du prototype à la chaîne de prototypes
DéfinitionL'opérateur instanceof est utilisé pour détecter si l'attribut prototype du constructeur apparaît dans la chaîne de prototypes d'un objet d'instance supérieur.
Instanceconst arr = [];const obj = {};console.log(arr instanceof Array); // trueconsole.log(arr instanceof Object); // trueconsole.log(obj instanceof Array); // falseconsole.log(obj instanceof Object); // true
Notez que instanceof peut correspondre à la classe parent du type, donc arr instanceof Array et arr instanceof Object sont tous deux vrais, car Object est la classe parent de tableau.
Les objets qui satisfont la relation de classe parent-enfant de
peuvent être associés : class extends
原型链规则
class Base {}class Current extends Base {}const obj = new Current();console.log(obj instanceof Current); // trueconsole.log(obj instanceof Base); // true
function Foo() {}function Bar() {}Bar.prototype = new Foo();const obj = new Bar();console.log(obj instanceof Bar); // trueconsole.log(obj instanceof Foo); // true
Notez que si on modifie la chaîne de prototypes d'obj, le résultat de instanceof peut être changé :
function Other() {}obj.__proto__ = new Other();console.log(obj instanceof Other); // trueconsole.log(obj instanceof Foo); // false
En fait, instanceof utilise la chaîne de prototypes pour juger. Tant que le prototype d'un type
est sur la chaîne de prototypes d'un, alors Type
est vrai, sinon c'est le cas. FAUX. 对象obj
obj instanceof Type
Parfois, nous ne voulons pas faire correspondre le type parent, mais voulons seulement faire correspondre le type actuel, nous pouvons alors utiliser le constructeur pour juger :
Si vous n'êtes pas familier avec les prototypes et les chaînes de prototypes, vous souhaiterez peut-être lire cet article Du prototype à la chaîne de prototypes
définitionretours. la construction
qui crée la référence de fonction de l'objet d'instance. Notez que la valeur de cette propriété est une référence à la fonction elle-même, et non une chaîne contenant le nom de la fonction.Object
const arr = [];console.log(arr.constructor === Array); // trueconsole.log(arr.constructor === Object); // false
Le constructeur de l'objet renverra son type, et lorsque le type est défini, un attribut name en lecture seule sera créé avec la valeur étant le nom du type.
class Foo {}console.log(Foo.name); // Fooconst foo = new Foo();console.log(foo.constructor === Foo); // trueconsole.log(foo.constructor.name === 'Foo'); // true
Constructor.name est-il nécessairement correct ?
4.1 stringTag - balise de type
; Object.prototype.toString
stringTag
4.2 Object.prototype.toString
renvoie une représentation de la chaîne A de objets.
toString()
Chaque objet a une méthode
如果此方法在自定义对象中未被覆盖,toString() 返回 “[object type]”,其中 type 是对象的类型。以下代码说明了这一点:
实例
比如这是requirejs里面的代码片段。
var ostring = Object.prototype.toString;function isArray(it) { return ostring.call(it) === '[object Array]';}
toString时都做了什么?
这里直接将冴羽大大的总结搬了过来:
When the toString method is called, the following steps are taken:
- If the this value is undefined, return “[object Undefined]”.
- If the this value is null, return “[object Null]”.
- Let O be the result of calling ToObject passing the this value as the argument.
- Let class be the value of the [[Class]] internal property of O.
- Return the String value that is the result of concatenating the three Strings "[object ", class, and “]”.
当 toString 方法被调用的时候,下面的步骤会被执行:
注意
有几点我们需要注意:
对象
;五、实现几个数据检测的方法
好了看了几款常用的类型判断方法后,我们可不可以实现自己的类型判断工具?就利用上述提到的一个或多个方法。我们自己动手丰衣足食~
注意,我们认为null不是一个对象,它就是null~
function isObject(value) { const type = typeof value; return value != null && (type === 'object' || type === 'function');}
function isNull(value) { return value === null;}
function isFunction(value) { return typeof value === 'function';}
var isArray = Array.isArray || function( value ) { return type(value) === "array";}
const toString = Object.prototype.toString;function getTag(value) { // if (value === null) return '[object Null]'; // if (value == null) return '[object Undefined]' if (value == null) { return value === undefined ? '[object Undefined]' : '[object Null]' } return toString.call(value)}
好了到最后,大家平时对类型检测的态度是什么样的呢?
相关免费学习推荐:javascript(视频)
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!