首页 > 解决方案 > 2 个对象(通过字符串的 new 关键字创建)不提供 [Object][Object] (JavaScript)

问题描述

这个问题是基于上一个问题:

这两个字符串的区别(JavaScript)

人们回答说,通过两种不同的方式创建字符串是有区别的:

  1. 字符串字面量创建字符串 ( var a = "abc")
  2. 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); 

标签: javascripthtml

解决方案


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);


推荐阅读