What is the difference between operator void* and operator()?

Forstå void-operatoren i JavaScript: En guide

15/07/2010

Rating: 4.7 (1712 votes)

JavaScript er et sprog fyldt med kraftfulde værktøjer og operatorer, hvoraf nogle er mere kendte end andre. En af de mindre kendte, men potentielt meget nyttige, er void-operatoren. Selvom den ved første øjekast kan virke obskur, giver den udviklere en unik måde at kontrollere returværdier på og håndtere specifikke scenarier, især inden for webudvikling. Denne artikel vil udforske void-operatoren i dybden, fra dens grundlæggende syntaks til dens praktiske anvendelser i både klassisk og moderne JavaScript.

How do you use a void operator?
Here's a simple example: In this case, the number 0 is the expression that the void operator evaluates. However, the result of this evaluation is not used or stored anywhere. Instead, the void operator simply returns undefined. The void operator can be used with any expression, not just numbers. For example, you can use it with a string:

Formålet med void-operatoren er enkelt: Den evaluerer et givet udtryk og returnerer derefter altid værdien undefined. Dette adskiller den markant fra de fleste andre operatorer, som typisk returnerer resultatet af en beregning eller sammenligning. Forståelse for, hvornår og hvordan man bruger void, kan hjælpe med at skrive mere robust og forudsigelig kode, især i forbindelse med HTML-attributter og asynkrone operationer.

Indholdsfortegnelse

Hvad er void-operatoren? En grundlæggende forklaring

Void-operatoren er en unær operator, hvilket betyder, at den arbejder på et enkelt operand (udtryk). Dens primære funktion er at udføre et udtryk, men kassere resultatet og i stedet returnere den primitive værdi undefined.

Syntaks

Syntaksen for void-operatoren er ligetil og kan skrives på to måder:

void (udtryk);

eller

void udtryk;

Begge former er funktionelt identiske. Brugen af parenteser kan dog forbedre læsbarheden, især når udtrykket er komplekst. For eksempel:

void(0); // Returnerer undefined
void 'hello'; // Returnerer undefined
void(2 + 2); // Evaluerer 2 + 2, men returnerer undefined

Det er vigtigt at forstå, at selvom operatoren kasserer udtrykkets resultat, bliver selve udtrykket stadig eksekveret. Hvis udtrykket har sideeffekter, vil disse stadig finde sted. For eksempel:

let x = 5;
void(x++); // x er nu 6, men udtrykket returnerer undefined

I dette eksempel bliver variablen x inkrementeret, selvom returværdien fra x++ (som ville være 5) ignoreres, og undefined returneres i stedet.

Praktiske Anvendelsesmuligheder for void

Selvom void-operatoren kan virke niche, har den flere vigtige og praktiske anvendelsesområder, som enhver JavaScript-udvikler bør kende til.

1. Forebyggelse af Navigation i Hyperlinks

Dette er den mest almindelige anvendelse af void-operatoren. Når en browser følger en javascript: URI i et <a>-tags href-attribut, evaluerer den koden og erstatter sidens indhold med den returnerede værdi. Hvis returværdien ikke er undefined, kan det føre til uønsket sideadfærd, som f.eks. at siden bliver blank og viser værdien.

What is void operator void PTR?
void operator delete(void *, void*) noexcept; void operator delete(void* ptr, const std::nothrow_t&) noexcept; The pointer whose value is to be rendered invalid by the deletion. The first function is called by a delete expression to render the value of ptr invalid.

Ved at bruge javascript:void(0); sikrer man, at udtrykket returnerer undefined, hvilket forhindrer browseren i at navigere væk fra den nuværende side.

<a href="javascript:void(0);" onclick="alert('Hej verden!');">Klik her</a>

I dette eksempel vil et klik på linket udløse onclick-eventet og vise en advarselsboks, men siden vil forblive uændret, fordi href-attributten evalueres til undefined. Dette er en robust metode til at skabe links, der udelukkende skal udføre JavaScript-kode uden at påvirke navigationen.

2. Bookmarklets

Et bookmarklet er et bogmærke, der indeholder JavaScript-kode i stedet for en URL. Når man klikker på det, udføres koden på den side, man befinder sig på. Void-operatoren bruges ofte i bookmarklets for at forhindre, at koden returnerer en værdi, der kunne overskrive den aktuelle side.

Eksempel på et bookmarklet, der ændrer baggrundsfarven på en side:

javascript:void(document.body.style.backgroundColor='lightblue');

Uden void kunne udtrykket potentielt returnere en streng (den nye farve), hvilket ville få browseren til at erstatte sidens indhold med denne streng.

3. Immediately Invoked Function Expressions (IIFE)

Før ES6 og introduktionen af block scope med let og const, var IIFEs en almindelig måde at skabe et privat scope på. For at en funktion kan blive fortolket som et udtryk (og ikke en funktionsdeklaration), skal den wrappes i parenteser eller have en unær operator foran sig. Void-operatoren kan bruges til dette formål.

void function() {
console.log('Denne funktion kører med det samme!');
}();

Dette tvinger JavaScript-fortolkeren til at behandle function som starten på et udtryk. Selvom det er mere almindeligt at se IIFEs wrappet i parenteser (function(){...})();, illustrerer dette en anden af voids semantiske anvendelser: at signalere, at funktionens returværdi er irrelevant og skal kasseres.

