2016-01-19 3 views
0

Comme d'autres questions et réponses l'ont déjà noté, Google et Douglas Crockford considèrent tous deux que les objets d'emballage JS sont de mauvais style et ne devraient pas être utilisés.Si les objets de l'encapsuleur JS sont considérés comme de mauvais style, la vérification de type avec lodash _.isString etc. est-elle également considérée comme un mauvais style?

Si tel est le cas, l'utilisation de lodash _.isString, qui fonctionne pour les chaînes primitives et les chaînes d'objets, devrait-elle être considérée comme un mauvais style?

Il me semble que certaines fonctions de lodash telles que celles-ci sont conçues principalement pour être utilisées pour la programmation fonctionnelle, par ex. _.filter(myArray, _.isString), mais si l'on suit les meilleures pratiques d'utilisation uniquement des chaînes primitives, un simple contrôle typeof suffirait pour l'implémentation.

Mais le code lodash pour _.isString fait beaucoup plus que cela:

/** 
    * Checks if `value` is classified as a `String` primitive or object. 
    * 
    * @static 
    * @memberOf _ 
    * @category Lang 
    * @param {*} value The value to check. 
    * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. 
    * @example 
    * 
    * _.isString('abc'); 
    * // => true 
    * 
    * _.isString(1); 
    * // => false 
    */ 
    function isString(value) { 
     return typeof value == 'string' || 
     (!isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag); 
    } 

Quelle a été la motivation pour cela? Les utilisateurs qui utilisent des wrappers d'objets se plaignent que les méthodes lodash ne fonctionnent pas sur eux?

+3

Je pense que vous pouvez avoir de nombreux malentendus ce que les gens entendent par « objets wrapper ». '" bonjour "' est une chaîne littérale mais 'new String (" bonjour ")' est dans un objet wrapper. Il n'y a aucune raison d'utiliser des objets wrapper comme ça. –

+0

sans/avant "use strict", de nombreuses méthodes fonctionnelles comme '[] .map()' coercent des primitives de chaîne dans des objets lorsqu'elles sont passées comme 'this', ex:' [1] .map (function (a) {return this} , "bonjour") [0] '. c'est sans utiliser explicitement les wrappers d'objets, donc pour que l'util fonctionne dans cette situation, il doit gérer les objets. vous voyez aussi parfois des gens faire des choses comme 'x2 = new x.constructor (x);', qui donne le même résultat que l'exemple map() sur les chaînes. est une "chaîne" pas une "chaîne"? Je pense que ça devrait l'être. si vous n'avez pas besoin de cette capacité, alors comme vous le dites, '_.filter (r, a => typeof a ===" chaîne ")' est un peu plus rapide – dandavis

Répondre

0

Je ne pense pas que l'utilisation de méthodes de vérification de type underscore/lodash est une mauvaise pratique ou un mauvais style. Enfait, ils lisent assez bien et sont généralement moins sujettes aux erreurs programmeur.

La motivation pour le faire fonctionner pour les objets de chaîne aussi bien que les littéraux est qu'il doit juste simplement. Lodash est une librairie et devrait supporter ce qui existe en javascript.

En ce qui concerne la raison pour laquelle vous pouvez utiliser des objets chaîne à la place. Une raison pour laquelle je peux penser est que vous pouvez joindre des propriétés à la chaîne ex:

var a = new String('foo bar'); 
a.b = 'baz';