jMar"s Blog DevSmash Developer Portal

Friday, March 14, 2008

Understanding Loose Typing in JavaScript

For many front end developers, JavaScript was their first taste of a scripting and/or interpretive language. To these developers, the concept and implications of loosely typed variables may be second nature. However, the explosive growth in the demand for Web 2.0-ish applications has resulted in a growing number of back end developers that have had to dip their feet into pool of client side technologies. Many of these developers are coming from a background in strongly typed languages, such as C# and Java, and are unfamiliar with both the freedom and the potential pitfalls involved in working with loosely typed variables.

Since the concept of loose typing is so fundamental to scripting in JavaScript, an understanding of it is essential. This article is a top level discussion of loose typing in JavaScript. Since there may be subtle differences in loose typing from language to language, let me constrain this discussion to the context of JavaScript. OK, let's dig in...

What is Loose Typing?

Well, this seems like a good place to start. It is important to understand both what loose typing is, and what loose typing is not. Loose typing means that variables are declared without a type. This is in contrast to strongly typed languages that require typed declarations. Consider the following examples:

/* JavaScript Example (loose typing) */
var a = 13; // Number declaration
var b = "thirteen"; // String declaration

/* Java Example (strong typing) */
int a = 13; // int declaration
String b = "thirteen"; // String declaration

Notice that in the JavaScript example, both a and b are declared as type var. Please note, however, that this does not mean that they do not have a type, or even that they are of type "var". Variables in JavaScript are typed, but that type is determined internally. In the above example, var a will be type Number and var b will be type String. These are two out of the three primitives in JavaScript, the third being Boolean.

JavaScript also has other types beyond primitives. The type diagram for JavaScript is as follows (as per Mozilla):

Ya really - Null and Undefined too.

Note, however, that this distinction between primitives and objects will be dismissed in JavaScript 2.0. You can read more about that here.

Type Coercion

Type coercion is a topic that is closely associated with loose typing. Since data types are managed internally, types are often converted internally as well. Understanding the rules of type coercion is extremely important. Consider the following expressions, and make sure you understand them:

7 + 7 + 7; // = 21
7 + 7 + "7"; // = 147
"7" + 7 + 7; // = 777

In the examples above, arithmetic is carried out as normal (left to right) until a String is encountered. From that point forward, all entities are converted to a String and then concatenated.

Type coercion also occurs when doing comparisons. You can, however, forbid type coercion by using the === operator. Consider these examples:

1 == true; // = true
1 === true; // = false

7 == "7"; // = true
7 === "7"; // = false;

There are methods to explicitly convert a variable's type as well, such as parseInt and parseFloat (both of which convert a String to a Number).

Double negation (!!) can also be used to cast a Number or String to a Boolean. Consider the following example:

true == !"0"; // = false
true == !!"0"; // = true

This obviously is not a definitive reference to loose typing in JavaScript (or type coercion for that matter). I do hope, however, that this will be a useful resource to those who are not familiar with these topics, and a good refresher for those who already are. I have tried to insure that the above is accurate, but if you notice anything incorrect, please let me know! And as always, thanks for reading!


Anonymous said...

simple and elegant.

Anonymous said...

Found you via Google...

"Ensure" that you do not forget to use a spell-checker before posting.. Irony alert!! ;)

"I have tried to *insure* that the above is accurate, but *if you notice anything incorrect, please let me know!* And as always, thanks for reading!"

akropp said...

You are mixing loose (aka weak) and dynamic typing here. Loose typing is the "7" + 7 example, mixing types to produce a new value. In a strong typed language this would give you a compilation or runtime error.

In contrast a dynamically typed language is one where the types are determined at runtime. Statically typed languages are languages where the types are determined at compile time.

Anonymous said...

I just don't get the purpose of loosely-typed variables. All it seems to do is make a language appear less threatening to beginners while providing nothing but trouble to everyone else.

One of the nice things about specifying your data type is the inherent safety it provides: for example it often produces compiler errors if you mix up your arguments when calling a function with multiple params.

The main problem is why would you not know what your data will represent? If a variable can be named then it can be given a type too: for example, if you've named a variable "lastName" when why would you ever put an integer into it?

