JavaScript:数组。为什么将带有填充数组的空数组连接成字符串?

时间:2017-04-29 00:33:45

标签: javascript arrays concatenation

我正在解决扁平化数组的问题。我遇到了一些非常奇怪的东西,似乎无法在网上找到答案。

为什么

-Wl,-fno-jump-tables

我似乎无法理解为什么在填充的数组中添加一个空数组会产生一个包含填充数组内容的字符串。

导致这种情况的幕后发生了什么?

我的代码示例:

[] + [1,2] = '1,2'

据我所知,reduce会将'[]'设置为'初始值',因此对于原始数组中的每个元素,它会将它与一个空数组连接,从而“展平”数组。

3 个答案:

答案 0 :(得分:5)

在对象之间使用+(数组是对象)时,JavaScript会在内部调用toString()和/或valueOf()

var coercion1 = {} + {foo: 'Foo', bar: 'Bar'},
    coercion2 = [] + ['foo', 'bar'];

console.log(coercion1);
console.log(coercion2);

这与以下内容相同:

var coercion1 = "".concat({}.toString(), {foo: 'Foo', bar: 'Bar'}.toString()),
    coercion2 = "".concat([].toString(), ['foo', 'bar'].toString());

console.log(coercion1);
console.log(coercion2);

这又是一样的:

var coercion1 = "".concat({}.valueOf(), {foo: 'Foo', bar: 'Bar'}.valueOf()),
    coercion2 = "".concat([].valueOf(), ['foo', 'bar'].valueOf());

console.log(coercion1);
console.log(coercion2);

  

要将对象转换为字符串,JavaScript需要执行以下步骤:

     
      
  • 如果对象具有 toString()方法,则JavaScript会调用它。如果它返回原始值,JavaScript会将该值转换为a   string(如果它不是一个字符串)并返回结果   转换。 [...]
  •   
  • 如果对象没有 toString()方法,或者该方法没有返回原始值,则JavaScript会查找    valueOf()方法。如果方法存在,JavaScript会调用它。如果返回值是基元,则JavaScript会将该值转换为a   string(如果它还没有)并返回转换后的值。
  •   
  • 否则,JavaScript无法从 toString() valueOf()获取原始值,因此会抛出TypeError。
  •   

David Flanagan JavaScript:权威指南

答案 1 :(得分:4)

由于+运算符触发了 JavaScript implicit type coersion ,因此发生这种情况。您不能简单地对数组执行+操作,因此它们将转换为字符串(其中包含以逗号分隔的字符串转换的数组值)。

答案 2 :(得分:-1)

使用+将生成一个字符串,并且控制台会排除括号。与

相同
''+[1,2]