繁体   English   中英

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

[英]Can't declare variable as object property in 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}

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

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

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

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

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} 

在这一行:

var prop = result[currentElement];

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

因为变量几乎永远不会通过引用链接到其他任何对象。

只有两种情况会以其他方式出现:

  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(" ")); 

您需要将其添加到这样的结果中:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM