Javascript 尝试直接添加阵列和对象时的浏览器行为

Javascript 尝试直接添加阵列和对象时的浏览器行为,javascript,html,arrays,object,Javascript,Html,Arrays,Object,我试图简单地添加两种不同类型的字符串、数字、数组、对象,并尝试分析结果,了解JS V8引擎如何使用它们: var a=彼得; var b=马丁; var c=5; var d=10; 变量e=[红、绿、蓝]; var f=[lily,Lotus]; var g={姓名:彼得,年龄:29}; var h={国家:美国,州:纽约,性别:男性}; 控制台loga+b; 控制台.logc+d; 控制台loge+f; 控制台logg+h; var i=g+h; console.logi; console

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

var a=彼得; var b=马丁; var c=5; var d=10; 变量e=[红、绿、蓝]; var f=[lily,Lotus]; var g={姓名:彼得,年龄:29}; var h={国家:美国,州:纽约,性别:男性}; 控制台loga+b; 控制台.logc+d; 控制台loge+f; 控制台logg+h; var i=g+h; console.logi; console.logi[0]; console.logi[1]; console.logi[2];
好的,你不能只在JavaScript中添加数组,当你尝试使用加法操作符时,JavaScript将它们的值表示为字符串,然后将它们相加,然后用拆分,再将它们连接回来,但是,你可以用a.concatb将它们连接起来

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

var a=彼得; var b=马丁; var c=5; var d=10; 变量e=[红、绿、蓝]; var f=[lily,Lotus]; var g={姓名:彼得,年龄:29}; var h={国家:美国,州:纽约,性别:男性}; 控制台loga+b; 控制台.logc+d; console.loge.concatf; console.logObject.assign{},g,h;
好的,你不能只在JavaScript中添加数组,当你尝试使用加法操作符时,JavaScript将它们的值表示为字符串,然后将它们相加,然后用拆分,再将它们连接回来,但是,你可以用a.concatb将它们连接起来

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

var a=彼得; var b=马丁; var c=5; var d=10; 变量e=[红、绿、蓝]; var f=[lily,Lotus]; var g={姓名:彼得,年龄:29}; var h={国家:美国,州:纽约,性别:男性}; 控制台loga+b; 控制台.logc+d; console.loge.concatf; console.logObject.assign{},g,h;
如果将代码粘贴到浏览器控制台中,最后2个将如下所示:

red,green,bluelily,Lotus
[object Object][object Object]
看起来它在3中所做的是使用join函数将数组呈现为字符串,默认情况下,join函数用逗号分隔数组

在4中,它只是返回了一个包含2个对象的数组


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

如果将代码粘贴到浏览器控制台中,最后两个将是这样的:

red,green,bluelily,Lotus
[object Object][object Object]
看起来它在3中所做的是使用join函数将数组呈现为字符串,默认情况下,join函数用逗号分隔数组

在4中,它只是返回了一个包含2个对象的数组


有像lodash和下划线这样的库,它们有许多人使用的用于操作数组和对象的实用程序,还有一些内置函数,这些函数就足够了。

中对加法运算符+的行为做了很好的说明

如您所见,在返回和之前,两个操作数都将转换为基元:

让lprim成为ToPrimitivelval。 让rprim成为最主要的。 现在让我们看看TopPrimitive实际返回的是什么。除了对象之外,它为所有类型返回相同的输入:

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

例如,对于数组,我们得到一个字符串,其中的元素用逗号连接:

var arr = [1, 2, 3];   // "1,2,3"
因为对于默认值,如果是原语值,它将返回toString函数的结果

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

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

var e = ["red", "green", "blue"];
var f = ["lily", "Lotus"];
console.log(e + f);
e变成红色、绿色、蓝色 f变成百合花,荷花 将返回连接,即红色、绿色、蓝百合花、莲花 对象也是如此。无论内容如何,object.toString都将变为[object object],对象的总和将产生[object object][object]


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

中非常清楚地说明了加法运算符+的行为

如您所见,在返回和之前,两个操作数都将转换为基元:

让lprim成为ToPrimitivelval。 让rprim成为最主要的。 现在让我们看看TopPrimitive实际返回的是什么。除了对象之外,它为所有类型返回相同的输入:

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

比如说 对于数组,我们得到一个用逗号连接的元素字符串:

var arr = [1, 2, 3];   // "1,2,3"
因为对于默认值,如果是原语值,它将返回toString函数的结果

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

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

var e = ["red", "green", "blue"];
var f = ["lily", "Lotus"];
console.log(e + f);
e变成红色、绿色、蓝色 f变成百合花,荷花 将返回连接,即红色、绿色、蓝百合花、莲花 对象也是如此。无论内容如何,object.toString都将变为[object object],对象的总和将产生[object object][object]


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

JS的类型非常松散,一些运算符(如+等)表示如果操作数不是数字,则对其操作数进行类型强制。JS是一个非常松散的类型,一些操作符,如+意味着对它的操作数进行类型强制(如果它们不是数字)。Check up.4返回一个字符串,该字符串连接对象的两个字符串表示形式。4返回一个字符串,该字符串连接对象的两个字符串表示形式。