【发布时间】:2013-05-01 18:04:25
【问题描述】:
所以我有一个简单的 isPlainObject 方法用于测试 JavaScript 对象字面量:
var isPlainObject = function (obj) {
return typeof obj === "object" && {}.toString.call(obj) === "[object Object]";
};
现在我有一个普通的对象:
var obj = {'one': 1, 'two': 2, 'three': 3};
当我通过isPlainObject(obj) 函数运行它时,它按预期工作并返回true。我的问题来自向对象的原型添加属性:
obj.constructor.prototype.four = 4;
现在,当我在 obj 上运行 isPlainObject(obj) 时,它会返回 false。 typeof obj 在这两种情况下都返回 object。在我向原型添加属性后,toString 在第二个实例中返回 [object Number]。
究竟发生了什么改变obj?怎么回事?
编辑: 只有在 QUnit 函数调用范围内进行测试时才会发生这种情况。
test("each", function() {
_.each([1, 2, 3], function(i,v) {
equal(v, i + 1, 'each iterator provided index and value from array');
});
var obj = {'one': 1, 'two': 2, 'three': 3};
console.log(_.isPlainObject(obj)); // => true
obj.constructor.prototype.four = 4;
console.log(_.isPlainObject(obj)); // => false
});
编辑:
这是我在isPlainObject 中记录arguments 类数组对象时得到的console.log。
查看日志似乎表明该数组现在有两个参数。但长度仍为1。
【问题讨论】:
-
您使用的是什么(奇怪的)浏览器? It shows
truefor me...? -
对我来说也是如此。
typeof obj和{}.toString.call(obj)会为您返回什么? -
这个问题似乎表明缺乏研究工作。您的功能有几个部分;您是否调查过哪个部分的行为与您的预期不同? (
typeof obj现在是什么?{}.toString.call(obj)现在返回什么?) -
你不应该修改
Object.prototype! (obj.constructor.prototype是)。不过,不确定这会如何影响您的功能。 -
您需要为每个循环检查
object.hasOwnProperty(prop)(例如types.hasOwnProperty(d))或,更好的是,永远不要修改 Object.prototype!(!!)(说真的!这就是你为什么不这样做的原因!)投票结束过于本地化,尽管它可能与另一个“修改后的Object.prototype,现在for..in不起作用”的问题。
标签: javascript qunit