[INSTRUMENTAL MUSIC PLAYING]
DOUG LLOYD: So near CS50's end, we introduce you
to several different programming languages,
and we aren't able to cover them in nearly as much depth
as we're able to cover C earlier in the course.
The goal here is not to give you a complete rundown of what
these languages do, but to give you enough of the basics
and show you enough of the parallels to things
that you already know so that you can go forth and really flesh out
your knowledge of these different languages.
And another one of these we're going to cover right now is JavaScript.
Now, similar to other languages we've discussed,
it is a modern programming language that is derived from C's syntax.
So if you're familiar with C, you're going
to be able to pick up JavaScript pretty quickly.
It's been around just about as long as Python.
It was invented a few years afterwards in the mid 1990s.
Now what's really important about JavaScript, as well as HTML and CSS,
which we've discussed in other videos, is
that those three languages pretty much make up the core user experience
of what it means to be online.
So understanding how to use and work with JavaScript, HTML, and CSS
will allow you to really create websites that users
will enjoy visiting, because you'll be able to create a great user
experience for them with these three languages.
To write JavaScript, it's really easy.
Open up a file with a dot js file extension,
and start writing in JavaScript right away.
If you're familiar with a language like PHP,
you know that you have to sort of bind your code up
in these delimiters-- bracket, question mark, PHP, and all that stuff.
We don't have to do that in JavaScript.
We literally just start writing our code in a JavaScript
file, which is pretty nice.
Our website will also know that what our file is is JavaScript,
because we're going to tell it in an HTML tag.
We're going to say, I have a script that is of type JavaScript,
and it is a file with a dot js file extension.
Pretty straightforward.
Now, unlike Python, which runs on the server side-- that is, on the side
that is hosting the website, JavaScript applications
run client side on your own machine when you are visiting a website.
To include JavaScript in your HTML, it's pretty easy.
Just like when we include CSS with style tags,
we can include JavaScript in between script tags.
So we can have an open script tag and literally
start writing JavaScript right in our HTML, which is kind of cool.
But also like CSS, where we have link tags,
we can write our JavaScript in a different file
and connect it using the source attribute of a script tag.
In CS50, and really probably more generally,
this is definitely the preferred way to go, particularly
if you have a JavaScript file that might be used--
or the contents of which might be used-- on different pages of your website.
You don't have to write the JavaScript between the script tags
on every single page.
You want to be able to just refer to an outside file
and link that in every single time.
So let's quickly run down some of the fundamentals
that you might use in JavaScript.
So, variables-- they're really similar to Python variables and really similar
to C variables.
No type specifier is required.
And if you want a local variable, you preface it with the var keyword.
So in Python, we would say something like this-- x equals 44.
We don't want to do that in JavaScript, because that would actually
create a global variable, if you were to put a semicolon at the end.
We would want this-- var x equals 44.
That creates a local variable called x in JavaScript,
and stores the value 44 in it.
Conditionals-- all of the old favorites from C are available for you to use.
If, else if, else, switch, question mark colon-- all of those are fair game.
We're not going into detail on those at all,
because we've covered them in our videos on C.
But they're all here to use in JavaScript,
and behave pretty much exactly the same.
Loops, meanwhile-- all of ones we're familiar with from C
are also still available-- while loops, do-while loops,
and for loops, although we do have a couple of other variations
that we'll talk about in just a little bit.
Now, functions in JavaScript are all introduced with the function keyword.
So it's a function.
Write a function name and parameters, and then
we define our function between curly braces just like we would in C,
except in C, of course, we're not using the function keyword.
But there's also a catch with JavaScript, which
is that functions can be anonymous.
Meaning you don't have to give them a name.
Now, you might be asking yourself, wait, how can I call a function
If it doesn't have a name?
Well, we'll talk about that in just a little bit,
and we'll talk about what I mean in particular here when I'm describing
binding things to HTML elements.
We'll talk about that in the video on the document object model,
but we'll talk about anonymous functions in just another minute.
I'll give you an example and you can see how they
might be useful in certain contexts.
And those contexts actually do kind of materialize
a lot in JavaScript programming.
JavaScript, like C, and like Python, are analogous to Python's lists.
Has arrays, and you can declare an array.
It's pretty straightforward.
For example, var nums creates a local array.
And then I have square brackets, and I just
have a comma-separated list of all the values that I want to put in the array.
I can also mix types.
I don't have to have all integers, or all floats, or all strings,
like I do in C. I can have different types mixed together there.
JavaScript has the ability to behave a few different ways.
That's why it can be a little bit tricky as the very first language to learn,
because a sets up a bunch of rules for itself and then breaks them.
It is very, very flexible, but perhaps almost
a little too flexible as a first language.
But it can behave as an object-oriented programming language.
Object-oriented might be a term that you've heard before,
but if not, we'll try to give a quick little crash course here.
An object is really similar in spirit to a structure
that we are familiar with, hopefully, from C. Now, in C,
structures can have a number of different fields or members.
Another term for those that we see commonly in object-oriented programming
are properties.
But those properties, or fields, or members, just like in
C, can never stand on their own.
So for example, if we define the structure for a car like this--
struct car, and inside of that, there are two different fields or members--
int year and char model tens, or a 10-character string
that we can use to store the cars' model.
We can do things like this.
We can say struct car Herbie, which declares
a variable of type struct car named Herbie,
and then we can say Herbie dot year equals 1963.
Hurbie dot model equals Beetle.
That's totally fine.
That's valid C. But we can never say this in C--
we can never say, year equals 1963, model equals Beetle.
Now, we can't say that because year and model are so fundamental to what
it means to be a struct car.
They are part of a struct car.
And so if we're ever using year and model--
we can't use them in the abstract.
We always have to associate those things with a particular struct car.
So that is not OK.
Objects, in addition to having fields, or members, or properties,
also have something called methods, which
is sort of like if a C structure had a function that could only ever apply
to that structure.
So it's as if we have a function where structures are the only things that
need to be passed in.
Now, that, we have in C.
But we can't define a function inside of the curly braces of a struct.
That is more-- that is object-oriented programming.
That is different from here.
But just like properties, methods don't stand on their own either.
It's not like a function that just exists in the abstract.
It is a function that only exists in the context of, in this case, an object.
So where we might do this in C-- function parentheses object,
where object is a parameter to the function being called--
that is not object-oriented styling.
Object oriented means the object is at the core of everything,
and instead, we're going to call this function that is a part of the object.
OK?
So this is what object-oriented programming looks like in a very,
very basic form, is, there are functions that are affiliated or associated with
objects, and we call those functions as follows--
by specifying the object and saying we want some function
to execute on that object, like this.
The fields and methods of an object are really similar in spirit
to the idea of a dictionary, which you may be familiar with
or recall from Python.
So we could, for example, have something like this-- var Herbie equals--
curly braces, now, not square brackets, it's curly braces--
and then, a comma-separated list of key value pairs, where
year 1963 is sort of like saying Herbie dot year equals 1963 in C,
and Herbie dot model equals Beetle.
This is akin to how we would do the same thing in JavaScript,
by creating an object and giving it a couple of properties right away.
All right.
Now, let's go back to loops, because I mentioned earlier,
there are a couple of different new loops that we can use in JavaScript.
So now that we have this object, how would we maybe iterate across
all of the key value pairs of that object?
Or in fact, how we iterate across all of the elements of an array,
if we wanted to do that, besides using a for loop, a while
loop, or a do-while loop?
So in Python, we saw something like this--
for key in list, and then we would have some code where we would use
key every point from there on down--
a stand in for the i-th element of the list.
You can't do that in JavaScript, but we can do something pretty similar
for var key in object.
And then open curly brace.
And between those curly braces, we can use object square bracket key
to refer to the key-th element of the object,
or the key-th key in a key value pair set of the object.
We also have a slightly different variation
for var key of object, which, instead of having to use
object square bracket key, we can now refer
to iterating across all of the values--
as opposed to this, which iterates across all the keys,
this would iterate across the values.
So we can cover both sides of a key value pair using for var key
in, or for var key of.
Here's an example of an array where we're
going to use these two different types of loop.
So we have here a week array that has 7 elements in it--
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday.
And I want to use a four var day in week array.
So I want to use a for in loop, and I want to console dog log.
Console dot log is the JavaScript equivalent of print f.
You can access it using developer tools in most modern browsers.
What's going to happen when they print this out?
It's going to print out a list of all of the keys.
Well, in this array, there's really no keys-- there's a bunch of indices.
So this will print out 0, 1, 2, 3, 4, 5, 6,
because there are seven elements of my array,
and I am logging which element I'm talking about.
If I wanted to print out the days instead, I would use a for of loop,
and I would get the following printed out to the console--
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday.
What if I want to concatenate information?
So remember, we can tie different strings together.
We could do that in Python.
We can do it as well here in JavaScript.
And we do that by using plus.
So if I want to console dot log a bunch of different strings concatenated
together, I just use plus to do it.
But here's a little bit of a catch, right?
If I'm using plus, now it means two different things.
I want to concatenate strings together, but maybe here, I want to add.
I really encourage you to take a look at what
happens if you write the week array into some JavaScript,
and then have a loop that iterates across and console dot logs this.
You might find that you get something that you don't expect.
And so, JavaScript is making its best guess,
and it's assuming that day and 1 are both strings, when really,
what I want to do is add them together, literally, because they're numbers.
But fortunately JavaScript gives us a way around that
by using a function called parse int.
Now, this is going to give us what we expect to see.
This, on the other hand, is going to give us
something we don't expect to see.
But it's just, again, a case of, we're using the same operator
to mean two different things, and the language sometimes
has to make a best guess.
So it's not always a great thing that languages nowadays don't often
require us to specify a data type--
if we were able to specify a data type here,
we would be able to disambiguate this.
But here with JavaScript, it thinks it's being very helpful for us
by not specifying a type.
And it's going to make our best guess as to what we want to do,
but sometimes it guesses wrong.
But it gives us ways to work around it if it does indeed guess wrong.
So arrays are actually a special case of an object.
And, actually, in JavaScript, everything is a special case of an object.
X, any variable, var x equals 44--
that's an object that just happens to have one property.
Arrays are an object that happens to have a number of properties,
and also some certain methods that can be applied to them.
So we can call the size method, or pop, or push, or shift.
And I'll leave you to figure out, or to do some research into,
what those different things are.
But suffice it to say that they are functions that are basically
so baked into what it means to be an array
that we can just call them without having
to write them in the first place.
That's pretty cool.
Here's another cool thing that you can do
with arrays-- there's another method for them called
map, which basically allows us to apply a function to every single element
of an array.
And in particular, this is a great example
for using an anonymous function.
So let's take a look at how we might use an anonymous function
and why it might be useful to do so.
Here's an array called nums.
It has five elements in it--
1, 2, 3, 4, and 5.
Now, what I want to do is, I want to map some function on to them.
So what I'm saying here is, nums equals--
so I'm going to do something to nums.
I'm going to reassign that back to nums.
Nums equals nums dot map--
and remember, map takes in a function.
It's a function that I want to apply to all of the elements of that array.
One thing I could do is just write this function somewhere else,
and give it a name, say I called it--
what's going to happen here is, every value's going to be doubled.
Let's say that I wrote a function called double numbers.
I could say, nums equals nums dot map parentheses double numbers,
and it would just double every number.
That would be fine.
But here, notice I'm using that function key word,
and I'm giving a list of parameters-- in this case, num--
but I'm not giving that function a name.
Why am I not giving that function a name?
Well, I'm just doing this mapping here.
I'm never going to need to double these numbers again.
Why am I going to clutter up the name space,
and give it some name when I'm never going to use it
again outside of this context?
It's kind of convenient that we can actually use the function in this case,
then, without having to give it a name, and still
have it do what we want to do.
So all I'm doing here inside of those parentheses of maps is,
the open parentheses on the first line there--
and that close parentheses is actually on the third line.
And in between the parentheses, where I'm specifying the parameter to map,
I'm literally defining an entire function in there.
And then if I execute this line of code, what's going to happen to nums?
Well, you can probably guess, it's going to just double every element of nums.
All right, one more thing I want to touch on really quick about JavaScript,
and that is the notion of events.
So an event is something that goes hand in hand with HTML on JavaScript,
and it is a response to a user doing something on a web page.
So for example, perhaps they click a button.
Perhaps the page has finished loading after the user hits refresh,
for example.
Maybe they hover over a portion of the page, or something like that.
All of those things are events.
And JavaScript has support for what is called an event handler, which
is some JavaScript code that will execute
once that event has taken place.
So it allows our site page to be very interactive.
We type in a box, for example--
we could have an event handler, that pops up a message that
says, please enter your password.
So it's just a complete-- it's an empty field that says nothing at all.
You start to type in it, and then this box
pops up because you started typing, which is an event on the page.
And it tells you to do something that is a JavaScript event
handler taking effect.
Many elements of HTML have support for events as an attribute.
So here's an example of some really basic HTML.
I have my head and my body, and inside of the body, there are two buttons.
And they have this attribute called on click.
On click is a definition, basically, for an event handler.
So I want something to happen when I click the buttons.
Right now it's nothing, but I can put something in there
so that when I click on either of those buttons,
that function that's in between the quotation marks there would get called.
We can write a really generic event handler in JavaScript,
for example, that creates an event object,
and will tell us which of those two buttons were clicked.
And it might look something like this.
Button on click equals alert name event.
If we do this, we have basically set up our HTML,
so that when either button one is clicked or button two is clicked,
the alert name function will be called, and an event will be passed in.
The event is automatically generated by the page,
and it basically contains all of the information about what just happened.
And from that information, we can extract more information.
So for example, here what the alert name function might look
like, and notice that here, I'm also accepting an event parameter.
What am I doing then?
I'm getting a new JavaScript local variable called trigger,
and I'm asking for that event's source element.
And what that is basically telling me is,
what is the element on the page that was interacted
with that triggered this event?
Or rather, put another way, what element effectively
was passed in to this function.
Because, again, this is automatically generated.
The page knows which button we touched, and so, basically,
what's happening here is, that button-- whichever one of the two it was--
is getting passed into this function.
Then-- and you'll see a little bit more of this when we talk about the document
object model--
I can access that trigger's inner HTML to figure out which button was clicked.
Now, what is inner HTML?
Let me jump back a couple of slides for a second here.
The inner HTML is what is between the button tags.
In this case, button one is inner HTML and button two is also inner HTML.
So what happens when I click on those buttons is, it will alert to me,
you clicked on button one if I happened to click on button one,
or, you clicked on button two, if you happened to click on button two.
Now, again, we are just scratching the surface of JavaScript,
but I wanted to give you a sense of some of the different things
that you can do, so that you can then go forward, look at the documentation,
and see the very wide range of things that you can do as well,
by just applying some of the basic tenets
that we've learned about in CS50, and really expanding
your knowledge exponentially.
I'm Doug Lloyd.
This is CS50.