开玩笑使一个功能失败但没有使另一个功能失败
Jest failing one function but not another
我正在为我的编码训练营写一些日常挑战,我正在 运行 解决一个问题。我写了一个组合对象的函数,它工作正常。下面是问题提示是什么
Prompt: Write a function named mergeObjects that accepts at least two objects as arguments, merges the properties of the second through n objects into the first object, then finally returns the first object. If any objects have the same property key, values from the object(s) later in the arguments list should overwrite earlier values.
示例:
mergeObjects({}, {a: 1}); //=> {a: 1} (same object as first arg)
mergeObjects({a: 1, b: 2, c: 3}, {d: 4}); //=> {a: 1, b: 2, c: 3, d: 4}
mergeObjects({a: 1, b: 2, c: 3}, {d: 4}, {b: 22, d: 44}); //=> {a: 1, b: 22, c: 3, d: 44
我的函数
function mergeObjects(...obj) {
let obj1 = {}
obj.forEach(element => {
obj1 = {...obj1, ...element}
});
return obj1
}
求解函数
function mergeObjects1(target, ...objects) {
objects.forEach(function (obj) {
// using ES2015's 'for in' loop
for (var key in obj) {
target[key] = obj[key]
}
})
return target
}
在我看来,这两个函数提供了相同的结果。但是,当我 运行 我的代码通过他们创建的玩笑测试时,它在第一次测试中失败了。但他们提供的解决方案并没有失败。下面是笑话测试。
describe('15-mergeObjects', function () {
it('returns same object', function () {
var obj = {}
expect(mergeObjects(obj, { a: 1 })).toBe(obj)
})
it('adds additional properties', function () {
expect(mergeObjects({ a: 1, b: 2, c: 3 }, { d: 4 })).toEqual({
a: 1,
b: 2,
c: 3,
d: 4
})
})
it('merges props from left to right', function () {
expect(
mergeObjects({ a: 1, b: 2, c: 3 }, { d: 4 }, { b: 22, d: 44 })
).toEqual({ a: 1, b: 22, c: 3, d: 44 })
})
})
describe('15-mergeObjects', function () {
it('returns same object', function () {
var obj = {}
expect(mergeObjects1(obj, { a: 1 })).toBe(obj)
})
it('adds additional properties', function () {
expect(mergeObjects1({ a: 1, b: 2, c: 3 }, { d: 4 })).toEqual({
a: 1,
b: 2,
c: 3,
d: 4
})
})
it('merges props from left to right', function () {
expect(
mergeObjects1({ a: 1, b: 2, c: 3 }, { d: 4 }, { b: 22, d: 44 })
).toEqual({ a: 1, b: 22, c: 3, d: 44 })
})
})
谁能解释为什么解决方案功能通过而我的功能却没有?
虽然结果看起来相同,但两个函数略有不同。
在您的函数中,您正在创建一个 new 对象,然后向其添加所有必需的属性。
在解决方案函数中,他们向原始 target
对象添加属性,然后返回它。
两个函数返回的对象将具有相同的键和相同的值,但引用不同,因此它们在 JavaScript 中不被视为相同的对象。
测试中
expect(mergeObjects1(obj, { a: 1 })).toBe(obj)
.toBe()
检查两个对象是否相同(同一性),因此在您的函数中失败。
请注意,有一个不同的测试,.toEqual()
,它检查两个对象是否具有相同的键和相同的值(但可能有不同的引用)。您的函数将通过此测试
expect(mergeObjects1(obj, { a: 1 })).toEqual(obj)
我正在为我的编码训练营写一些日常挑战,我正在 运行 解决一个问题。我写了一个组合对象的函数,它工作正常。下面是问题提示是什么
Prompt: Write a function named mergeObjects that accepts at least two objects as arguments, merges the properties of the second through n objects into the first object, then finally returns the first object. If any objects have the same property key, values from the object(s) later in the arguments list should overwrite earlier values.
示例:
mergeObjects({}, {a: 1}); //=> {a: 1} (same object as first arg)
mergeObjects({a: 1, b: 2, c: 3}, {d: 4}); //=> {a: 1, b: 2, c: 3, d: 4}
mergeObjects({a: 1, b: 2, c: 3}, {d: 4}, {b: 22, d: 44}); //=> {a: 1, b: 22, c: 3, d: 44
我的函数
function mergeObjects(...obj) {
let obj1 = {}
obj.forEach(element => {
obj1 = {...obj1, ...element}
});
return obj1
}
求解函数
function mergeObjects1(target, ...objects) {
objects.forEach(function (obj) {
// using ES2015's 'for in' loop
for (var key in obj) {
target[key] = obj[key]
}
})
return target
}
在我看来,这两个函数提供了相同的结果。但是,当我 运行 我的代码通过他们创建的玩笑测试时,它在第一次测试中失败了。但他们提供的解决方案并没有失败。下面是笑话测试。
describe('15-mergeObjects', function () {
it('returns same object', function () {
var obj = {}
expect(mergeObjects(obj, { a: 1 })).toBe(obj)
})
it('adds additional properties', function () {
expect(mergeObjects({ a: 1, b: 2, c: 3 }, { d: 4 })).toEqual({
a: 1,
b: 2,
c: 3,
d: 4
})
})
it('merges props from left to right', function () {
expect(
mergeObjects({ a: 1, b: 2, c: 3 }, { d: 4 }, { b: 22, d: 44 })
).toEqual({ a: 1, b: 22, c: 3, d: 44 })
})
})
describe('15-mergeObjects', function () {
it('returns same object', function () {
var obj = {}
expect(mergeObjects1(obj, { a: 1 })).toBe(obj)
})
it('adds additional properties', function () {
expect(mergeObjects1({ a: 1, b: 2, c: 3 }, { d: 4 })).toEqual({
a: 1,
b: 2,
c: 3,
d: 4
})
})
it('merges props from left to right', function () {
expect(
mergeObjects1({ a: 1, b: 2, c: 3 }, { d: 4 }, { b: 22, d: 44 })
).toEqual({ a: 1, b: 22, c: 3, d: 44 })
})
})
谁能解释为什么解决方案功能通过而我的功能却没有?
虽然结果看起来相同,但两个函数略有不同。
在您的函数中,您正在创建一个 new 对象,然后向其添加所有必需的属性。
在解决方案函数中,他们向原始 target
对象添加属性,然后返回它。
两个函数返回的对象将具有相同的键和相同的值,但引用不同,因此它们在 JavaScript 中不被视为相同的对象。
测试中
expect(mergeObjects1(obj, { a: 1 })).toBe(obj)
.toBe()
检查两个对象是否相同(同一性),因此在您的函数中失败。
请注意,有一个不同的测试,.toEqual()
,它检查两个对象是否具有相同的键和相同的值(但可能有不同的引用)。您的函数将通过此测试
expect(mergeObjects1(obj, { a: 1 })).toEqual(obj)