Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用字符串";建造商;作为JavaScript对象中的键_Javascript_Inheritance_Constructor_Jasmine_Prototype - Fatal编程技术网

使用字符串";建造商;作为JavaScript对象中的键

使用字符串";建造商;作为JavaScript对象中的键,javascript,inheritance,constructor,jasmine,prototype,Javascript,Inheritance,Constructor,Jasmine,Prototype,我正在做一个练习,我被卡住了。练习是创建一个函数,该函数在字符串上循环,然后创建一个对象,每个单词作为键,该单词作为对应值出现的次数。简单对吧?好了,现在我要继续后面的一个步骤,输入字符串包含单词“constructor”,您需要将它作为键放入对象中。以下是我到目前为止的代码,以及测试它的Jasmine规范: function words(words){ count = {}; splits = words.split(" "); for(var i = 0; i <

我正在做一个练习,我被卡住了。练习是创建一个函数,该函数在字符串上循环,然后创建一个对象,每个单词作为键,该单词作为对应值出现的次数。简单对吧?好了,现在我要继续后面的一个步骤,输入字符串包含单词“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);
  });
});
虚词(words){
计数={};
拆分=单词。拆分(“”);
对于(变量i=0;i

问题是,在第二个条件中使用点或括号表示法,它的计算结果为true,因为“构造函数”是从链上的对象原型继承的,因此它试图增加一个NaN值。我试着到处找份工作,但结果一无所获。虽然我很喜欢JS,但它的继承也有它的怪癖。在这种情况下,是否有任何方法可以防止继承或其他任何人都能想到的解决方法?

不要与
null
进行比较,以查看您是否已经在
count
上设置了属性,请使用
hasOwnProperty
不包括来自原型链上游的属性,只包括直接位于对象上的属性

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

constructor
不是您最大的问题。行
count[splits.i]!==空的
非常时髦。而且它不会像您希望的那样工作,因为这个条件永远不会是
false
。如果您将其更改为计数类型[splits[i]==“number”
,它应该可以正常工作。如果您想要一个不继承任何内容的对象,可以使用
object.create(null)
。避免与对象上已有的键冲突的一种方法是在添加键或测试键的存在性时,在您添加的任何键之前添加一个
“\u”
。额外的开销,但本质上为密钥提供了自己的名称空间。迭代键时,使用
.hasOwnProperty()
避免预先存在的键。计数[splits.i]!==如果对象中没有键,null将求值为true,因此它将创建要启动的键并将其val设置为1。到目前为止,它还可以工作,但我喜欢使用typeof count[splits.I]=“number”。问题是,这是评估到未定义,所以并没有进展,除非我遗漏了什么。