Quelles "fonctionnalités cachées" de JavaScript pensez-vous que chaque programmeur devrait connaître?
Après avoir vu l'excellente qualité des réponses aux questions suivantes, j'ai pensé qu'il était temps de lui demander JavaScript.
- Fonctionnalités cachées de HTML
- Fonctionnalités cachées de CSS
- Fonctionnalités cachées de PHP
- Fonctionnalités cachées d'ASP.NET
- Fonctions cachées de C #
- Fonctions cachées de Java
- Fonctionnalités cachées de Python
Même si JavaScript est sans doute le langage côté client le plus important en ce moment (il suffit de demander à Google), il est surprenant de constater à quel point la plupart des développeurs Web apprécient sa puissance.
javascript
hidden-features
Binoj Antony
la source
la source
Réponses:
Vous n'avez pas besoin de définir de paramètres pour une fonction. Vous pouvez simplement utiliser l'
arguments
objet de type tableau de la fonction .la source
arguments
objet rend l'appel d'une fonction beaucoup plus lent, par exemple. if (faux) arguments; nuira à la perf.arguments.callee
est déprécié.Je pourrais citer la plupart de l'excellent livre JavaScript de Douglas Crockford : The Good Parts .
Mais je n'en prend qu'un pour vous, utilisez toujours
===
et!==
au lieu de==
et!=
==
n'est pas transitif. Si vous l'utilisez,===
cela donnerait false pour toutes ces déclarations comme prévu.la source
==
est'\n\t\r ' == 0
=>true
...: DLes fonctions sont des citoyens de première classe en JavaScript:
Des techniques de programmation fonctionnelles peuvent être utilisées pour écrire du javascript élégant .
En particulier, les fonctions peuvent être passées en tant que paramètres, par exemple Array.filter () accepte un rappel:
Vous pouvez également déclarer une fonction "privée" qui n'existe que dans le cadre d'une fonction spécifique:
la source
new Function()
est aussi mauvais queeval
. Ne pas utiliser.Vous pouvez utiliser l' opérateur in pour vérifier si une clé existe dans un objet:
Si vous trouvez les objets littéraux trop laids, vous pouvez les combiner avec la fonction sans paramètre:
la source
Affectation de valeurs par défaut aux variables
Vous pouvez utiliser le logique ou l'opérateur
||
dans une expression d'affectation pour fournir une valeur par défaut:La
a
variable récupérera la valeurc
que sib
est falsy (si estnull
,false
,undefined
,0
,empty string
ouNaN
), sinona
va obtenir la valeur deb
.Ceci est souvent utile dans les fonctions, lorsque vous souhaitez donner une valeur par défaut à un argument au cas où il ne serait pas fourni:
Exemple de repli IE dans les gestionnaires d'événements:
Les fonctionnalités de langage suivantes sont avec nous depuis longtemps, toutes les implémentations JavaScript les prennent en charge, mais elles ne faisaient pas partie de la spécification jusqu'à ECMAScript 5e édition :
La
debugger
déclarationDécrit dans: § 12.15 La déclaration du débogueur
Cette instruction vous permet de placer des points d'arrêt par programmation dans votre code simplement en:
Si un débogueur est présent ou actif, il provoquera sa rupture immédiatement, directement sur cette ligne.
Sinon, si le débogueur n'est pas présent ou actif, cette instruction n'a aucun effet observable.
Littéraux de chaînes multilignes
Décrit dans: § 7.8.4 Littéraux de chaîne
Vous devez être prudent parce que le caractère à côté de la
\
doit être une terminaison de ligne, si vous avez un espace après le\
par exemple, le code regarder exactement la même chose, mais il soulèvera unSyntaxError
.la source
JavaScript n'a pas de portée de bloc (mais il a une fermeture alors appelons-le même?).
la source
Vous pouvez accéder aux propriétés des objets avec
[]
au lieu de.
Cela vous permet de rechercher une propriété correspondant à une variable.
Vous pouvez également l'utiliser pour obtenir / définir des propriétés d'objet dont le nom n'est pas un identifiant légal.
Certaines personnes ne le savent pas et finissent par utiliser eval () comme ceci, ce qui est une très mauvaise idée :
C'est plus difficile à lire, plus difficile à trouver des erreurs dans (ne peut pas utiliser jslint), plus lent à exécuter et peut conduire à des exploits XSS.
la source
foo.bar
, selon la spécification de toute façon, se comporte commefoo["bar"]
. notez également que tout est une propriété de chaîne. même lorsque vous faites un accès au tableauarray[4]
, le 4 est converti en chaîne (encore une fois, au moins selon les spécifications ECMAScript v3)Si vous cherchez sur Google une référence JavaScript décente sur un sujet donné, incluez le mot clé "mdc" dans votre requête et vos premiers résultats proviendront du Mozilla Developer Center. Je n'ai pas de références ou de livres hors ligne avec moi. J'utilise toujours le mot-clé "mdc" pour accéder directement à ce que je recherche. Par exemple:
Google: javascript array sort mdc
(dans la plupart des cas, vous pouvez omettre "javascript")
Mise à jour: Mozilla Developer Center a été renommé Mozilla Developer Network . L'astuce de mot clé "mdc" fonctionne toujours, mais bientôt nous devrons peut-être commencer à utiliser "mdn" à la place .
la source
Peut-être un peu évident pour certains ...
Installez Firebug et utilisez console.log ("bonjour"). Tellement mieux que d'utiliser random alert (); c'est ce dont je me souviens avoir fait beaucoup il y a quelques années.
la source
Méthodes privées
Un objet peut avoir des méthodes privées.
la source
Également mentionné dans "Javascript: The Good Parts" de Crockford:
parseInt()
est dangereux. Si vous lui passez une chaîne sans l'informer de la base appropriée, il peut retourner des nombres inattendus. Par exemple,parseInt('010')
renvoie 8, pas 10. Passer une base à parseInt le fait fonctionner correctement:la source
Math.floor
ouNumber
?10 === Math.floor("010"); 10 === Number("010");
flotte:42 === Math.floor("42.69"); 42.69 === Number("42.69");
parseInt
fonction inoffensive pourrait facilement être faite pour faire quelque chose de moins inoffensif.__parseInt = parseInt; parseInt = function (str, base) { if (!base) throw new Error(69, "All your base belong to us"); return __parseInt(str, base); }
Les fonctions sont des objets et peuvent donc avoir des propriétés.
la source
Je devrais dire des fonctions auto-exécutables.
Parce que Javascript n'a pas de portée de bloc , vous pouvez utiliser une fonction auto-exécutable si vous souhaitez définir des variables locales:
Ici,
myvar
is n'interfère pas avec la portée globale et ne la pollue pas, et disparaît lorsque la fonction se termine.la source
.js
fichiers dans une fonction auto-exécutable anonyme et attache tout ce que je veux globalement accessible à l'window
objet. Empêche la pollution globale des espaces de noms.Savoir combien de paramètres sont attendus par une fonction
Savoir combien de paramètres sont reçus par la fonction
la source
function.length
.Voici quelques choses intéressantes:
NaN
avec quoi que ce soit (mêmeNaN
) est toujours faux, cela inclut==
,<
et>
.NaN
Signifie Pas un nombre mais si vous demandez le type, il retourne en fait un nombre.Array.sort
peut prendre une fonction de comparaison et est appelé par un pilote de type quicksort (dépend de l'implémentation).$0
,$1
, les$2
membres sur une expression régulière.null
ne ressemble à rien d'autre. Ce n'est ni un objet, ni un booléen, ni un nombre, ni une chaîne, niundefined
. C'est un peu comme un "suppléant"undefined
. (Note:typeof null == "object"
)this
renvoie l'objet [Global] autrement innommable.var
, au lieu de simplement se fier à la déclaration automatique de la variable, donne au runtime une réelle chance d'optimiser l'accès à cette variablewith
construction détruira de telles optimisationsbreak
. Les boucles peuvent être étiquetées et utilisées comme cible decontinue
.undefined
. (dépend de la mise en œuvre)if (new Boolean(false)) {...}
exécutera le{...}
bloc[mis à jour un peu en réponse à de bons commentaires; veuillez voir les commentaires]
la source
typeof null
renvoie "objet".undefined
, mais c'est juste la valeur par défaut que vous obtenez lorsque vous recherchez un index qui n'existe pas. Si vous avez coché un [2000], ce serait également le casundefined
, mais cela ne signifie pas que vous lui avez encore alloué de la mémoire. Dans IE8, certains tableaux sont denses et certains sont clairsemés, selon la façon dont le moteur JScript se sentait à l'époque. En savoir plus ici: blogs.msdn.com/jscript/archive/2008/04/08/…Je sais que je suis en retard à la fête, mais je n'arrive pas à croire que l'
+
utilité de l' opérateur n'ait pas été mentionnée au-delà de "convertir quoi que ce soit en nombre". C'est peut-être à quel point une fonctionnalité est bien cachée?Bien sûr, vous pouvez faire tout cela à la
Number()
place, mais l'+
opérateur est tellement plus joli!Vous pouvez également définir une valeur de retour numérique pour un objet en remplaçant la
valueOf()
méthode du prototype . Toute conversion de nombre effectuée sur cet objet n'entraînera pasNaN
, mais la valeur de retour de lavalueOf()
méthode:la source
0xFF
etc., pas besoin+"0xFF"
.0xFF
, de la même manière que vous pouvez écrire1
au lieu de+true
. Je suggère que vous pouvez utiliser+("0x"+somevar)
comme alternative àparseInt(somevar, 16)
, si vous le souhaitez." Méthodes d'extension en JavaScript " via la propriété prototype.
Cela ajoutera une
contains
méthode à tous lesArray
objets. Vous pouvez appeler cette méthode en utilisant cette syntaxela source
Pour supprimer correctement une propriété d'un objet, vous devez supprimer la propriété au lieu de simplement la définir sur undefined :
La propriété prop2 fera toujours partie de l'itération. Si vous voulez vous débarrasser complètement de prop2 , vous devriez plutôt faire:
La propriété prop2 n'apparaîtra plus lorsque vous parcourez les propriétés.
la source
with
.Il est rarement utilisé, et franchement, rarement utile ... Mais, dans des circonstances limitées, il a ses utilisations.
Par exemple: les littéraux d'objet sont très pratiques pour configurer rapidement les propriétés d'un nouvel objet. Mais que faire si vous devez modifier la moitié des propriétés d'un objet existant?
Alan tempête souligne que cela peut être un peu dangereux: si l'objet utilisé comme contexte ne possède l' une des propriétés étant affecté à, il sera résolu dans le cadre extérieur, créant peut - être ou une variable globale d' écraser. Cela est particulièrement dangereux si vous avez l'habitude d'écrire du code pour travailler avec des objets dont les propriétés avec des valeurs par défaut ou vides ne sont pas définies:
Par conséquent, c'est probablement une bonne idée d'éviter d'utiliser l'
with
instruction pour une telle affectation.Voir aussi: Y a-t-il des utilisations légitimes pour la déclaration «with» de JavaScript?
la source
Les méthodes (ou fonctions) peuvent être appelées sur des objets qui ne sont pas du type avec lequel ils ont été conçus. C'est génial d'appeler des méthodes natives (rapides) sur des objets personnalisés.
Ce code se bloque car
listNodes
n'est pas unArray
Ce code fonctionne car
listNodes
définit suffisamment de propriétés de type tableau (longueur, opérateur []) pour être utilisées parsort()
.la source
L'héritage prototypique (popularisé par Douglas Crockford) révolutionne complètement votre façon de penser à beaucoup de choses en Javascript.
C'est un tueur! Dommage que presque personne ne l'utilise.
Il vous permet de «générer» de nouvelles instances de n'importe quel objet, de les étendre, tout en conservant un lien d'héritage prototypique (en direct) vers leurs autres propriétés. Exemple:
la source
Certains appelleraient cela une question de goût, mais:
L'opérateur trinaire peut être enchaîné pour agir comme Scheme (cond ...):
peut s'écrire comme ...
C'est très "fonctionnel", car il branche votre code sans effets secondaires. Donc au lieu de:
Tu peux écrire:
Fonctionne bien avec la récursivité aussi :)
la source
Les nombres sont aussi des objets. Vous pouvez donc faire des trucs sympas comme:
la source
times
n'est pas efficace:Math.floor
est appelée à chaque fois au lieu d'une seule fois.Que diriez-vous des fermetures en JavaScript (similaires aux méthodes anonymes dans C # v2.0 +). Vous pouvez créer une fonction qui crée une fonction ou une "expression".
Exemple de fermetures :
la source
Vous pouvez également étendre (hériter) des classes et remplacer les propriétés / méthodes à l'aide de la chaîne de prototype cuillère16 mentionnée.
Dans l'exemple suivant, nous créons une classe Pet et définissons certaines propriétés. Nous substituons également la méthode .toString () héritée d'Object.
Après cela, nous créons une classe Dog qui étend Pet et remplace la méthode .toString () en modifiant à nouveau son comportement (polymorphisme). De plus, nous ajoutons d'autres propriétés à la classe enfant.
Après cela, nous vérifions la chaîne d'héritage pour montrer que Dog est toujours de type Dog, de type Pet et de type Object.
Les deux réponses à cette question étaient des codes modifiés à partir d'un excellent article MSDN par Ray Djajadinata.
la source
Vous pouvez intercepter des exceptions en fonction de leur type. Cité de MDC :
REMARQUE: les clauses de capture conditionnelle sont une extension Netscape (et donc Mozilla / Firefox) qui ne fait pas partie de la spécification ECMAScript et ne peut donc pas être invoquée sauf sur des navigateurs particuliers.
la source
Du haut de ma tête...
Les fonctions
arguments.callee se réfère à la fonction qui héberge la variable "arguments", elle peut donc être utilisée pour recésurer des fonctions anonymes:
C'est utile si vous voulez faire quelque chose comme ça:
Objets
Une chose intéressante à propos des membres d'objet: ils peuvent avoir n'importe quelle chaîne comme nom:
Cordes
String.split peut prendre des expressions régulières comme paramètres:
String.replace peut prendre une expression régulière comme paramètre de recherche et une fonction comme paramètre de remplacement:
la source
arguments.callee
est obsolète et lancera une exception dans ECMAScript 5.Vous pouvez utiliser des objets au lieu de commutateurs la plupart du temps.
Mise à jour: si vous craignez que les cas évalués à l'avance soient inefficaces (pourquoi vous inquiétez-vous de l'efficacité si tôt dans la conception du programme ??), vous pouvez faire quelque chose comme ceci:
C'est plus onéreux à taper (ou à lire) qu'un commutateur ou un objet, mais cela préserve les avantages de l'utilisation d'un objet au lieu d'un commutateur, détaillés dans la section commentaires ci-dessous. Ce style rend également plus simple de transformer cela en une «classe» appropriée une fois qu'il a suffisamment grandi.
update2: avec les extensions de syntaxe proposées pour ES.next, cela devient
la source
var arr = []; typeof arr; // object
Veillez à utiliser la méthode hasOwnProperty lors de l'itération à travers les propriétés d'un objet:
Ceci est fait pour que vous n'accédiez qu'aux propriétés directes d'un objet , et que vous n'utilisiez pas les propriétés situées en bas de la chaîne de prototype.
la source
Variables privées avec une interface publique
Il utilise une petite astuce avec une définition de fonction auto-appelante. Tout ce qui est retourné à l'intérieur de l'objet est disponible dans l'interface publique, tandis que tout le reste est privé.
la source