[英]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]
)保持不变。
因为变量几乎永远不会通过引用链接到其他任何对象。
只有两种情况会以其他方式出现:
非严格模式下的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(" "));
您需要将其添加到这样的结果中:
<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.