使用字符串"构造器"JavaScript对象中的关键字

Using string "constructor" as key in JavaScript object

本文关键字:quot 关键字 对象 JavaScript 构造器 字符串      更新时间:2023-09-26

我正在做一个练习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);
  });
});

问题是,在第二个条件中使用点或括号表示法,它的计算结果为true,因为"构造函数"是从对象原型中继承的,因此它试图增加NaN值。我试着找了个变通的办法,但一无所获。尽管我很喜欢JS,但它的继承有它的怪癖。在这种情况下,有没有任何方法可以防止继承,或者有人能想到的其他工作?

而不是比较null,看看你是否已经在count上设置了一个属性,使用hasOwnPropertyhasOwnProperty不包括来自原型链的属性,只包括直接在对象上的属性。

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