ECMAScript Typekonvertering

En af de vigtigste egenskaber ved alle programmeringssprog er evnen til at udføre typekonverteringer.

ECMAScript tilbyder udviklere et stort antal enkle typekonverteringsmetoder.

De fleste typer har metoder til at udføre enkle konverteringer, og der er også nogle globale metoder, der kan bruges til mere komplekse konverteringer. Uanset hvilken situation som helst, er typekonvertering i ECMAScript en kort en-mands operation.

Konverter til streng

Det interessante ved ECMAScript's primitivværdier, Boolean-værdier, tal og strenger, er, at de er pseudoobjekter, hvilket betyder, at de faktisk har egenskaber og metoder.

For eksempel kan du få længden af en streng ved at bruge følgende kode:

var sColor = "red";
alert(sColor.length); // udskriver "3"

Selvom "red" er en primitiv strengtype, har den stadig en egenskab length, der opbevarer størrelsen af strengen.

Sammenfattende har de tre vigtigste primitive typer, Boolean-værdier, tal og strenger, en toString() metode, som kan konvertere deres værdier til strenge.

Påmindelse:Måske vil du spørge, 'Har strengene også en toString() metode, er det ikke overflødig?' Ja, det er sandt, men ECMAScript definerer, at alle objekter har en toString() metode, uanset om det er en pseudoobjekt eller et rigtigt objekt. Da String-typen er en pseudoobjekt, har den selvfølgelig en toString() metode.

Boolean 类型的 toString() 方法只是输出 "true" 或 "false",结果由变量的值决定:

var bFound = false;
alert(bFound.toString());	//输出 "false"

Number 类型的 toString() 方法比较特殊,它有两种模式,即默认模式基数模式。采用默认模式,toString() 方法只是用相应的字符串输出数字值(无论是整数、浮点数还是科学计数法),如下所示:

var iNum1 = 10;
var iNum2 = 10.0;
alert(iNum1.toString());	//输出 "10"
alert(iNum2.toString());	//输出 "10"

Kommentar:在默认模式中,无论最初采用什么表示法声明数字,Number 类型的 toString() 方法返回的都是数字的十进制表示。因此,以八进制或十六进制字面量形式声明的数字输出的都是十进制形式的。

使用 Number 类型的 toString() 方法的基数模式,可以用不同的基数输出数字,例如二进制的基数是 2,八进制的基数是 8,十六进制的基数是 16。

基数这只是要将数字转换成基数的另一种加法,它是 toString() 方法的参数:

var iNum = 10;
alert(iNum.toString(2));	//输出 "1010"
alert(iNum.toString(8));	//输出 "12"
alert(iNum.toString(16));	//输出 "A"

在前面的示例中,数字 10 以三种不同的形式输出,即二进制形式、八进制形式和十六进制形式。HTML 使用十六进制表示每种颜色,在 HTML 中处理数字时这种功能非常有用。

Kommentar:对数字调用 toString(10) 与调用 toString() 相同,它们返回的都是该数字的十进制形式。

参阅:

Se JavaScript reference manual有关 toString() 方法的详细信息提供如下:

Konverter til tal

ECMAScript tilbyder to metoder til at konvertere ikke-numeriske primitivværdier til tal, nemlig parseInt() og parseFloat().

Som man måske forventer, konverterer den første værdien til et heltal, mens den anden konverterer værdien til en brøkdel. Kun ved at kalde disse metoder på String-typer fungerer de korrekt; for andre typer returnerer de alle NaN.

parseInt()

Begge parseInt() og parseFloat() analyserer strengen nøje, før de afgør om den er et talværdi.

parseInt() metoden kigger først på tegnet ved position 0, og afgør om det er et gyldigt tal; hvis ikke, returnerer metoden NaN og fortsætter ikke med yderligere handlinger. Hvis tegnet er et gyldigt tal, kigger metoden på tegnet ved position 1, og udfører samme test. Denne proces fortsætter indtil en ugyldig tegn findes, og parseInt() konverterer strengen op til denne tegn til et tal.

For eksempel, hvis man skal konvertere strengen "12345red" til et heltal, vil parseInt() returnere 12345, fordi når den når til tegnet r, stopper den med at kontrollere.

Numeriske litterals i strengen konverteres korrekt til tal, f.eks. "0xA" konverteres korrekt til tallet 10. Dog konverteres strengen "22.5" til 22, fordi decimalt tegn er en ugyldig tegn for heltal.

Nogle eksempler herpå:

var iNum1 = parseInt("12345red");	//returner 12345
var iNum1 = parseInt("0xA");	//returner 10
var iNum1 = parseInt("56.9");	//returner 56
var iNum1 = parseInt("red");	//returner NaN

parseInt() metoden har også en base-metode, som kan konvertere binære, oktale, sekstale, eller andre enheder af målesystemet til heltal. Basen specificeres af den anden parameter til parseInt() metoden, så for at解析 sekstale værdier, skal man kalde parseInt() metoden som følger:

var iNum1 = parseInt("AF", 16);	//returner 175

Selvfølgelig kan man kalde parseInt() metoden på denne måde for binære, oktal, og endda decimale (standardtilstand):

var iNum1 = parseInt("10", 2);	//returner 2
var iNum2 = parseInt("10", 8);	//returnerer 8
var iNum3 = parseInt("10", 10);	//returnerer 10

Hvis tallet indeholder præfiks 0, er det bedre at bruge base 10, så man ikke får en fejlvisning med en oktalværdi. For eksempel:

