VBScript & Javascript
de verschillen

Op deze pagina staat een overzicht van de belangrijkste verschillen tussen VBScript en Javascript, vooral gericht op webdevelopment en het gebruik van SQL server.

Ik heb deze verzameling aangelegd tijdens het maken van (web)pagina's met scripts, omdat ik de syntaxen van deze talen nog wel eens doorelkaar haal. Aangezien ik op het web niet een website vond die dit naar mijn smaak op een overzichtelijke en complete wijze presenteert, heb ik zelf een lijstje opgesteld die ik tijdens mijn werk raadpleeg (en aanvul).
Stuur je opmerkingen of aanvullingen naar e-mail.

Legenda kleurcoderingen:

  • toelichtende tekst is opgesteld in de 'normale' standaard opmaak en kleur.
  • syntax definities van een onderdeel hebben een geaccentueerde achtergrondkleur.
  • voorbeelden ter verduidelijking hebben een zwart font, zoals hier.
  • links zijn gestippeld onderstreept. |TBD|
  • aanvullende toelichting in een popup tekstbox als je met je je muis er over heen haalt.
  • Inhoudsopgave (met snelkoppelingen) ::: nog in bewerking:::
    Case sensitive Regelovergang: afsluiten Regelovergang: doorlopen Declararatie: algemeen
    Declararatie: algemeen ...
    Database Koppelingen ...
    tip: door te dubbelklikken keer je vanuit elke positie weer terug naar de top van de pagina


    Onderdeel VBScript Javascript
    Case-sensitive Nee (of nee of NeE) Ja, Ja en nog eens Ja
    Regel afsluiten geen (gewoon [Enter]) 'zie ook regel doorlopen' ;
    Regel laten doorlopen _ (underscore) en [Enter] geen (gewoon [Enter])
    Declaratie Declareren én toekennen kan niet tegelijk!
    Dim x, y
    Dim z
    z = 10
    noot: bij voorkeur "Option Explicit" gebruiken (evt. na ontwikkeling uitcommentariëren
    var variable1 [ = value1 ] [, variable2 [ = value2], ...];
    var V;
    var W = "string";
    var Z = 10, X, Y = 0;
    var X = Y = Z = 10;


    Namen voor variabelen moeten voldoen aan de volgende regels:
  • Eerste karakter: [a-z, A-Z, _]
  • Volgende karakters: [a-z, A-Z, 0-9, _]
  • De naam mag geen reserved word in Javascript zijn

  • (let op hoofdletter gebruik!)
    Declaratie constanten Const X = 10
    Const Y = 20, Z = 99
    geen Constanten type.
    Declaratie objecten Set <objnaam> = [<objexpressie> | New <classname> | Nothing]
    <objectexpressie> = CreateObject(applnaam.typenaam [, serverlocatie])
    <objectexpressie> = GetObject([path naar file die object omvat] [, class])

    Dim objX, oFs, oFs2, oDrv
    Set oFs = CreateObject("Scripting.FileSystemObject")
    Set oDrv = oFs.GetDrive(fso.GetDriveName(drvPath))
    [...programmacode...]
    Set objFs = Nothing 'aan einde ojectvar weer vrijgeven


    In een asp pagina, moet je een speciek serverobject instantiëren:
    Set oFs2 = Server.CreateObject("Scripting.FileSystemObject") 'in asp pagina.
    var <objnaam> = new [Objecttype]([data type])
    [Objecttype], Er zijn 11 'built-in' objecttypen:
    Array, Boolean, Date, Function, Global, Math, Number, Object, RegExp, Error en String.

    var objObj = new Object(); // Creëert generiek object zonder properties.
    var oDate = new Date(<evt datum>); // Creëert Date object.


    Kunt ook eigen objecten definiëren, met constructor, bijv:
    function Auto (deuren, kleur) {
     this.aantaldeuren = deuren;
     this.lakkleur = kleur;
    }
    var oAuto   = new Auto(3,"rood");
    Data typen Eén Data Type: Variant (en meerdere Subtypes).
    Dit type kan alle soorten gegevens omvatten, waarbij het type veelal wordt gedefinieerd door de situatie.
    (onder constructie)
    primaire: String, Number & Boolean.
    samengestelde: Array & Object.
    specials: Null (toekenning zonder type) & Undefined (return value als variabele gedeclareerd, maar zonder waarde).
    Dialoog box
    Twee functies:
  • MsgBox()
  • InputBox()

  • [ReturnValue=] MsgBox(tekst[, knoppen][, titel dialoogbox][, helpfile, context])
    intX = MsgBox("Is dit duidelijk?", 3, "Vraagje")  (meer details)

    [ReturnValue=] InputBox(prompt[, title][, default][, xpos][, ypos][, helpfile, context])
    strX = InputBox("Geef je input")
    Drie window object methods:
  • alert
  • confirm
  • prompt


  • alert("paperlepap")
    blnX = confirm("Is dit duidelijk?")
    strX = prompt("Geef je input", <default waarde>)
    Functies: # Definitie twee typen: function & procedure (procedure heeft geen return waarde)

    function <functienaam>[(argu,menten)]
     <statements>
    [Exit Function]
    <functienaam> = <expressie>
    End Function

    Sub <procedurenaam>[(argu,menten)]
     <statements>
    [Exit Sub]
     <statements>
    End Sub
    één type: function

    function <functienaam>([argu,menten]) {
     <statements>;
    return <expressie>;
    }
    Functies: # Aanroep twee manieren (met of zonder Call):
    strX = <functienaam> [argu,menten]
    strX = Call <functienaam>[(argu,menten)]

    <procedurenaam> [argu,menten]
    Call <functienaam>[(argu,menten)]

    n.b. een procedure-aanroep kan niet onderdeel zijn van een expressie.
    <functienaam>([argu,menten])
    Array's Dim <arraynaam>
    Dim <arraynaam>() {dyn. array, lengte 0}
    Dim <arraynaam>(2) {stat. array, lengte 3}
    <arraynaam>(2) = 99 {toewijzen waarde}

    herdimensioneren:
    Redim <arraynaam>(3) {herdimensioneren}
    Redim preserve <arraynaam>(3) {idem, data behouden}

    Dim <arraynaam>(2,3) {stat. 2-dim.array, lengte 2x3}
    Redim <arraynaam>(2,4} {kunt alleen laatste dimensie herdim.}

    x = <arraynaam>(2) {toekennen waarde in arraypositie 2}
    x = <arraynaam>(2,3) {idem , positie 2,3}
    var <arraynaam> = new Array(0) {lengte 0}
    var <arraynaam> = new Array(2) {lengte 3}
    var <arraynaam> = new Array(1,"twee") of [1,"twee"] {direct waarden toekennen}

    herdimensioneren:
    var <arraynaam> = new Array(1) {en ...}
    <arraynaam>[2] = 99 {uitbreiden tot lengte 3}

    var <arraynaam> = new Array(2,3) {2-dim array 2x3}

    x = <arraynaam>[2]
    x = <arraynaam>[2][3]
    Array als argument in functie-aanroep <functienaam>(<arraynaam>())
    MijnFunctie(mijnarray())
    <functienaam>(<arraynaam>[])
    MijnFunctie(mijnarray[])
    Commentaar
    (binnen een script)
    ' {enkel quootje}
    <script language=vbscript> <!--
      <statements>
      ' hier zet ik wat commentaar.
      <statements>
    --> </script>
    // {dubbel forwardslash}
    <script language=javascript> <!--
      <statements>
      // hier zet ik wat commentaar.
      <statements>
    //--> </script>
    Strings en quotes Stringkarakter: " (noot: een enkele quote (') is commentaar!)
    Escapen met een extra dubbele quote ("): "".
    Voorbeelden:
  • strS = "Een quootje ("") in een string"

  • en in server-side code: |tbd|>
  • Response.Write("<SCR" & "IPT language=""JavaScript""><!--" & vbCr)
  • Stringkarakter: ' of " (enkele quote heeft voorkeur)
    Escapen met een backslash (\): \' (of gebruik een dubbele quote " ipv enkele).
    Voorbeelden:
  • strS = 'Een quootje (\') in een string'
  • strS = 'Een quootje(") in een string' // geen escape nodig
  • strS = 'Een backslash (\\) in een string'

  • en in geval van het gebruik van dubbele quotes:
  • strS = "Een quootje(') in een string" geen escape nodig
  • strS = "Een quootje (\") in een string"
  • en in server-side code:|tbd|
  • tbd
  • String concatenatie &
    resultaat = expressie1 & expressie2

    noot: resultaat is een string als een van beide expressies een string is.

    voorbeelden (Str is identiek):
  • Str = "agent 00" & "7"
  • Str = "agent 00" & 7
  • Str = Str & "7"
  • +
    resultaat = expressie1 + expressie2

    noot: resultaat is een string als een van beide expressies een string is.

    voorbeeld:
  • Str = "agent 00" + "7"
  • Str = "agent 00" + 7
  • Str += "7"
  • Control Flow:
  • If .. Then
  • If <condition> Then
      <statements>
    [Else
      <else statements>]
    End If

    If <condition> Then
      [statements]
    [ElseIf <condition> Then
        <elseif statements>]
      [Else
        <else statements>]
    End If



    'single-line syntax':
    If <condition> Then <statement1> [: <statement n>]

    noot: haakjes rond condities zijn niet verplicht, maar wel aan te raden.
    if (<condition>) {
      <statements;>}
    [else {
      <statements;>}]

    if (<condition>)  <statement;>
    else  <statement;>?

    if (<condition>) {
      <statements;>}
    [else {
      if (<condition>) {
        <statements;>}
      }]


    'single-line syntax':
    if (<condition>) <statement>;[<statements>;]

    alternatief: <conditie> ? <statement1> : <statement2>
    strS=(now.getHours()>18) ? "avond" : "dag";
    noot: zie ook item 'condities'
    Control Flow:
  • For loop
  • For <counter> = <start> To <end> [Step <step>]
      [statements]
      [Exit For]
      [statements]
    Next


    voorbeeld (tabel maken met teller info):
    document.write("<table><tr>")
    Teller = 0
    For X = 1 To 10
      Teller = Teller + X
      document.write("<td>" & Teller & "</td>")
    Next
    document.write("</tr>"</table>)
    for (<init statement1> [,<statements>]; <test>; <increment>) {
      [statements]
      [break]
      [statements]
    }


    voorbeeld (tabel maken met teller info):
    document.write('<table><tr>');
    for (teller=1, x=1; x<=10; x++) {
      teller = teller + x;
      document.write('<td>' + teller + '</td>');
    }
    document.write('</tr></table>');

    noot: ook increment sectie mag uit meerdere delen bestaan, bijv. "i++,n++".
    Control Flow:
  • Case
  • Select Case (expressie)
      Case <waarde1> [statements]
      Case <waarde2> [statements]
      Case Else [statements]
    End Select
    switch (expressie) {
      case <waarde1>: [statements;] [break;]
      case <waarde2>: [statements;] [break;]
      default: [statements;]
    }
    Operatoren:
  • Logical NOT
  • Less than
  • Greater than
  • Less than or equal
  • Greater than or equal
  • Equality
  • Inequality
  • Logical AND
  • Logical OR
  • Strict Equality
  • Strict Inequality
  • Object equal.
  • X <operator> Y
  • Not X
  • X < Y
  • X > Y
  • X <= Y
  • X >= Y
  • X = Y
  • X <> Y
  • X And Y
  • X Or Y
  • -
  • -
  • objX Is objY
  • X <operator> Y
  • ! X
  • X < Y
  • X > Y
  • X <= Y
  • X >= Y
  • X == Y
  • X != Y
  • X && Y
  • X || Y
  • X === Y
  • X !== Y
  • -
  • Error Handling
  • On Error Resume Next (OERN), activeren errorhandling, daarbij gaat uitvoer verder met het statement na het statetment dat de run-time error veroorzaakt (moet wel opnieuw in een routine worden gebruikt).
  • On Error GoTo 0, deactiveren van de errorhandling.
  • Err object, bevat de run-time error info (Err.Number, Err.Description), Err object info wordt gereset na OERN.

  •   - Err.Raise<nr> (generate a run-time error).
      - Err.Clear (reset Err object info).
    Geen specifieke error-handling, maar wel zelf fout-afhandeling te creëren:

    Alternatieven zijn:
  • window.onerror(xxx) event:

  •   - xxx=null, onderdrukt alle foutmeldingen.
        vb1: <img src=”corrupt.gif” onError=”null”>
        vb2: <script>window.onerror=null</script>
      - xxx=functienaam, welke na een run-time
        error wordt aangeroepen, ondersteunt de
        argumenten tekst, betreffende url en
        betreffende regelnummer.
        vb3: <script>
          window.onerror=myErrFunction
          function myErrFunction(msg, url, line) {…}
          </script>

  • try…catch statement:
        try {
          tryStatements }
        catch(exception) {
          catchStatements }
        finally {
          finallyStatements }
  • Code koppelen aan events Verschillende manieren:

    <SCRIPT language="VBScript" event="OnClick" for="Button1">
      […] 'geen expliciete sub of function nodig
    </SCRIPT>

    <SCRIPT language="VBScript">
      Sub <buttonname>_<event>
      […]
    End Sub
    </SCRIPT>

    <’Tag' … onclick="Procedurenaam(); return false;" language="vbscript">
    <SCRIPT language="VBScript">
      Sub Procedurenaam()
      […]
      End Sub
    </SCRIPT>

    <’Tag’ … onclick=’instructie1: instructie2’ language="vbscript">






    <’Tag' … onclick="Procedurenaam(); return false;" language="jscript">







    <’Tag’ … onclick="instructie1; instructie2" language="javascript">
    A S P   &   S Q L   D a t a b a s e   A c c e s s
    SQL Queries worden hier nader toegelicht.
    Onderdeel VBScript Javascript
    Connection object Dim conn, connstring
    connstring = <odbc/oledb connectionstring>
  • connstring = Application("DbConnString")
  • connstring = "provider=sqloledb; server=<servername>; database=<dbname>; uid=<username>; pwd=********" (zonder spaties).

  • Set conn = Server.CreateObject("ADODB.Connection")
    conn.Open connstring
    [...code..]
    conn.Close
    set conn = Nothing
    var conn = new ActiveXObject('ADODB.Connection');
    var connstring = <odbc/oledb connectionstring>
  • connstring = Application.Contents?('DbConnString')
  • connstring = 'provider=sqloledb; server=<servername>; database=<dbname>; uid=<username>; pwd=********' (zonder spaties).

  • conn.ConnectionString = connstring;
    conn.Open();  (of direct conn.Open(connstring) )
    [...code...;]
    conn.Close();
    {opruimen conn}
    Uitvoeren van SQL Queries met het Connection Object (voor 'eenmalige' queries) <!- METADATA NAME="Microsoft ActiveX Data Objects 2.5 Library" Type="..." -->
    Dim conn, connstring, strQuery [, results, artiest, titel]
    Set conn = Server.CreateObject("ADODB.Connection")
    connstring = Application("DbConnString")
    conn.Open connstring
    strQuery = "SELECT ..."
    [results =] conn.Execute strQuery,,adCmdText + adExecuteNoRecords
    [artiest  = results("artiest");]
    [titel  = results("titel");]
    var conn = new ActiveXObject('ADODB.Connection');
    var connstring = Application.Contents('DbConnString');
    conn.Open(strConnectionString);
    var strQuery  = "SELECT ...";
    [var results = ] conn.Execute strQuery;
    {# nog uitzoeken Execute optieparameters)
    [var artiest  = results('artiest');]
    [var titel  = reults('titel');]
    Uitvoeren van SQL Queries met het Connection Object én RecordSet Dim conn, rs, connstring, strQuery
    connstring = Application("DbConnString")
    strQuery = "SELECT artiest, titel FROM Artiesten WHERE ..."

    Vervolgens 2 mogelijkheden (waarbij de eerste impliciet het connection object gebruikt):
  • Set rs   = Server.CreateObject("ADODB.Recordset")
        rs.Open strQuery, conn
  • Set conn = Server.CreateObject("ADODB.Connection")
        conn.Open connstring
        Set rs = conn.Execute(strQuery)


  • While Not rs.EOF
      Response.Write(rs("Artiest") & " - " & rs("Titel"))
      rs.MoveNext
    Wend

    If rs.RecordCount >= 5 Then {.....} rs.Close
    Set rs = Nothing
    conn.Close
    Set conn = Nothing


    De Open method van rs ondersteunt een optionele cursor parameter. Hiermee kun je door de Rs navigeren. Door het toevoegen van de parameter adOpenKeyset kun je nog ruimer door de Rs navigeren. Daarnaast kun je de property RecordCount gebruiken.
    var conn = new ActiveXObject('ADODB.Connection');
    var connstring = Application.Contents('DbConnString');
    conn.Open(connstring);
    var strQuery = "SELECT ...";

    for( var rs = conn.Execute(strQuery); !rs.EOF; rs.moveNext() )
      Response.Write(rs('Artiest').Value + " - " + rs('Titel').Value)

    rs.Close()
    rs = Nothing
    conn.Close()
    conn = Nothing
    Uitvoeren van SQL Queries met het >Command Object Met het Command Object kun je, analoog aan het uitvoeren van queries met het Connection en Recordset object, queries uitvoeren op de database. Echter, met het Command object kun je een query klaarzetten en precompilen op de database en daarna deze meerdere malen aanroepen met verschillende data.

    Dim conn, rs, connstring, strQuery
    connstring = Application("DbConnString")
    strQuery = "INSERT INTO (artiest, titel) VALUES (?) ??
    Set conn = Server.CreateObject("ADODB.Connection")
    conn.Open connstring
    Set cmn = Server.CreateObject("ADODB.Command")
    Set cmn.ActiveConnection = cnn

    cmn.CommandText = strQuery
    cmn.Prepared = True

    cmn.Parameters.Append cmn.CreateParameter("artiest",varchar,,255)
    cmn.Parameters.Append cmn.CreateParameter("titel",varchar,,1024)

    cmn("artiest") = "U2"
    cmn("titel") = "Boomerang II"
    cmn.Execute ,,adCmdText + adExecuteNoRecords

    cmn("artiest") = "U2"
    cmn("titel") = "Pride"
    cmn.Execute ,,adCmdText + adExecuteNoRecords
    TBD
    Beheersen van Database verbindingen Timing Out
    Set conn = Server.CreateObject("ADODB.Connection")
    conn.ConnectionTimeout = <seconden>

    De default waarde is 30 seconden.

    Pooling Connections
    by default, SQL Server past Connection Pooling toe als de CPTimeout op 60 seoconden wordt gezet.