首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组原型toString()与对象toString()

数组原型toString()与对象toString()
EN

Stack Overflow用户
提问于 2015-11-17 23:36:40
回答 2查看 2K关注 0票数 1
代码语言:javascript
复制
var d = [];
console.log(typeof d); // weird!
console.log(d.toString()); //Prints nothing since there are no elements in the array
console.log(Object.prototype.toString.call(d)); // better!

当我在第一个console.log打印对象上面运行代码时,这是预期的,因为数组是一个对象,第二个console.log打印对象数组。我对Object.prototype.toString.call(d)是如何工作的感到有点困惑。

因此,我知道数组原型上的toString方法只是试图打印数组中的元素。但是,当您在基本对象的原型上调用toString方法时,该toString方法到底做了什么呢?它是否也尝试打印数组的元素?此外,基对象上的toString方法是否使用关键字this,因为我们使用的是.call,这将在调用函数时更改该关键字所指向的内容。

EN

回答 2

Stack Overflow用户

发布于 2015-11-17 23:47:27

Object.prototype.toString是所有其他对象继承的.toString()的基本实现,除非它们专门覆盖.toString()。它的默认实现是生成如下所示的输出:

代码语言:javascript
复制
"[object Type]"

其中typeObjectArray等.因此,对于普通的JS对象,它将生成:

代码语言:javascript
复制
 "[object Object]"

对于阵列来说,它会产生:

代码语言:javascript
复制
 "[object Array]"

同时,数组类重写.toString()以提供数组内容的连接。

因此,如果您有一个数组或可能有一个数组对象,并且您想要的是第一种类型的.toString(),那么您可以调用:

代码语言:javascript
复制
Object.prototype.toString.call(obj)

这将告诉您是否有数组对象。如果它是一个数组,您将得到:

代码语言:javascript
复制
"[object Array]"

除了较新的Array.isArray()之外,通常认为这是判断对象是否为数组的最佳方法。

下面是一个工作片段,说明:

代码语言:javascript
复制
var obj = {greeting: "hello"};
var arr = [1,2,3];

log(obj.toString());
log(Object.prototype.toString.call(obj))

log(arr.toString());
log(Object.prototype.toString.call(arr))

function log(x) {
    var div = document.createElement("div")
    div.innerHTML = x;
    document.body.appendChild(div);
}

票数 1
EN

Stack Overflow用户

发布于 2015-11-18 00:14:37

JavaScript中的数据类型检测可以改进。这是绝对有可能的领域之一。不过,公平地说,这可能是因为JavaScript是在11天内创建的,它是处理DOM的基本运行时;而且它是这样做的!因此,只有在特殊情况下,我才需要这样做。

此外,JavaScript面向非常简化的类系统(称为原型系统),这使得强制成为一种典型的实践。因此,为了向任何数据类型提供方法和属性,它们临时强制使用对象类型。这是该方法的基本方面之一。因此,以及宿主对象(如元素)没有构造函数接口或标准这一事实基本上解释了数据类型的情况。(当然,我们也有内置的和本地人,如DateMath等)

再说一次,JavaScript仍然做它想要做的事情,特别是在情况下,但是肯定可以改进!

我这样想:

  • typeof:原语
  • Object.prototype.toString:对象(和原语)

这里有一个很好的资源来解释JavaScript的数据类型检测:http://tobyho.com/2011/01/28/checking-types-in-javascript/

但这是我发现的例行公事,适用于我所需要的每一种情况。所选择的操作顺序和方法已针对速度进行了具体的优化。(FYI,您的用例可能各不相同,所以某些订单最好进行切换,但总体上会很好:):

代码语言:javascript
复制
type = type || 
(   function detect( coerce )
    {   
        if (typeof data === 'string')
            return (coerce=document.getElementById(data)) ? (data=coerce,'element') : 'string';

        if (data.type && (data.srcElement||data.target))
            return 'event';

        if (data.nodeType != void 0)
            return 'element';

        if (data[0] != void 0 && data[0].nodeType != void 0)
            return 'elements';

        if (Object.prototype.call(data) === '[object Array]')
            return 'array';

        if (data/1 === data)
            return 'number';

        return 'object';
    }
)();

既然你提到了Array Prototype,我的直觉就是告诉你:“请不要修改阵列原型。”(通过迭代和名称空间,它可能导致环境变得不稳定。)

其他人似乎也提供了丰富的信息!好的!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33769155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档