If you don't know what your variable is intending to represent then you shouldn't be using it. These kinds of languages seem obscenely bug-prone and then have these needlessly complicated rules on how the variables are used.

gngl said...

"Loose typing means that variables are declared without a type."

Whoa, stop right there, cowboy. That's hardly what I'd call "loose typing". Typing with untyped variables can be pretty strong, if the values used in the computation carry their type and you have proper operators to manipulate them. Javascript does have the former, but it doesn't have the latter - the horrible coercion rules are what's messy about JS types, not the dynamic typing nature. (Common Lisp, Scheme, Python etc. deal with this just fine, but they don't implicitly convert stuff as in 1+"2" -> "12", that's why they're more sensible.)

"Notice that in the JavaScript example, both a and b are declared as type var."

They're not declared as "type var". In fact, they're not declared at all! They're simply values bound to names. var does not declare variables, it establishes variable bindings.

"JavaScript also has other types beyond primitives."

JavaScript doesn't actually have any primitives. Everything is an object in JS. Unless, by "primitives", you mean "atomic values" (as opposed to compound/aggregate data structures), but that is a different issue obviously.

@Anonymous: "I just don't get the purpose of loosely-typed variables. All it seems to do is make a language appear less threatening to beginners while providing nothing but trouble to everyone else."

If you really think this, you're a very undemanding person, with respect to your tools!

The purpose of static type systems is to admit correct, sensible programs, AND to reject nonsensical programs. Real-world static type systems, however, have one of the two following problems:

1) They either reject some correct programs (as in, they're overly restrictive), or
2) they accept some incorrect programs (can't catch some typing errors at compile time).

Some languages, such as Java, delight in doing both at the same time: on one hand, you can't specify covariance or contravariance of method parameter types when subclassing, thus being restricted to invariant parameters, but at the same time, Java arrays are covariant by default, thus making it possible for them to cause run-time type errors in some scenarios.

It doesn't seem to be possible to deal with 1) and 2) at the same time. If you try to do that, you'll find yourself designing increasingly complex type systems involving such things as phantom types, existential types, dependent types and what not; and at one moment, the typing of certain programs may even become undecidable, thus making your compilers stuck in a loop or halting with an "I don't know how to check this" kind of message.

Dynamically typed languages simply adopt the "we don't want to reject any program that might make sense, let's just check it at runtime" approach (and with JIT, they at least try to remove as many checks as possible to have it run at a decent speed, and again, this approach seems to be quite successful). Surprisingly, for many people, it works just fine! Let me conclude with a quote by Alan Kay, one of the inventors of Smalltalk, which summarizes the whole issue nicely: "I'm not against types, but I don't know of any type systems that aren't a complete pain, so I still like dynamic typing."

Jeremiah Deasey said...

Thanks for the examples and walk through.

Also, in your closing statement, the correct word would be "ensure".

make certain that (something) shall occur or be the case.
"the client must ensure that accurate records be kept"
synonyms: make sure, make certain, see to it;

Anonymous said...

7 + 7 + 7; // = 21
7 + 7 + "7"; // = 147
"7" + 7 + 7; // = 777

In the examples above, arithmetic is carried out as normal (left to right) until a String is encountered. From that point forward, all entities are converted to a String and then concatenated.

Might be useful to mention that the arithmetic is carried out until a string is encountered only if you're using the + operator.

"37" + 7 //results in "377"
"37" - 7 //results in 30

Mirabbos Mirfayozov said...

I think this is an informative post and it is very useful and knowledgeable. therefore, I would like to thank you for the efforts you have made in writing this article.
downlodable apps

Syaniezt Barbie said...

The Article is very interesting and I like it. Agen jual fiforlif Balikpapan , Harga Fiforlif di Balikpapan , Jual Fiforlif Murah di Balikpapan , Manfaat Fiforlif , Distributor Fiforlif di Balikpapan

rustam said...

What a fantabulous post this has been. Never seen this kind of useful post. I am grateful to you and expect more number of posts like these. Thank you very much.

Aimee Elvis said...

Thank you for every other great article. The place else may anyone get that kind of information in such a perfect way of writing? I’ve a presentation subsequent week, and I am at the look for such information.
here is ours

kenyattamherzog said...

These feature customers lip-syncing to the current other video clips and also search by trending hashtags.

rustam said...

Blog gave us useful information to work. You have done an amazing job.

usps package tracking said...

Thanks for this awesome post over here it is really good to see it

cheat field said...

Favorable website, where did u develop the info on this posting?I have checked out a few of the articles on your website now, and I truly like your design. Thanks a million and please keep up the reliable work.

rustam said...

Pretty good post. I just stumbled upon your blog and wanted to say that I have really enjoyed reading your blog posts. Any way I'll be subscribing to your feed and I hope you post again soon. Big thanks for the useful info.
downlodable avtivation codes

pauledwards124 said...

Our website is number 1 in Case Study assignment help, online Case Solution & Case Analysis experts. Feel free to contact us to get your case studies done.
Case Study Solution Help

custom t shirts vancouver said...

Revealing post! This article is totally new spin of the topic and certainly superb. Want to learn my more from you.

Jenson said...

OTHER SOLUTIONS: CREATE YOUR OWN LISTS: 2 types of lists are available in List4Life, i. Click To Discover More! Locations can have their order, address and distance displayed on the map.

Detox said...


custom printed t shirts said...

Great stuff and really cool outfit.

anisha malviya said...

Yona of the Dawn Season 2 release is expected in 2017 and here are exclusive updates and plot details about our favorite anime series

Archie said...

This book doesn't treat these topics as fancy frills. Sudoku Shogun provides random puzzles Unlike a human composer, Sudoku Shogun will not favour either numbers or patterns.

Aaron said...

Documents 5 - Fast PDF reader and cloud download manager. This page. It is used as a food additive in the form of a flavoring, stabilizing or thickening agent, often as "dextrin".

TerriDunmire said...

SnapTube Apk is just one of the very best tools to take snaptubedownloads This application will work for every person to delight in seeing.

Anonymous said...

snaptube is a very nice app to download snaptube videos online

Anonymous said...

get your lowes my Lowes life credit card

Albert said...

From PuttyApps: Atlanta has become the market for TV and movie producers. Click To Discover More! Haspa Mobile bietet Ihnen eine bersichtliche Suche dieser Standorte.

Anonymous said...

amazing tips of your just check this here to see more of this

Binasa Lakryuzo said...

See what your friends are discovering and save their posts to your list. download files Use the device's photo library as source, the camera, the Camera Connection Kit, or using iTunes drag and drop, to get photos from your computer.

Binasa Lakryuzo said...

Your phone or any web browser is your control panel. download serial numbers Party poolside with Kandy's models in Hollywood, Las Vegas, and Miami.

Alysia Gauthier said...

sizegenetics We are the only penis enlargement device to show you REAL customer testimonials. Why? Because SizeGenetics™ really works! Learn more.

Nikhil Singh said...


male extra said...

male extra Male Extra pills are famous on the market. But you have to know some side effects and results. My prof review will help you.

Frankie said...

Photographs taken while running contain GPS information so that you can check the running path in Google Map with RunMateGPS. downlodable videos An accident years before has left Quill plagued by headaches--the kind that grows more excruciating with strenuous exercise.

Tyree Trybus said...

In contrast, studies have shown traditional résumés are the best-received. A 2010 study from Norway had 90 people evaluate 12 job-seekers’ résumés. These résumés were presented in a formal manner on white paper, on colored paper or with a creative/infographic-like format. The formal résumé on white paper was significantly more likely than the others to win an interview.

kamil kamil said...

Swipe to the left or right, or tap on a card's edge, to advance or move backwards. downlodable keygens Christmas Cookie Maker is a fun holiday themed baking and decorating game that lets anyone be a true party chef from the comfort of their own home.

nancycongdon said...

I assume I covered all the feasible attributes This time several applications in the market for the Android mobile.

Alysia Gauthier said...

Many women also consider v tight gel after having children. During natural childbirth the vaginal muscles expand to form the birth canal for your baby.

Shop hoa TPHCM said...

http flowers là shop hoa tươi chuyên cung cấp các sản phẩm hoa tang lễ đẹp tại tphcm. Khác hàng muốn mua hoa tang lễ hãy truy cập vào link