Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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 为什么这两个动态属性赋值会合并为一个值?_Javascript - Fatal编程技术网

Javascript 为什么这两个动态属性赋值会合并为一个值?

Javascript 为什么这两个动态属性赋值会合并为一个值?,javascript,Javascript,我可能在问一个基本的问题,但我不知道如何通过谷歌搜索来消除这种困惑 下面的代码可以很好地工作并计算字数,所以我试图进一步理解 var words = chunk.trim().split(' '); var counts = {}; // Count words words.forEach(function (word) { word = word.trim(); if (word.length) { if (!co

我可能在问一个基本的问题,但我不知道如何通过谷歌搜索来消除这种困惑

下面的代码可以很好地工作并计算字数,所以我试图进一步理解

var words = chunk.trim().split(' ');
       var counts = {};

   // Count words
   words.forEach(function (word) {
       word = word.trim();

       if (word.length) {
           if (!counts[word]) {
               counts[word] = 0;
           }

           counts[word]++;
       }
   });
那么,为什么下面的代码不能为我提供
1,2
。我期待着
1,2
,它给了我
2,2

var a = function(){
  var a, b;
  var  obj = {}
   obj[a]=1;
   obj[b]=2;

  console.log(obj[a]);
  console.log(obj[b]);
}

var res = a();

因为您只声明(未赋值)a和b,并且在javascript中,未赋值变量隐式地
未定义

实际上,您两次引用了
obj[undefined]

var a,b; //here both the variables are undefined

obj[a]=1; 
obj[b]=2; //you're overriding the variable


console.log(obj[a]); //2
console.log(obj[b]); //2
为什么这不给我
1,2
?我期待着
1,2
,它给了我
2,2

var a = function(){
  var a, b;
  var  obj = {}
   obj[a]=1;
   obj[b]=2;

  console.log(obj[a]);
  console.log(obj[b]);
}

var res = a();
这是因为
a==b
;它们都是
未定义的
,因为您从未在
变量a、b
行中为它们赋值。当您在
var
声明中省略
=
赋值时,将使用默认值
undefined
,这意味着您的行变为
var a=undefined,b=undefined

因此,第二个属性赋值(
obj[b]=2
)实际上覆盖了第一个属性赋值(
obj[a]=1
)。您的
obj
仅包含一个键,运行代码后,其整体结构如下所示:

{
  'undefined': 2
}
var a=函数(){
变量a,b
var obj={}
obj[a]=1
obj[b]=2
控制台日志(obj)
}

var res=a()
当您说obj[a]时,javascript试图在obj上创建一个值为a的属性。由于a中的值未定义,字符串表示形式为“未定义”,因此在obj上创建了未定义的属性。 因为b碰巧也有未定义的值,所以实际上是在同一个未定义的属性上写2

因此,两次都得到2。 实际上,如果您登录obj并在console中看到值,您将看到:

Object {undefined: 2}
undefined:2

a
b
都是
未定义的
,因此您在
obj
上设置的唯一属性的名称为“未定义”,因此它会获取您设置的最后一个值。所有对象属性基本上都是字符串(符号除外),因此您为属性提供的任何内容都会转换为字符串。测试这一点的各种方法包括
console.log()
a和
b
的值,以及记录
object.keys(obj)
的结果,以查看您提供了哪些键。谢谢,那么为什么
计数[word]=0工作。我在整个代码中没有看到像
var-word='word'这样的行
在单词计数示例(我发布了部分代码)中,函数自动将
单词
值传递给回调函数(这里我指的是
函数(单词){…}
),它对
单词
数组中找到的每个元素执行一次。由于
单词
数组可以包含多个不同的单词,因此在执行赋值时不会总是发生关键字冲突。为什么计数[word]有效?原因是由于[]表示法,JS在检查counts对象不存在(如果条件满足)后,尝试将属性添加到counts对象中。所以,counts[word]=0语句做了三件事,1)计算word变量的值(如果不是字符串,则转换为字符串),2)添加该计算,假设它是counts对象的属性“abc”。所以它变成了,counts.abc。3) 将属性值设置为0,以便counts.abc等于0。之后,如果再次找到,其计数将递增。