为什么Chrome console.log会以如此烦人的方式显示String对象?

时间:2015-03-17 19:17:45

标签: javascript string google-chrome object console

原始字符串在Chrome控制台中很好地显示。但String对象如下:

s = new String('foo bar')
==> String {0: "f", 1: "o", 2: "o", 3: " ", 4: "b", 5: "a", 6: "r", length: 7, [[PrimitiveValue]]: "foo bar"}

我知道我可以通过s+''s.toString()更精彩地看到它。但我经常需要查看阵列和其他充满这些东西的结构。所以我得到的帮助不大:

[s,s,s]
==> [String, String, String]

当我展开其中一个字符串时,我得到了整个字符数组的垂直表示。

如果没有好的答案,也许有人至少可以同情我。

1 个答案:

答案 0 :(得分:2)

厚颜无耻的答案是Chrome以这种方式显示它,因为这就是String对象。 Chrome会尝试将任何旧对象转换为原语吗?

Dandavis的评论是正确的 - 根据您的使用情况,您可以修改String原型,然后使用原语来提高可读性并依赖primitive being cast to a String object(从而使您的方法可用):

  

JavaScript会自动将基元转换为String对象,因此   可以将String对象方法用于原始字符串。

e.g。



String.prototype.upper = function () {
    return this.toUpperCase();
};
document.write("foo bar".upper());




如果你真的想,你可以写一个类似的对象:



function MyString(value) {
    this['[[PrimitiveValue]]'] = value;
    this.length = value.length;
    for (var i = 0;i<value.length;i++) { this[i] = value.charAt(i); }
    this.charAt = function(val) {
            return this[val];
        };
    this.toString = function() { return this.primitive };
    return this;

}
var myString = new MyString('foo bar');
var string = new String('foo bar');
document.write('custom:', myString, ' native:', string, '<br/> check the console too');
console.log('custom:', myString, ' native:', string)
&#13;
&#13;
&#13;

会将类似的内容输出到控制台:

MyString {0: "f", 1: "o", 2: "o", 3: " ", 4: "b", 5: "a", 6: "r", [[PrimitiveValue]]: "foo bar", length: 7, charAt: function, toString: function}