无法在JavaScript中将变量声明为对象属性

时间:2017-04-17 15:15:13

标签: javascript

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

当我运行以下代码时,我得到{}。

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}

但是,将prop = 1替换为result[CurrentElement] = 1会返回预期答案。

为什么在这种情况下使用prop = 1是错误的?

5 个答案:

答案 0 :(得分:3)

var prop = result[currentElement]; 这会将result[currentElement]中的值复制到prop,然后添加一个但不会将其放回到数组中。分配是按价值,而不是参考。

答案 1 :(得分:1)

您需要使用对象的引用来检查和递增。

result[currentElement]
^^                      object
      ^^^^^^^^^^^^^^^^  property of object

如果你只是得到它的值,你得到一个原始值,而不是对象的想要的引用。

value = result[currentElement] // undefined in the first call
                               //         1 in the second call

但您没有对结果的引用。

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

console.log(countWords('hello hello')); // => {'hello': 2}

答案 2 :(得分:0)

在这一行:

var prop = result[currentElement];

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

答案 3 :(得分:0)

因为变量几乎从未通过引用与其他任何内容相关联。

只有2例以其他方式进行:

  1. arguments在非严格模式下。

    function f(a) {
      console.log(a, arguments[0]);
      a = 10;
      console.log(a, arguments[0]);
    }
    
    function g(a) {
      'use strict';
      console.log(a, arguments[0]);
      a = 10;
      console.log(a, arguments[0]);
    }
    
    f(7);
    g(7);

  2. 分配的左侧包括分解。

    var a = 8, b = 10;
    console.log(a, b);
    [a, b] = [b, a];
    console.log(a, b);
    
    var x = [0, 1, 2];
    console.log(x.join(" "));
    [x[1], x[0], x[2]] = x;
    console.log(x.join(" "));

答案 4 :(得分:0)

你需要在结果中添加它:

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