请考虑这个JS功能
我已经看到了similar这个问题,但无法理解。
function a (ResultArray){
var counts={};
for ( p = 0; p < ResultArray.length; p++){
counts[ResultArray[p]] = (counts[ResultArray[p]] + 1) || 1;
}
return counts;
}
var arr = ["a","b","c","d","a","b","e"];
var res = new a(arr);
console.log(res)
它的工作正常,并给予计数。我需要了解它是如何给予计数的,特别是(counts[ResultArray[p]] + 1) || 1;
部分。 +1
和||
在做什么。
答案 0 :(得分:3)
我想主要的困惑来自这一行:
counts[ResultArray[p]] = (counts[ResultArray[p]] + 1) || 1;
||
运算符返回左侧的内容,如果它是“truthy”(除“falsy”值false
,0
,''
以外的任何内容, null
,undefined
和NaN
),否则会返回右侧的内容。
如果ResultArray[p]
不在counts
内,则counts[ResultArray[p]]
将为undefined
。由于undefined + 1
为NaN
,||
的左侧是“假的”,因此它将返回右侧1
。
否则,counts[ResultArray[p]]
将是我们已经看过的ResultArray[p]
次,我们会向其添加1
。在这种情况下,左侧将是“真实的”,它将返回新的计数。
答案 1 :(得分:1)
尚未设置数组值,因此无法增加undefined。第一次命中一个值时,“|| 1”部分将初始值设置为1.如果它再次击中相同的索引(不再是未定义的,现在设置为1),则执行左侧而是递增预先存在的值为1.
答案 2 :(得分:0)
在上述算法中要记住一些事项
counts = {}
只是一个集合或字典,因此counts."a"
或counts.a
或counts[a]
都可以用来访问里面的值因此,counts
对象counts.a = 1
或counts["a"] = null
是对计数集(对象)的赋值。counts[ResultArray[p]] since
计数is a object javascript dynamically creates the value of
ResultArray [p]] as a property or key to
计数`因为javascript是松散类型的counts[ResultArray[p]] = (counts[ResultArray[p]] + 1) || 1;
javascript从count[ResultArray[p]]
开始评估
counts
计算到一个对象(set,dictionary),然后移动到ResultArray
,在运行时p
计算到数组,然后在第一次迭代中计算为0,因此整个评估是counts[ResultArray[0]]
其中javascript创建密钥counts.a
或counts."a"
并为其分配未定义的评估,然后继续
(counts[ResultArray[p]] + 1)
|| 1;并且它内部counts[ResultArray[p]]
因为它已经在上一步中完成了评估为counts.a
或counts."a"
=未定义然后移动到undefined +
这应该在左右评估之后看起来像这样(undefined + 1)
然后,javascript会在下一步评估中将其评估为NaN
&#39;(NAN)|| 1 where
的NaN is always false but 1 is always true in javascript and true = 1 false = 0 hence 1 is assigned to
{counts.a {1}}计数&#34; A&#34;或or
= 1 这里是从左到右分解的javascript评估步骤
counts[a]
counts[ResultArray[p]] = (counts[ResultArray[p]] + 1) || 1;
(对象,集合或字典)counts = {}
(数组)ResultArray
(整数)p
ResultArray[p] = "a"
(由于之前没有分配,因此分配了未定义)counts["a"]
(对象,集合或字典)counts = {}
(数组)ResultArray
(整数)p
ResultArray[p] = "a"
(未定义)counts["a"]
(加法操作)+
(整数)1
counts["a"] + 1 = undefined + 1 = NaN
= 1(布尔值1 =真假= 0南= 0 =假0 || 1 1胜或声明)