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 ...