當我使用unit.js
庫時,我使用名稱爲"must"
的屬性克隆簡單的JSON對象時,發現了一個奇怪的行爲。見例如:當使用unit.js庫時,克隆對象的工作很奇怪
var test = require("unit.js"); // delete this line and the result will be good
var input = {
"parameter": "value",
"must": {
"parameter_in": "value_in"
}
};
console.log("Input: " + JSON.stringify(input, undefined, 2));
var result = clone(input);
console.log("Result: " + JSON.stringify(result, undefined, 2)); // no "must" element
console.log("Result (must): " + JSON.stringify(result.must, undefined, 2));
function clone(obj) {
var copy;
// Handle the 3 simple types, and null or undefined
if (null == obj || "object" != typeof obj) return obj;
// Handle Date
if (obj instanceof Date) {
copy = new Date();
copy.setTime(obj.getTime());
return copy;
}
// Handle Array
if (obj instanceof Array) {
copy = [];
for (var i = 0, len = obj.length; i < len; i++) {
copy[i] = clone(obj[i]);
}
return copy;
}
// Handle Object
if (obj instanceof Object) {
copy = {};
for (var attr in obj) {
if (obj.hasOwnProperty(attr)) copy[attr] = clone(obj[attr]);
}
return copy;
}
throw new Error("Unable to copy obj! Its type isn't supported.");
}
結果:
Input: {
"parameter": "value",
"must": {
"parameter_in": "value_in"
}
}
Result: {
"parameter": "value"
}
Result (must): {
"parameter_in": "value_in"
}
的JSON.stringify
不打印的result
的must
屬性,但它是在克隆的對象,因爲JSON.stringify
正在爲result.must
。如果我刪除了unit.js
行,一切都很好。 (我使用[email protected])
這是什麼原因,unit.js是否在Object.prototype中添加了一些東西?不管它是什麼,它是一種保護我們的應用程序免受這種錯誤的方式嗎?非常奇怪的是,第三方庫可能導致這樣的錯誤。
任何幫助,將不勝感激!
Ps .:我使用了How do I correctly clone a JavaScript object?中建議的克隆函數,但它也與lodash的cloneDeep
方法相同。
更新:
我已經嘗試了一些更多的查詢:使用for in
,in
,hasOwnProperty
在result
:
console.log("\"must\" is in: " + ('must' in result));
console.log("\"must\" is with hasOwnProperty: " + result.hasOwnProperty("must"));
console.log("In properties:");
for (var property in result){
console.log("\tproperty: " + property);
}
結果與unit.js
:
"must" is in: true
"must" is with hasOwnProperty: true
In properties:
property: parameter
所以must
屬性沒有隻出現在for in
循環中。