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,这将在调用函数时更改该关键字所指向的内容。
发布于 2015-11-17 23:47:27
Object.prototype.toString是所有其他对象继承的.toString()的基本实现,除非它们专门覆盖.toString()。它的默认实现是生成如下所示的输出:
"[object Type]"其中type是Object,Array等.因此,对于普通的JS对象,它将生成:
"[object Object]"对于阵列来说,它会产生:
"[object Array]"同时,数组类重写.toString()以提供数组内容的连接。
因此,如果您有一个数组或可能有一个数组对象,并且您想要的是第一种类型的.toString(),那么您可以调用:
Object.prototype.toString.call(obj)这将告诉您是否有数组对象。如果它是一个数组,您将得到:
"[object Array]"除了较新的Array.isArray()之外,通常认为这是判断对象是否为数组的最佳方法。
下面是一个工作片段,说明:
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);
}
发布于 2015-11-18 00:14:37
JavaScript中的数据类型检测可以改进。这是绝对有可能的领域之一。不过,公平地说,这可能是因为JavaScript是在11天内创建的,它是处理DOM的基本运行时;而且它是这样做的!因此,只有在特殊情况下,我才需要这样做。
此外,JavaScript面向非常简化的类系统(称为原型系统),这使得强制成为一种典型的实践。因此,为了向任何数据类型提供方法和属性,它们临时强制使用对象类型。这是该方法的基本方面之一。因此,以及宿主对象(如元素)没有构造函数接口或标准这一事实基本上解释了数据类型的情况。(当然,我们也有内置的和本地人,如Date、Math等)
再说一次,JavaScript仍然做它想要做的事情,特别是在情况下,但是肯定可以改进!
我这样想:
typeof:原语Object.prototype.toString:对象(和原语)这里有一个很好的资源来解释JavaScript的数据类型检测:http://tobyho.com/2011/01/28/checking-types-in-javascript/
但这是我发现的例行公事,适用于我所需要的每一种情况。所选择的操作顺序和方法已针对速度进行了具体的优化。(FYI,您的用例可能各不相同,所以某些订单最好进行切换,但总体上会很好:):
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,我的直觉就是告诉你:“请不要修改阵列原型。”(通过迭代和名称空间,它可能导致环境变得不稳定。)
其他人似乎也提供了丰富的信息!好的!
https://stackoverflow.com/questions/33769155
复制相似问题