Javascript 这个for/in循环究竟是如何工作的?
我在做一个初学者练习,找出一系列数字的平均值/中值/模式/范围。我现在处于模式,发现: 这很有效,但我不明白Javascript 这个for/in循环究竟是如何工作的?,javascript,arrays,loops,for-loop,Javascript,Arrays,Loops,For Loop,我在做一个初学者练习,找出一系列数字的平均值/中值/模式/范围。我现在处于模式,发现: 这很有效,但我不明白 第一行中的|0做什么 为什么我不能更改密钥名称 frequency[“key”+store[v]=(frequency[store[v]]| | 0)+1返回{key1:1,key2:1,key3:1,key4:1}而不是{1:1,2:2,3:1,4:1},因此键起着重要的作用 if语句是否同时测试键和值 替换frequency[store[v]]的任何实例会中断某些内容 整件事
- 第一行中的
做什么李>|0
- 为什么我不能更改密钥名称李>
frequency[“key”+store[v]=(frequency[store[v]]| | 0)+1
返回{key1:1,key2:1,key3:1,key4:1}
而不是{1:1,2:2,3:1,4:1}
,因此键起着重要的作用
- if语句是否同时测试键和值
frequency[store[v]]的任何实例带有变量(var frequetest=frequency[store[v]];
,在循环内部或外部创建)的code>会中断某些内容
整件事真的让我心烦意乱
第一行的| | 0是做什么的
当查找失败时(当还没有具有该名称的frequency
属性时),它将0
作为默认值,以便在值第一次出现时使用1
s初始化映射,而不是NaN
(来自未定义+1
)
作业可以(对于初学者来说,应该)扩展到
if (frequency[key]) // the property already exists, does not give `0` or `undefined`
frequency[key] = frequency[key] + 1;
else // the property didn't exist and the access yielded `undefined`
frequency[key] = 1; // 0 + 1
为什么我不能更改密钥名称
你可以,你只需要在任何地方都这样做
代码应该写得更干净,如下所示:
var store = ['1','2','2','3','4'];
var frequency = {}; // object (key-value-map) of frequency
var max = 0; // holds the max frequency value
var result; // holds the max frequency element name
for (var v=0; v<store.length; v++) {
var key = "key" + store[v];
frequency[key] = (frequency[key] || 0)+1; // increment frequency
// ^^^ here as well
if (frequency[key] > max) { // is this frequency > max so far ?
max = frequency[key]; // update max.
result = store[v]; // update result.
// ^^^^^^^^ alternatively use `key` also here
}
}
var-store=['1'、'2'、'2'、'3'、'4'];
变量频率={};//频率的对象(键值映射)
var max=0;//保持最大频率值
var结果;//保存最大频率元素名称
对于(var v=0;v max){//到目前为止,这个频率是否大于max?
max=频率[键];//更新max。
结果=存储[v];//更新结果。
//^^^^^^^^^^^^或者在此处也使用'key'
}
}
if语句是否同时测试键和值
测试?嗯,不是。它使用存储
数组中的值作为频率
对象中的键。然后将属性值与max
进行比较
第一行的| | 0是做什么的
当查找失败时(当还没有具有该名称的frequency
属性时),它将0
作为默认值,以便在值第一次出现时使用1
s初始化映射,而不是NaN
(来自未定义+1
)
作业可以(对于初学者来说,应该)扩展到
if (frequency[key]) // the property already exists, does not give `0` or `undefined`
frequency[key] = frequency[key] + 1;
else // the property didn't exist and the access yielded `undefined`
frequency[key] = 1; // 0 + 1
为什么我不能更改密钥名称
你可以,你只需要在任何地方都这样做
代码应该写得更干净,如下所示:
var store = ['1','2','2','3','4'];
var frequency = {}; // object (key-value-map) of frequency
var max = 0; // holds the max frequency value
var result; // holds the max frequency element name
for (var v=0; v<store.length; v++) {
var key = "key" + store[v];
frequency[key] = (frequency[key] || 0)+1; // increment frequency
// ^^^ here as well
if (frequency[key] > max) { // is this frequency > max so far ?
max = frequency[key]; // update max.
result = store[v]; // update result.
// ^^^^^^^^ alternatively use `key` also here
}
}
var-store=['1'、'2'、'2'、'3'、'4'];
变量频率={};//频率的对象(键值映射)
var max=0;//保持最大频率值
var结果;//保存最大频率元素名称
对于(var v=0;v max){//到目前为止,这个频率是否大于max?
max=频率[键];//更新max。
结果=存储[v];//更新结果。
//^^^^^^^^^^^^或者在此处也使用'key'
}
}
if语句是否同时测试键和值
测试?嗯,不是。它使用存储
数组中的值作为频率
对象中的键。然后它会将属性值与max
a | | 0
进行比较,如果a未定义,则取1,否则取0
您可以更改密钥名称
var store = ['1','2','2','3', '1', '1','4'];
var frequency = {}; // array of frequency.
var max = 0; // holds the max frequency.
var result; // holds the max frequency element.
for(var v in store) {
frequency['key'+store[v]]=(frequency['key'+store[v]] || 0)+1; // increment frequency.
if(frequency['key' + store[v]] > max) { // is this frequency > max so far ?
max = frequency[store[v]]; // update max.
result = 'key' + store[v]; // update result.
}
}
a | | 0
表示如果a未定义,则取1,否则取0
您可以更改密钥名称
var store = ['1','2','2','3', '1', '1','4'];
var frequency = {}; // array of frequency.
var max = 0; // holds the max frequency.
var result; // holds the max frequency element.
for(var v in store) {
frequency['key'+store[v]]=(frequency['key'+store[v]] || 0)+1; // increment frequency.
if(frequency['key' + store[v]] > max) { // is this frequency > max so far ?
max = frequency[store[v]]; // update max.
result = 'key' + store[v]; // update result.
}
}
您询问的关于frequency[store[v]=(frequency[store[v]]| | 0)+1
的行有时被引用或赋值;这有一些很好的解释和例子。对于你的代码,考虑一下我刚输入到浏览器的JavaScript控制台:
> var frequency = {};
<- undefined
> frequency[0];
<- undefined
> frequency[0] || 0
<- 0
我在代码中添加了一些附加注释,以便更清楚地说明发生了什么。您询问的关于frequency[store[v]=(frequency[store[v]|0)+1
的行有时会被引用或赋值;这有一些很好的解释和例子。对于你的代码,考虑一下我刚输入到浏览器的JavaScript控制台:
> var frequency = {};
<- undefined
> frequency[0];
<- undefined
> frequency[0] || 0
<- 0
我在代码中添加了一些附加注释,以便更清楚地说明发生了什么。对于您的第一个问题:
在JavaScript中,您可以通过将变量用作布尔值来测试变量是否已定义
var foo;
if(foo) //true
console.log('foo is false, 0, null or not defined');
因此,在本例中,您正在测试频率
是否已经有存储[v]
的元素。如果是,则使用该选项,否则使用0
,以便与
var valueInFrequency = frequency[store[v]] ? frequency[store[v]] : 0;
然后继续执行valuenofrequency
关于你的第二个问题:正如我刚才解释的,在
frequency[store[v]]=(frequency[store[v]] || 0)+1;
您可以将当前值提高一,或者将其设置为0,然后再将其提高一。如果更改将值设置为的键,但不测试新值,则只需将现有值重写为0+1
现在进入最后一个问题:不,不是。它使用store[v]
作为frequency
的键,然后将该值与max进行比较
我希望我能回答你的问题。如果还有什么不清楚的地方,就问吧 关于你的第一个问题:
在JavaScript中,您可以通过将变量用作布尔值来测试变量是否已定义
var foo;
if(foo) //true
console.log('foo is false, 0, null or not defined');
因此,在本例中,您正在测试频率
是否已经有存储[v]
的元素。如果是,则使用该选项,否则使用0
,以便与
var valueInFrequency = frequency[store[v]] ? frequency[store[v]] : 0;
然后继续执行valuenofrequency
关于你的第二个问题:正如我刚才解释的,在
frequency[store[v]]=(frequency[store[v]] || 0)+1;
您可以将当前值提高一,或者将其设置为0,然后再将其提高一。如果更改将值设置为的键,但不测试新值,则只需将现有值重写为0+1
现在进入最后一个问题:不,不是。是我们