我想简单地添加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;
在上面的代码中,我可以理解:
案例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个对象(如您所说)?
答案 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 之前,两个操作数都是转换到原语:
- 让 lprim 为 ToPrimitive (lval)。
- 让 rprim 为 ToPrimitive (rval)。
醇>
现在让我们看看 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);
e
变为"red,green,blue"
f
变为"lily,Lotus"
"red,green,bluelily,Lotus"
对象也一样。无论内容如何,object.toString()
变为[object Object]
且对象的总和将产生"[object Object][object Object]"
。
正如您所看到的,在其他情况下(第8点),它会尝试将操作数转换为数字,然后返回它们的总和。