# 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 }