有人能解释一下,当我添加一个带有数值的object类型变量时会发生什么?
我在chrome dev控制台中执行了以下操作:
return $this->authenticated($request, Auth::user());
另请注意,括号内首先是小写 o 对象,第二个是大写 O 对象。 感谢。
答案 0 :(得分:1)
这被称为type coercion
。变量a
不能在技术上添加1。所以它强制转换为字符串,然后与数字1连接。
var a = {} + 1; //[object object]1
//--> string form of {} will be [object object]
//--> + operator will use its overload concatenation when it is used over a string.
//--> The type of value returned after this operation will be a string.
答案 1 :(得分:1)
a = a+1
a
是否为数值,如果是,那么行为是正常的数学运算。a
并继续正常string concatenation
。从对象到字符串的默认转换为[object Object]
,因此a+1
将为[object Object]1
尝试stringify({});
,打印[object Object]
答案 2 :(得分:1)
使用plus运算符对象时,使用toString方法转换为字符串。然后字符串a和b连接
答案 3 :(得分:1)
你会喜欢这个:https://youtu.be/20BySC_6HyY?t=1m26s所有关于JavaScript试图纠正你的变量类型。它有一些疯狂的边缘情况。例如
" +"是"添加" 2个字符串形成新的字符串或添加2个数字以形成" sum"。在您的情况下 - 您正在尝试将变量类型更改为字符串或数字并创建新的字符串或数字。 Js决定制作新的字符串:
var a = {}
// Output: Object {}
a.toString();
// Output: "[object Object]"
要了解更多信息,我强烈建议您:
答案 4 :(得分:1)
JavaScript和混合类型操作的规则非常复杂并且取决于操作,例如+
非常简化的描述:
对象的字符串转换(除非您定义了要做的事情)只是"[object Object]"
,这解释了您在问题中描述的结果。
请注意,这不是全部事实......事情要复杂得多,完整描述需要.toValue
成员等概念,Date
对象的特殊情况等等。此外,随着时间的推移,事情变得越来越复杂(例如,ES6行为需要引入概念,例如区分&/34; exoticToPrim"" OrdinaryToPrimitive")。
不幸的是,我不开玩笑。
如果您想在编写测试程序时更加注意,那么您无法信任==
运算符来检查结果是什么,因为该等式运算符的规则更加复杂(实际上接近总疯狂,实际上)。 Javascript中的==
只是一个隐藏bug的庇护所,并且在任何代码中都没有位置(如果奇怪的话,你真的想要它做什么然后明确地实现该行为并评论为什么需要它而不仅仅是使用{{ 1}})。
始终使用==
。