Object
JavaScript's objects are never truly empty because they can pick up members from
the prototype chain. Sometimes that matters. For example, suppose you are writing a
program that counts the number of occurrences of each word in a text. We can use the
toLowerCase
method to normalize the text to
lowercase, and then use the split
method with a
regular expression to produce an array of words. We can then loop through the words
and count the number of times we see each one:
var i; var word; var text = "This oracle of comfort has so pleased me, " + "That when I am in heaven I shall desire " + "To see what this child does, " + "and praise my Constructor."; var words = text.toLowerCase( ).split(/[\s,.]+/); var count = {}; for (i = 0; i < words.length; i += 1) { word = words[i]; if (count[word]) { count[word] += 1; } else { count[word] = 1; } }
If we look at the results, count['this']
is 2
and count.heaven
is 1, but count.constructor
contains a crazy looking string. The
reason is that the count
object inherits from
Object.prototype
, and Object.prototype
contains a member named constructor
whose value is Object
. The +=
operator, like the
+
operator, does concatenation rather than
addition when its operands are not numbers. Object
is a function, so +=
converts it to a string somehow and concatenates a 1 to its butt.
We can avoid problems like this the same way we avoid problems with for in
: by testing for membership with the hasOwnProperty
method or by looking for specific types. In this ...
Get JavaScript: The Good Parts now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.