Can';t在JavaScript中将变量声明为对象属性

Can';t在JavaScript中将变量声明为对象属性,javascript,Javascript,我声明了一个函数,当给定一个字符串作为参数时,它返回一个对象,其中键是字符串中的单词。值是该单词在字符串中出现的次数 当我运行下面的代码时,我得到{} function countWords(string) { var result = {}; var words = string.split(' '); for (var i = 0; i < words.length; i++) { var currentElement = words[i]; var pro

我声明了一个函数,当给定一个字符串作为参数时,它返回一个对象,其中键是字符串中的单词。值是该单词在字符串中出现的次数

当我运行下面的代码时,我得到{}

function countWords(string) {
  var result = {};
  var words = string.split(' ');
  for (var i = 0; i < words.length; i++) {
    var currentElement = words[i];
    var prop = result[currentElement];
    if(prop) {
        prop += 1;
    } else {
        prop = 1;
    }
  }
  return result;
}

console.log(countWords('hello hello')); // => {'hello': 2}
函数countWords(字符串){
var result={};
var words=string.split(“”);
for(var i=0;i{'hello':2}
但是,将
prop=1
替换为
result[CurrentElement]=1
将返回预期的答案


为什么在此上下文中使用prop=1是错误的?

var prop=result[currentElement]

这会将
result[currentElement]
中的值复制到
prop
中,然后添加一个值,但不会将其放回数组中。赋值是按值进行的,而不是按引用进行的。

var prop=result[currentElement]
这会将
result[currentElement]
中的值复制到
prop
中,然后添加一个值,但不会将其放回数组中。赋值是按值进行的,而不是按引用进行的。

在这一行中:

var prop = result[currentElement];
您正在复制
result[currentElement]
(显然是一个数字)的值,然后增加副本,因此原始值(
result[currentElement]
)保持不变。

此行:

var prop = result[currentElement];

您正在复制
result[currentElement]
(显然是一个数字)的值,然后增加副本,因此原始值(
result[currentElement]
)保持不变。

因为变量几乎从不通过引用与任何其他变量链接。

只有两种情况是以其他方式进行的:

  • 参数
    处于非严格模式

    函数f(a){
    log(a,参数[0]);
    a=10;
    log(a,参数[0]);
    }
    职能g(a){
    "严格使用",;
    log(a,参数[0]);
    a=10;
    log(a,参数[0]);
    }
    f(7);
    
    g(7),因为变量几乎从不通过引用与其他任何东西链接。

    只有两种情况是以其他方式进行的:

  • 参数
    处于非严格模式

    函数f(a){
    log(a,参数[0]);
    a=10;
    log(a,参数[0]);
    }
    职能g(a){
    "严格使用",;
    log(a,参数[0]);
    a=10;
    log(a,参数[0]);
    }
    f(7);
    
    g(7)您需要使用对对象的引用进行检查和递增

    result[currentElement]
    ^^                      object
          ^^^^^^^^^^^^^^^^  property of object
    
    如果你只是得到它的值,你会得到一个原语值,而不是想要的对象引用

    value = result[currentElement] // undefined in the first call
                                   //         1 in the second call
    
    但您不再有对结果的引用

    函数countWords(字符串){
    var result={};
    var words=string.split(“”);
    for(var i=0;iconsole.log(countWords('hello'));//=>{'hello':2}
    您需要使用对对象的引用进行检查和递增

    result[currentElement]
    ^^                      object
          ^^^^^^^^^^^^^^^^  property of object
    
    如果你只是得到它的值,你会得到一个原语值,而不是想要的对象引用

    value = result[currentElement] // undefined in the first call
                                   //         1 in the second call
    
    但您不再有对结果的引用

    函数countWords(字符串){
    var result={};
    var words=string.split(“”);
    for(var i=0;iconsole.log(countWords('hello'));//=>{'hello':2}
    您需要将其添加到结果中,如下所示:

    <script>
        function countWords(string) {
      var result = {};
      var words = string.split(' ');
      for (var i = 0; i < words.length; i++) {
        var currentElement = words[i];
        var prop = result[currentElement];
        if(prop) {
            prop += 1;
        } else {
            prop = 1;
        }
        result[currentElement]=prop;
      }
      return result;
    }
    
    console.log(countWords('hello hello test khalil'));
    </script>
    
    
    函数countWords(字符串){
    var result={};
    var words=string.split(“”);
    for(var i=0;i
    您需要将其添加到结果中,如下所示:

    <script>
        function countWords(string) {
      var result = {};
      var words = string.split(' ');
      for (var i = 0; i < words.length; i++) {
        var currentElement = words[i];
        var prop = result[currentElement];
        if(prop) {
            prop += 1;
        } else {
            prop = 1;
        }
        result[currentElement]=prop;
      }
      return result;
    }
    
    console.log(countWords('hello hello test khalil'));
    </script>
    
    
    函数countWords(字符串){
    var result={};
    var words=string.split(“”);
    for(var i=0;i
    prop
    只是一个变量。如果将其分配给某个属性,然后写入
    prop=1
    ,则只需将
    prop
    重新定义为
    1
    。实际上,您没有触及属性本身。
    prop
    的可能副本只是一个变量。如果将其分配给某个属性,然后写入
    prop=1
    ,则只需将
    prop
    重新定义为
    1
    。你实际上并没有接触到财产本身。可能是