Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 这个for/in循环究竟是如何工作的?_Javascript_Arrays_Loops_For Loop - Fatal编程技术网

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

现在进入最后一个问题:不,不是。是我们