# assignMergeValue
# Description
和 assignValue 类似,将 object
的 key
设置为 value
不同的是 它不会将 undefined
赋值给 object
上已有的 key
# Params
(object, key, value)
# Depend
import baseAssignValue from './baseAssignValue.js'
import eq from '../eq.js'
# Code
function assignMergeValue(object, key, value) {
if ((value !== undefined && !eq(object[key], value)) ||
(value === undefined && !(key in object))) {
baseAssignValue(object, key, value)
}
}
# Analyze
- 进入 if 代码块的条件为
value !== undefined && !eq(object[key], value)
或value === undefined && !(key in object)
value !== undefined && !eq(object[key], value)
- 传入的
value
值不为undefined
(null !== undefined) - 根据
key
从object
获取到的value
值 和 传入的value
值不相等
- 传入的
value === undefined && !(key in object)
- 传入的
value
为undefined
- 传入的
key
不在object
及其原型链上
- 传入的
- 满足 2 或者 3,会将
key
和 对应的value
设置到object
上
# Remark
- in MDN (opens new window) 如果指定的属性在指定的对象或其原型链中,则in 运算符返回 true
- Object.defineProperty() MDN (opens new window) 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。
# Example
const a = {a: 1}
a['b'] = undefined
assignMergeValue(a, 'c') // { a: 1, b: undefined, c: undefined }
assignMergeValue(a, 'c', 1) // { a: 1, b: undefined, c: 1 }
assignMergeValue(a, 'b', 'b') // { a: 1, b: 'b', c: 1 }