使用字符串“constructor”作为JavaScript对象中的键

时间:2014-07-06 03:42:59

标签: javascript inheritance constructor jasmine prototype

我正在进行一项练习JavaScript练习,但我已经陷入困境。练习是创建一个循环遍历字符串的函数,然后创建一个对象,每个单词作为键,以及该单词作为相应值出现的次数。简单吧?好吧,现在我被困在后面的一个步骤中,输入字符串包含单词" constructor"并且您需要将其作为键放入对象中。这是我到目前为止的代码,以及测试它的Jasmine规范:

function words(words){
    count = {};
    splits = words.split(" ");
    for(var i = 0; i < splits.length; i++){
        splits[i] = splits[i].replace(/[;:!&@$%\^,]/g, "").toLowerCase();
        if([splits[i]] == ""){
            continue;
        }else if(count[splits.i] !== null){
            count[splits[i]]++;
        }else{
            count[splits[i]] = 1;
        }
    }
    return count;
};

words("constructor Constructor")

describe("words()", function() {
  it("counts constructor", function() {
    var expectedCounts = { constructor: 2 };
    expect(words("constructor Constructor")).toEqual(expectedCounts);
  });
});

问题是,在第二个条件中使用点或括号表示法,它的结果为&#34;构造函数&#34;是从链原型的Object原型继承而来,因此它尝试增加NaN值。我试图找到一个解决方案但是空洞的。尽管我喜欢JS,但它的继承还有它的怪癖。在这种情况下是否有任何方法可以阻止继承或任何人都能想到的其他工作?

1 个答案:

答案 0 :(得分:2)

不要与null进行比较,看看您是否已在count上设置了属性,请使用hasOwnPropertyhasOwnProperty不包含来自原型链的属性,只包含直接在对象上的属性。

if (count.hasOwnProperty(splits[i])) {
    count[splits[i]]++;
} else{
    count[splits[i]] = 1;
}