尝试直接添加数组和对象时的浏览器行为

时间:2017-09-02 12:40:48

标签: javascript html arrays object

我想简单地添加2种不同的字符串,数字,数组,对象并尝试分析结果,并了解使用它们的JS V8引擎:



<script>
var a = "Peter"; 
var b = "Martin"; 
var c = 5; 
var d = 10; 
var e = ["red", "green", "blue"];
var f = ["lily", "Lotus"];
var g = {name: "Peter", age: 29};
var h = {country: "USA", state: "New York", gender: "Male"}; 

console.log(a+b);
console.log(c+d);
console.log(e+f);
console.log(g+h);

var i = g+h; 
console.log(i); 
console.log(i[0]);
console.log(i[1]);
console.log(i[2]); 
</script>
&#13;
&#13;
&#13;

在上面的代码中,我可以理解:

案例1:添加2个字符串将导致&#34;字符串&#34;。

案例2:添加2个数字将添加为数字。

我的问题是:

案例3 :如何尝试添加2个数组返回一个字符串,那个2合并最后一个数组的第1个和第1个?

案例4: 我如何能够访问直接合并2个对象所产生的任何内容?

奖金问题:

此外,有人说,在添加2个对象时,我将得到一个包含2个对象的数组。虽然,唉,我添加了代码&#34; i&#34;向你展示它不是案例的朋友。在这样做时,JS V8引擎返回了一个字符串写入文本&#34; [object object] [object object]&#34;

现在,请告诉&#34; 案例4 &#34;,如何访问此阵列的2个对象(如您所说)?

3 个答案:

答案 0 :(得分:2)

好吧,你不能只在JavaScript中添加数组,当你尝试使用加法运算符时,JavaScript将它们的值表示为字符串并将它们加在一起然后用,分割并将它们连接起来,但是,你可以将它们与a.concat(b)连接起来。

对于对象,您可以使用Object.assign({}, a, b)

<script>
var a = "Peter"; 
var b = "Martin"; 
var c = 5; 
var d = 10; 
var e = ["red", "green", "blue"];
var f = ["lily", "Lotus"];
var g = {name: "Peter", age: 29};
var h = {country: "USA", state: "New York", gender: "Male"}; 

console.log(a+b);
console.log(c+d);
console.log(e.concat(f));
console.log(Object.assign({}, g, h));
</script>

答案 1 :(得分:1)

如果您将代码粘贴到浏览器控制台中,那么最后2将是这样的:

red,green,bluelily,Lotus
[object Object][object Object]

看起来它在3)中所做的是将数组呈现为字符串(可能使用join()函数,默认情况下用逗号分隔它们。

在4)它只返回了一个包含2个对象的数组。

有像lodash和underscore这样的库,它们具有操作许多人使用的数组和对象的实用程序,以及一些足够的内置函数。

答案 2 :(得分:1)

加法运算符(+)的行为在spec中已明确说明。

如您所见,在返回 sum 之前,两个操作数都是转换到原语:

  
      
  1. lprim ToPrimitive (lval)。
  2.   
  3. rprim ToPrimitive (rval)。
  4.   

现在让我们看看 ToPrimitive 实际返回here的内容。好吧,它返回所有类型的相同输入,对象除外:

  

返回Object的默认值。通过调用对象的[[DefaultValue]]内部方法,传递可选提示PreferredType来检索对象的默认值。 [[DefaultValue]]内部方法的行为由本规范为8.12.8中的所有本机ECMAScript对象定义。

所以,例如对于 Arrays ,我们得到一个用逗号连接的元素字符串:

var arr = [1, 2, 3];   // "1,2,3"

因为默认值,它返回 toString 函数的结果,如果它是原始值。

对于对象,默认情况下为以下字符串:[object Object]

现在回到 ToPrimitive 。第7点指出,如果其中一个操作数是一个字符串,另一个操作数也转换为字符串,并返回两者的串联。这就是为什么在你的情况下:

var e = ["red", "green", "blue"];
var f = ["lily", "Lotus"];
console.log(e + f);
  1. e变为"red,green,blue"
  2. f变为"lily,Lotus"
  3. 返回串联,即"red,green,bluelily,Lotus"
  4. 对象也一样。无论内容如何,​​object.toString()变为[object Object]且对象的总和将产生"[object Object][object Object]"

    正如您所看到的,在其他情况下(第8点),它会尝试将操作数转换为数字,然后返回它们的总和。