var iNum1 = parseInt("010");	//returnerer 8
var iNum2 = parseInt("010", 8);	//returnerer 8
var iNum3 = parseInt("010", 10);	//returnerer 10

I denne kode parser de to linjer strengen "010" som et tal. Den første linje betragter strengen som en oktalværdi, og parser den på samme måde som den anden linje (erklæret med base 8). Den sidste linje erklærer basen som 10, så iNum3 ender med at være 10.

Se

Se JavaScript reference manualFølgende er detaljerede oplysninger om parseInt() metoden:parseInt().

parseFloat()

parseFloat() metoden håndterer på samme måde som parseInt() metoden, ved at se på hver karakter fra position 0, indtil den finder den første ugyldige karakter, og konverterer derefter strengen før denne karakter til et heltal.

Imidlertid er den første optrædende decimalpunkt en gyldig karakter for denne metode. Hvis der er to decimalpunkter, betragtes den anden som ugyldig. parseFloat() konverterer de karakterer, der kommer før decimalpunktet, til tal. Dette betyder, at strengen "11.22.33" vil blive fortolket som 11.22.

En anden forskel ved at bruge parseFloat() metoden er, at strengen skal være repræsenteret som decimalform af brøkkommatal, ikke i oktal eller hexadecimal. Denne metode ignorerer præfiks 0, så oktal-tallet 0102 vil blive fortolket som 102. For det hexadecimalt tal 0xA vil metoden returnere NaN, fordi x ikke er en gyldig karakter i brøkkommata.)Kommentar:Test viser, at den specifikke implementering af browseren returnerer 0 i stedet for NaN).

Desuden har parseFloat() metoden ingen base mode.

Her er nogle eksempler på brug af parseFloat() metoden:

var fNum1 = parseFloat("12345red");	//返回 12345
var fNum2 = parseFloat("0xA");	//返回 NaN
var fNum3 = parseFloat("11.2");	//返回 11.2
var fNum4 = parseFloat("11.22.33");	//返回 11.22
var fNum5 = parseFloat("0102"); //returnerer 102
var fNum1 = parseFloat("red"); //returnerer NaN

Prøv det selv

Se

Se JavaScript reference manualFølgende detaljer om parseFloat() metoden:parseFloat().

tvungen typekonvertering

Man kan også brugeTvungen typekonvertering (type casting)for at håndtere typen af konverteringsværdien. Ved hjælp af tvungen typekonvertering kan man få adgang til specifikke værdier, selvom de er af en anden type.

Forfatterens bemærkning:Cast har betydningen "forgyngelse", hvilket passer godt til betydningen af "tvungen konvertering".

Følgende 3 tvungne typekonverteringer er tilgængelige i ECMAScript:

  • Boolean(value) - konverter den givne værdi til en Boolean-type;
  • Number(value) - konverter den givne værdi til et tal (kan være et heltal eller et brøktaal);
  • String(value) - konverter den givne værdi til en streng;

Ved at konvertere værdien med én af disse funktioner oprettes en ny værdi, der gemmer værdien direkte konverteret fra den oprindelige værdi. Dette kan føre til uventede konsekvenser.

Boolean() funktionen

Når værdien, der skal konverteres, er en streng med mindst én karakter, et ikke-zero tal eller et objekt, vil Boolean() funktionen returnere true. Hvis værdien er en tom streng, tal 0, undefined eller null, vil den returnere false.

Man kan teste tvungen typekonvertering af Boolean-type med følgende kode:

var b1 = Boolean(""); //false - tom streng
var b2 = Boolean("hello"); //true - ikke-tom streng
var b1 = Boolean(50); //true - ikke-nul tal
var b1 = Boolean(null); //false - null
var b1 = Boolean(0); //false - nul
var b1 = Boolean(new object()); //true - objekt

Number() funktionen

Number() funktionens tvungen typekonvertering er lignende til behandlingen af parseInt() og parseFloat() metoder, men den konverterer hele værdien, ikke kun en del af værdien.

Husker du, at parseInt() og parseFloat() metoder kun konverterer den første ugyldige tegn i en streng, så "1.2.3" vil blive konverteret til henholdsvis "1" og "1.2".

Brug af Number() til tvungen typekonvertering vil returnere NaN for "1.2.3", fordi den hele strengværdi kan ikke konverteres til et tal. Hvis strengværdien kan konverteres fuldt ud, vil Number() afgøre, om det skal kalde parseInt() eller parseFloat() metoden.

Følgende tabel beskriver, hvad der sker, når Number() metoden kaldes for forskellige værdier:

Brug Resultat
Number(false) 0
Number(true) 1
Number(undefined) NaN
Number(null) 0
Number("1.2") 1.2
Number("12") 12
Number("1.2.3") NaN
Number(new object()) NaN
Number(50) 50

String() funktion

Den sidste metode til tvungen typekonvertering, String(), er den enkleste, fordi den kan konvertere enhver værdi til en streng.

For at udføre denne tvungne typekonvertering skal du kun kalde toString() metoden for værdien, der passes som parameter, dvs. konverter 12 til "12", konverter true til "true", konverter false til "false", osv.

Den eneste forskel mellem tvungen typekonvertering til streng og kald af toString() metoden er, at tvungen typekonvertering af null og undefined værdier kan generere en streng uden at udløse en fejl:

var s1 = String(null);	// "null"
var oNull = null;
var s2 = oNull.toString();	// vil udløse en fejl

Det er meget nyttigt at tvinge typen i sprog som ECMAScript, der er svage typer, men det skal sikres, at værdien er korrekt.