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 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access