A summary of JavaScript language basics (used to supplement the first few Module 2 lectures)
As an interpreted programming language, JS is great to interact with a line at a time (similar to Python, but very different than Java). Where do you start?
The easiest way to dive in is with the Chrome browser's Console tab in the same inspector tool you've used to inspect your HTML/CSS.
Until we learn functions to interact with the HTML DOM with JS, we recommend experimenting with the following code examples using this console to get comfortable with the fundamental syntax and behavior of the language.
console.log
Used to output values to the browser console, most often used to debug JS programs.
You can think of this as System.out.println
in Java or print
in Python.
console.log("message");
console.log("The answer is: " + 42);
alert
Functionalert("message");
alert("Your browser says hi!");
A JS function that pops up a dialog box with a message - not ideal in practice, but sometimes a recommended debugging tool when first learning JS. Don't include alert statements in any of your assignments.
let name = expression;
let level = 23;
let accuracyRate = 0.99;
let name = "Pikachu";
Variables are declared with the let
keyword (case-sensitive).
You may also see var
used instead of let
- this is an
older convention with
weaker scope - DO NOT USE var
anywhere
CQG: Use camelCasing for variable (and function) names
let level = 23; // Number
let accuracyRate = 0.99; // Number
let name = "Pikachu"; // String
let temps = [55, 60, 57.5]; // Array
Types are not specified, but JS does have types ("loosely-typed")
Number
, Boolean
, String
,
Array
, Object
, Function
, Null
,
Undefined
If you've programmed in a statically-typed language like Java, you will recall that when declaring variables, you must specify their type which must always stay the same.
boolean isValid = "hello!"; // error
In a dynamically-typed language like JavaScript, you don't need to specify the
type (just use let
or const
) and you may change the type the variable refers to later in execution.
let isValid = true; // no error
isValid = "hello!";
isValid = 1;
This may seem to imply fewer errors in JS, but it's not uncommon to run into subtle (silent) bugs in your JS programs as a result!
Since ECMA6, JavaScript has a special keyword to declare "constant" values. You should
use these over the let
keyword for variables that are not intended to ever
be updated (similar to constants in Java).
CGQ: Use UPPER_CASING
naming conventions to
denote const
in JS.
let month = 12;
month = 1; // no error
const COOLEST_CLASS = "CSE154";
COOLEST_CLASS = "clazz"; // error
These can help avoid some of the bugs
mentioned on the previous slide (an error occurs when trying to reassign a
const
).
let enrollment = 99;
let medianGrade = 2.8;
let credits = 5 + 4 + (2 * 3);
Integers and real numbers are the same type (no int
vs.
double
). All numbers in JS are floating point numbers.
Same operators: + - * / % ++ -- = += -= *= /= %=
Similar precedence to Java
Many operators auto-convert types: "2" * 3
is 6
NaN is a return value from operations that have an undefined numerical result (e.g. division by 0)
let nickName = "Sparky O'Sparkz"; // "Sparky O'Sparks"
let fName = nickName.substring(0, s.indexOf(" ")); // "Sparky"
let len = nickName.length; // 15
let name = 'Pikachu'; // can use "" or ''
name === "Pikachu"; // true
name === "pikachu"; // false
Methods:
charAt
,
charCodeAt
,
fromCharCode
,
indexOf
,
lastIndexOf
,
replace
,
split
,
substring
,
toLowerCase
,
toUpperCase
Escape sequences behave as in Java: \' \" \& \n \t \\
To convert between Numbers and Strings:
let count = 10; // 10
let stringedCount = "" + count; // "10"
let puppyCount = count + " puppies, yay!"; // "10 puppies, yay!"
let magicNum = parseInt("42 is the answer"); // 42
let mystery = parseFloat("Am I a number?"); // NaN
To access characters of a String s
, use s[index]
or
s.charAt(index)
:
let firstLetter = puppyCount[0]; // "1"
let fourthLetter = puppyCount.charAt(3); // "p"
let lastLetter = puppyCount.charAt(puppyCount.length - 1); // "!"
split
and join
let s = "the quick brown fox";
let a = s.split(" "); // ["the", "quick", "brown", "fox"]
a.reverse(); // ["fox", "brown", "quick", "the"]
s = a.join("!"); // "fox!brown!quick!the"
split
breaks apart a String into an array using a delimiter
let a = s.split(/[ \t]+/);
join
merges an array into a single String, placing a delimiter between
them
While Strings in JS are fairly similar to those you'd use in Java, there are a few special cases that you should be aware of.
length
is a property (not a method, as it is in Java)+
: 1 + 1
is 2
, but "1" +
1
and 1 + "1"
are both "11"
!
Practice: repeat
, containsTwice
let name = []; // empty array
let names = [value, value, ..., value]; // pre-filled
names[index] = value; // store element
let types = ["Electric", "Water", "Fire"];
let pokemon = []; // []
pokemon[0] = "Pikachu"; // ["Pikachu"]
pokemon[1] = "Squirtle"; // ["Pikachu", "Sqiurtle"]
pokemon[3] = "Magikarp"; // ["Pikachu", "Sqiurtle", undefined, "Magikarp"]
pokemon[3] = "Gyarados"; // ["Pikachu", "Sqiurtle", undefined, "Gyarados"]
Two ways to initialize an array
length
property (grows as needed when elements are added)
let a = ["Mario", "Luigi"]; // [Mario, Luigi]
a.push("Koopatroopa"); // [Mario, Luigi, Koopatroopa]
a.unshift("Bowser"); // [Bowser, Mario, Luigi, Koopatroopa]
a.pop(); // [Bowser, Mario, Luigi]
a.shift(); // [Mario, Luigi]
a.sort(); // [Luigi, Mario]
Array serves as many data structures: list, queue, stack, ...
Methods: concat
,
join
,
pop
,
push
,
reverse
,
shift
,
slice
,
sort
,
splice
,
toString
,
unshift
push
and pop
add/remove from backshift
and unshift
add/remove from frontshift
and pop
return the element that is removed
Practice:
findMin
,
switchPairs
let rand1to10 = Math.floor(Math.random() * 10 + 1);
let three = Math.floor(Math.PI);
Methods: abs
,
ceil
,
cos
,
floor
,
log
,
max
,
min
,
pow
,
random
,
round
,
sin
,
sqrt
,
tan
Properties: E
, PI
function mystery(a, b) {
if (a > b) {
return 0;
} else {
let result = 0;
for (let i = a; i <= b; i++) {
result += i;
}
return result;
}
}
for
Loops (same as Java)for (initialization; condition; update) {
statements;
}
let sum = 0;
for (let i = 0; i < 100; i++) {
sum = sum + i; // same as sum += i;
}
let s1 = "It's a-me, Mario!";
let s2 = "";
for (let i = 0; i < s.length; i++) {
s2 += s1[i] + s1[i];
}
// s2 stores "IItt''ss aa--mmee,, MMaarriioo!!"
See slides below for comparisons in Java/Python!
for
Loop Comparisonslet s1 = "It's a-me, Mario!";
let s2 = "";
for (let i = 0; i < s.length; i++) {
s2 += s1[i] + s1[i];
}
// s2 stores "IItt''ss aa--mmee,, MMaarriioo!!"
String s1 = "It's a-me, Mario!";
String s2 = "";
for (int i = 0; i < s.length(); i++) {
s2 += s1.charAt(i) + s1.charAt(i);
}
s1 = "It's a-me, Mario!";
s2 = "";
for i in range(len(s1)):
s2 += s1[i] + s1[i];
if (condition) {
statements;
} else if (condition) {
statements;
} else {
statements;
}
Identical structure to Java's if/else
statements
JavaScript allows almost anything as a condition
Practice:
rockPaperScissors
while (condition) {
statements;
}
do {
statements;
} while (condition);
break
and continue
keywords also behave as in Java but do not
use them in this class!
Practice:
loopMystery6
Relational: > < >= <=
, Logical: && || !
,
Equality: === !== == !=
5 < "7"
42 == 42.0
"5.0" == 5
===
and !==
are strict equality tests; checks both
type and value: "5.0" === 5
is false
. It's
almost always best to use ===
instead of ==
.
154 === 154.0
evaluate to?Helpful JavaScript equality table!
let iLikeJS = true;
let ieIsGood = "IE6" > 0; // false
if ("web dev is great") { /* true */ }
if (0) { /* false */ }
if (1) { /* true */ }
Any value can be used as a Boolean
false
, 0
, NaN
,
""
, null
, and undefined
Understanding what is "falsey" vs. "truthy" takes patience and practice.
When in doubt, check in the browser console!
function name(params) {
statement;
statement;
...
statement;
}
function myFunction() {
console.log("Hello!");
alert("Your browser says hi!");
}
The above could be the contents of basics.js
linked to our
HTML
page
Statements placed into functions can be evaluated in response to user events
Practice:
fixErrors2
,
containsTwice
,
functionMystery1
,
sumUpTo
,
veryBestSong
function repeat(str, n) {
let result = str;
for (let i = 1; i < n; i++) {
result += str;
}
return result;
}
let repeatedStr = repeat("echo...", 3); // "echo...echo...echo..."
public static String repeat(String str, int n) {
String result = str;
for (int i = 1; i < n; i++) {
result += str;
}
return result;
}
String repeatedStr = repeat("echo...", 3); // "echo...echo...echo..."
function repeat(str, n) {
let result = str;
for (let i = 1; i < n; i++) {
result += str;
}
return result;
}
let repeatedStr = repeat("echo...", 3); // "echo...echo...echo..."
def repeat(str, n):
result = str;
for i in range(1, n):
result = result + str;
return result;
repeatedStr = repeat("echo...", 3) // "echo...echo...echo..."
// single-line comment
/**
* multi-line
* comment
*/
Identical to Java's comment syntax
Recall: 3 comment syntaxes
HTML: <!-- comment -->
CSS/Java/JS: /* comment */
Java/JS: // comment
In this class, we expect you to use the @param
and
@returns
annotation tags in
JSDoc when appropriate for the function.
The @param
annotation specifies the
name and type of each parameter, as well as what the purpose of that parameter
is in the function.
The @returns
annotation specifies the type and expected value
of what is returned given the parameters and any other conditions of the
function. You do not need to use any other JSDoc annotations in CSE 154.
Here is an example of function comment skeletons as reference:
// Single-line JSDoc comment:
/** Your comment here */
/**
* brief description of the function
* @param {datatype} parameterName1 - parameter description
* @param {datatype} parameterName2 - parameter description
* @returns {datatype} Description of the return value
*/
function functionName(parameterName1, parameterName2) {
...
}
You can find more examples in our Code Quality Guide.
Interpreted, not compiled (huh?)
More relaxed syntax and rules
JavaScript's key construct is the function rather than the object/class.
Contained within a web page and integrates with its HTML/CSS
content
Java | JS | Python | |
---|---|---|---|
Compiled vs. Interpreted | Compiled | Interpreted | Interpreted |
Typing | Strong | Loose | Loose |
Variable Declaration | Must be declared before use | Does not need to be declared before use | Does not need to be declared before use |
Key Construct | Classes (OOP) | Function | Function |
Review programming basics: using variables, arrays, loops, if-statements, and functions
Go over some JavaScript tutorials - there are many great ones!
Practice! We now have JavaScript problems on Practice-It (80+ problems) and its sister site CodeStepByStep (200+ problems).
Check out cool examples of JavaScript on the web!