我声明一个函数,当给定一个字符串作为参数时,返回一个对象,其中键是字符串中的单词。值是字符串中该单词的出现次数。
当我运行以下代码时,我得到{}。
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是错误的?
答案 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例以其他方式进行:
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);
分配的左侧包括分解。
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>