Embedded JavaScript is case sensitive and uses ASCII as its character set. White space between tokens is ignored with the exception that statements that omit trailing semicolons must be on a line by themselves.
Comments can use either the C commenting style with text between /* */ delimiters, or the C++ style may be used where text from // to the end of the line is regarded as a comment.
Identifiers are names used for variables and functions. Identifiers must begin with either a letter, and underscore '_' or a dollar sign. Identifiers must not use equal any reserved word from the table below:
Reserved Words
Embedded JavaScript regards all these words as reserved.
delete
|
else
|
false
|
for
|
function
|
if
|
in
|
new
|
null
|
return
|
this
|
true
|
var
|
|
|
|
Embedded JavaScript also regards these words as reserved. They are not yet implemented, but users should avoid them for future compatibility.
break
|
case
|
catch
|
continue
|
default
|
do
|
finally
|
instanceof
|
switch
|
throw
|
try
|
typeof
|
void
|
while
|
with
|
|
It is also recommended that you do not use any of the following words. ECMA may implement them in future standards
abstract
|
boolean
|
byte
|
char
|
class
|
const
|
debugger
|
double
|
enum
|
export
|
extends
|
final
|
float
|
goto
|
implements
|
import
|
int
|
interface
|
long
|
native
|
package
|
private
|
protected
|
public
|
short
|
static
|
super
|
synchronized
|
throws
|
transient
|
volatile
|
|
Primitive Data Types
Variables are declared either by the
var keyword or by simply assigning a value to a new variable name. In JavaScript is is not essential to declare variables before using them. However, it is considered good practice to do so.
JavaScript does not have explicit type declarations. They are not given an explicit type when declared. The underling type of a variable is determined by the type of the data stored in the variable. For example:
var x;
x = "Hello World";
This will cause the variable
x to store the string "Hello World". Embedded JavaScript will store this as the primitive String data type. If this variable is assigned an integer, the underlying type will be changed. For example:
x = 55;
The
x variable will not hold an integer primitive type with a value of 55. If
x is used in expressions, its value will be copied and converted to other types as required.
Embedded JavaScript supports the following primitive data types. These types can be combined in objects to create arbitrary structured data types.
- Boolean
- Floating Point
- Integer
- 64-bit Integer
- Strings
JavaScript will automatically convert variables from one type to another as required by the current expression.
Numeric Type
The ECMA standard specifies that JavaScript numerics are stored and manipulated as floating point entities. For embedded uses, this is often less than ideal. Consequently, EJS allows the default numeric type to be selected at build time. Binary releases typically select 32-bit integer as the default numeric type. Note that floating point can still be used and expressions can still be explicitly converted to floating point by multiplying by 1.0.
Boolean Type
A boolean value can be either true or false. Assigning either true or false to a variable or the result of a conditional expression will set the type of a variable to boolean. The following example will set x to true.
var y = 1;
var x = (y == 1);
EJS defines the global variables
true and
false with the appropriate boolean values.
Integer Type
The default numeric type for is a 32-bit integer and integer literals are 32-bit integers. Integer literals may be specified as octal values by prefixing with a '0' or hexadecimal by prefixing with 0x or 0X.
64-bit integers are also supported if the EJS is built with the default numeric type set to be 64-bit integers.
Floating Point Type
Floating point numbers are stored as C doubles. Floating point literals may be specified simply by using a decimal point in the literal. For example:
var pi = 3.14;
Floating point literals can also use an exponential notation of the form: floating number followed by 'e' or 'E', followed by an optional sign '+' or '-', followed by an integer exponent. I.e.
[digits] [.digits] [E|e] [(+|-)digits]
For example:
var pi = 3.14e1;
var pi = 314.0e-2;
Embedded JavaScript also defines two useful floating point constants. The global variable
NaN is set to the "not a number" value. This value is the result when a math operation gives an undefined value or error. For example, divide by zero will result in the NaN value.
The other constant is
Infinity. If a floating point operation overflows the largest possible floating number, the result is equal to the Infinity value.
String Type
JavaScript strings are immutable sequences of ASCII letters or escaped literals. They are primitive types and are not treated as objects. This means that they are always passed by value and not by reference. String literals may be enclosed in either single or double quotes.
JavaScript strings are easy to work with due to the inbuilt ability to append strings via the "+" operator. For example:
var str = "Happy Birthday " + name;
EJS supports the following escaped letters inside string literals:
Escape Sequence
|
Description
|
\b
|
Backspace (0x8)
|
\f
|
Form feed (0xc)
|
\n
|
New line (0xa)
|
\r
|
Carriage return (0xd)
|
\t
|
Horizontal tab (0x9)
|
\v
|
Vertical tab (0xb)
|
\uNNNN
|
Unicode character (0xNNNN)
|
\xNN
|
Hexadecimal characgter (0xNN)
|
\NNN
|
Octal character (ONNN)
|
\'
|
Literal single quote
|
\"
|
Literal double quote
|
\\
|
Literal backslash
|
Functions
A JavaScript function is a JavaScript that can be executed by name with supplied arguments. Functions are declared via the
function keyword followed by optional arguments and a function body contained within braces. For example:
function myPoint(x, y)
{
return x + y;
}
Functions can use a
return statement to return an arbitrary value value. This may be a primitive type or it may be a reference to an object.
To invoke a function, the function name is used with the () operator following. The actual arguments are supplied within the "()" . The arguments to the function are evaluated left to right. For example:
var x = myPoint(1, y + 7);
Functions may also be assigned to properties of objects to create methods.
Scope and the Function Call Object
When functions are invoked, EJS creates a new set of local variables for use by the function. EJS also creates several objects to describe the function call.
The function call arguments are passed in as named parameters and they are also stored in the
arguments[] array. The arguments array allows functions to be written to take a variable number of arguments. For example:
function max()
{
biggest = 0;
for (i = 0; i < arguments.length; i++) {
if (arguments[i] > biggest) {
biggest = arguments[i];
}
}
}
EJS also defines a
callee object property in the arguments object. The callee property has a length property member that stores the expected number of arguments by the function. For example:
function myFunc(x, y)
{
if (arguments.callee.length != 2) {
// Error
}
}
NOTE: JavaScript and EJS do not validate the number of arguments supplied to a function at run-time.
Embedded JavaScript does not implement a few capabilities from the ECMA specification relating to functions. These include nested functions, the prototype property and the apply and call methods.
Variables
Variable Scope
JavaScript defines two scopes for variables: global and local. Global variables are shared among functions that execute in a single JavaScript program. Local variables are created for each function and are destroyed on function exit. Objects are created on an object heap and references to the objects may be stored in either the global or local variable stores.
As described earlier, JavaScript variables may be optionally declared via the
var statement. When used inside a function, the variable is created in the local variable store. If used outside any function, the variable is created in the global store.
If a variable is assigned to without a prior var statement, then the variable is always created on the global store.
Undefined and Null
If a variable is declared but not assigned, its value is said to be undefined. For example:
var x;
This declares a variable x, but does not assign it a value. All such unassigned variables are set to the
undefined value. Variables can be tested for equality with undefined. For example:
if (x == undefined) {
// X does not yet have a value
}
Do not confuse undefined with
null. The null value implies that a variables does not point to a valid object. You can assign null to a variable to disconnect the variable from pointing to an object.
Type Conversions
JavaScript will usually handle type conversions for you automatically. Adding a numeric to a string will cause the number to be converted to a string and appended to the left hand side string. Adding an integer to a floating point will cause the integer to be converted to a floating point prior to the arithmetic.
If you want to explicitly force a type conversion, use the following
Initial Type
|
Target Type
|
Action
|
Example
|
Integer
|
String
|
Add a string on the right
|
num + "";
|
String
|
Integer
|
Add a numeric on the right
|
1 + string;
|
Integer
|
Floating Point
|
Mulitply by 1.0
|
num * 1.0
|
Object
|
String
|
Invoke the toString method
|
o.toString()
|
Type Conversion Rules
Embedded JavaScript observes the following type conversion rules:
- If the left operand is a string, the right hand operand will be converted to a string. If both operands are numeric, a numeric operation is done.
- If either operand is an object, it is converted to a string.
- If both operands are boolean and the operation is ==, !=, then proceed without a type conversion.
- If one operand is a string and the other is a numeric, try to convert the string to a number. Otherwise, try to convert the numeric to a string.
- If both are numeric, but not of equal types. Give priority to floating point, then 64-bit integer, then integer, then boolean.