Javascript如何从数据对象中删除原型方法或使对象使用Qunit equals
我已经开始与Qunit合作对我的代码进行单元测试,但在比较对象时遇到了突出的问题 我正在测试的代码动态创建一个对象:Javascript如何从数据对象中删除原型方法或使对象使用Qunit equals,javascript,jquery,qunit,Javascript,Jquery,Qunit,我已经开始与Qunit合作对我的代码进行单元测试,但在比较对象时遇到了突出的问题 我正在测试的代码动态创建一个对象: var fields = ['id','name']; var result = {}; for (var field in fields) { var name = fields[field]; result[name] = name; } var expected = { id : 'id', name : 'name' }; test(expected,
var fields = ['id','name'];
var result = {};
for (var field in fields)
{
var name = fields[field];
result[name] = name;
}
var expected = { id : 'id', name : 'name' };
test(expected, result, "same ?");
这个测试失败了,我可以看到,虽然expected只包含id和name字段,但result还包含大量函数,例如
"function (iterator, context) {...
我认为这些函数来自于我将对象当作数组来分配给它
有没有办法去掉这些函数(或者从一开始就防止它们被添加)
我在考虑做什么
result = $.parseJSON($.toJSON(result));
有更好的方法吗?您可以检查集合中每个对象的类型,看看它是否是函数:
if(typeof fields[field] == 'function') continue;
另外,不要在数组上的中为..使用:
for(var i = 0; i < fields.length; i++) {
result[result[i]] = result[i];
}
for(变量i=0;i
严格来说,这里的对象不是一个对象,而是一个数组
对象,尽管如此,它仍然是一个对象,但并不是说它有键值对
如果您使用普通的for
循环,您将不会像使用for..in
那样迭代原型链,因此这样做可能会解决您的问题。问题在于您使用for..in
,它迭代字段继承自对象的所有内容。如果必须在
中为…保留
,则可以这样修改它:
for (var field in fields){
if( fields.hasOwnProperty( field ) ){
var name = fields[field];
result[name] = name;
}
}
hasOwnProperty
如果对象(且数组是对象)的指定属性未继承,则返回true。不应在数组中使用。的第6章提供了一个很好的解释:
因为JavaScript的数组实际上是
对象,则可以在
语句中使用
用于迭代所有
数组的属性。不幸的是,
for in
不保证
属性的顺序,以及
数组应用程序需要元素
按数字顺序生产。
此外,还有一个问题
正在挖掘意外的属性
来自原型链。
对于
循环,请使用传统的C样式。如果可能的话,我不想重写qunit的equals函数。然后,唯一的另一种使用方法是迭代,如果它是一个函数,则删除结果[name],但我认为会有一种更干净的方法。总是有hasOwnProperty()
(我并不宽恕它的使用):)我忘了提到我使用的是jquery和原型库,不确定这些是否是附加对象属性的原因。这与jQuery或Prototype无关。JavaScript的本机for in
构造将挖掘每个对象属性,包括继承的属性。对于阵列,如果仅在阵列元素之后,请始终使用常规的For
循环。