javascript - 2 个对象(通过字符串的 new 关键字创建)不提供 [Object][Object] (JavaScript)
问题描述
这个问题是基于上一个问题:
人们回答说,通过两种不同的方式创建字符串是有区别的:
- 字符串字面量创建字符串 (
var a = "abc"
) new
关键字创建字符串对象,我假设它是一种对象(var b = new String("def")
)
现在,typeof
在第一种情况下将返回string。在第二种情况下,它将返回Object。我很好,开发它的人可能有某种工作方式,JS引擎。
但是,那么,在下面的例子中,为什么我在最后一行得到的答案是abcdef
. 现在,这也应该得到安慰[object][object]
,如上一行。现在我真的很困惑,new String
是创建一个字符串,还是对象还是什么?它只是不一致!
有人可以帮我解释一下吗?
var obj1 = new Object({name: "Peter"});
var obj2 = new Object({age: 29});
var str1 = new String("abc");
var str2 = new String("def");
console.log(obj1);
console.log(obj2);
console.log(str1);
console.log(str2);
console.log(obj1 + obj2);
console.log(str1 + str2);
解决方案
new String
创建一个String
对象,该对象继承自Object
,但有自己的.toString
和.valueOf
方法,因此它将打印字符串内容。
var o = new Object();
var s = new String("foo");
console.log(o.toString === s.toString); // false
console.log(o.valueOf === s.valueOf); // false
你可以用你自己的覆盖它们以查看它们是否被调用。只要确保也调用原件。
var s = new String("foo");
s.valueOf = function() {
console.log("custom valueOf");
return String.prototype.valueOf.call(this);
}
s.toString = function() {
console.log("custom toString");
return String.prototype.toString.call(this);
}
console.log(s + s);
[""].join(s);
推荐阅读
- c++ - 断开连接后重新连接 boost beast (asio) websocket 和 http 连接时出错
- css - CSS:段落不应该内联显示
- swift - 授权 HealthKit 时 iOS + WatchKit 应用程序错误 – containerAppExtensionEntitlementsWithCompletion: failed with error
- python - 如何使用 PpenCv 在图像中勾勒人体轮廓?
- css - 当 CSS 移动到 CDN 时,即使 CSS 文件可访问,离子图标也会消失
- javascript - 文件上传 - Node Js(Express) 到 React Js。如何获得正确的图像路径?
- r - 在图中计算邻居时遇到问题
- highcharts - Highchart 注释卷轴
- c# - 如何将用户导航到 Xamarin iOS 中的另一个视图控制器
- r - 对数据框进行子集化,计算平均值并在 R 中的循环中填充数据框