What is void operator in JavaScript?
This operator allows evaluating expressions that produce a value into places where an expression that evaluates to undefined is desired. The void operator is often used merely to obtain the undefined primitive value, usually using void(0) (which is equivalent to void 0). In these cases, the global variable undefined can be used.

Sammenligning med Andre Operatorer

For at forstå voids unikke natur er det nyttigt at sammenligne den med andre almindelige operatorer i JavaScript. De fleste operatorer er designet til at producere en meningsfuld værdi baseret på deres operander.

OperatorEksempelResultatBeskrivelse
Addition (+)5 + 38Returnerer summen af operanderne.
Tildeling (=)let x = 10;10Tildeler en værdi til en variabel og returnerer den tildelte værdi.
Streng lighed (===)'a' === 'b'falseReturnerer en boolean, der angiver, om operanderne er strengt lig med hinanden.
voidvoid(5 + 3)undefinedEvaluerer udtrykket (8), men kasserer resultatet og returnerer altid undefined.

Denne tabel viser tydeligt, hvordan void adskiller sig. Dens formål er ikke at beregne, men at kontrollere flowet ved at sikre en undefined returværdi.

Potentielle Faldgruber og Bedste Praksis

Selvom void-operatoren er nyttig, er der nogle ting, man skal være opmærksom på for at undgå forvirring og skrive ren kode.

  • Læsbarhed: For udviklere, der ikke er bekendt med void, kan koden virke forvirrende. Det er ofte en god idé at tilføje en kommentar, der forklarer formålet, især hvis det bruges i en usædvanlig kontekst.
  • Sparsommelig brug: Brug kun void, hvor det er nødvendigt. I mange moderne JavaScript-scenarier er der alternativer. For eksempel kan man i event handlers bruge event.preventDefault() i stedet for javascript:void(0); for at opnå en bedre adskillelse af HTML og JavaScript.
  • Sideeffekter: Vær opmærksom på, at udtrykket stadig evalueres. Undgå at bruge void til at skjule komplekse operationer med sideeffekter, da det kan gøre koden svær at debugge.

void i Moderne JavaScript (ES6 og frem)

Med introduktionen af arrow functions og promises har void-operatoren fundet nye, relevante anvendelser.

Arrow Functions

En arrow function med et enkelt udtryk uden krøllede parenteser ({}) returnerer implicit resultatet af udtrykket. Nogle gange ønsker man at udføre en funktion uden at returnere dens værdi. Her kan void være en elegant løsning.

const doSomething = () => 'resultat';
const myButton.onclick = () => void doSomething(); // Sikrer, at onclick ikke modtager en returværdi

Dette kan være nyttigt i frameworks eller biblioteker, hvor en uventet returværdi fra en event handler kan forårsage uønsket adfærd.

Are there new learning tips for beginners in Rainbow Six Siege?
We’ve also added new Learning Tips for beginners in the Learning Area to help new players ease more quickly into the Rainbow Six Siege experience. These tips will rotate automatically but players can scroll through the tips themselves as well.

Promises

På samme måde kan man i en promise-kæde ønske at udføre en handling uden at sende dens resultat videre til det næste .then()-kald.

Promise.resolve('data')
.then(result => {
console.log(result); // Logger 'data'
// Returnerer ikke noget specifikt
})
.then(nextResult => {
// nextResult er undefined
});

Dette kan skrives mere kompakt med void:

Promise.resolve('data')
.then(result => void console.log(result))
.then(nextResult => {
// nextResult er også undefined her
});

Dette gør det eksplicit, at returværdien fra console.log (som alligevel er undefined) bevidst ignoreres, og at kæden skal fortsætte med undefined.

Ofte Stillede Spørgsmål (FAQ)

Sp: Hvad er forskellen på `void(0)` og `undefined`?

Sv: Funktionelt returnerer begge undefined. Historisk set var der en vigtig forskel: i ældre versioner af JavaScript (før ECMAScript 5) var det muligt at overskrive den globale variabel undefined (f.eks. var undefined = true;). Dette kunne ødelægge kode, der stolede på værdien. void(0) var derimod en garanteret måde at få den primitive værdi undefined på. I moderne JavaScript er den globale undefined-variabel skrivebeskyttet, så forskellen er mindre kritisk. Dog er void(0) stadig udbredt i href-attributter af vane og for bagudkompatibilitet.

Sp: Er `void` det samme som `null`?

Sv: Nej. void er en operator, der returnerer undefined. undefined er en primitiv værdi, der typisk betyder, at en variabel ikke er blevet tildelt en værdi. null er også en primitiv værdi, men den repræsenterer den bevidste fravær af en objektværdi. De er forskellige typer og værdier.

Sp: Skal jeg bruge `void` i min daglige kodning?

Sv: Det afhænger af situationen. Til at forhindre navigation i links er javascript:void(0); en standardløsning. I andre tilfælde, som med arrow functions eller promises, kan det forbedre kodens klarhed ved eksplicit at vise, at en returværdi ignoreres. Det er dog et værktøj til specifikke formål og ikke noget, man typisk bruger i hver eneste funktion. Ofte er klarhed og læsbarhed vigtigere, og en mere verbose løsning kan være bedre.

Hvis du vil læse andre artikler, der ligner Forstå void-operatoren i JavaScript: En guide, kan du besøge kategorien Sundhed.

Go up