JavaScript中除了簡單數(shù)據(jù)類型(包括數(shù)字、字符串塞椎、布爾值受葛、null值和undefined值)外的其他所有值都是對(duì)象报腔。
JavaScript中的對(duì)象是無類型的(class-free)巫俺,也就是對(duì)新的屬性名和屬性值沒有限制认烁。
對(duì)象通過引用來傳遞,永遠(yuǎn)不會(huì)被復(fù)制介汹。
比如:
//example 1
let originArray = new Array(0, 1, 2);
let newArray = originArray; //對(duì)象引用
originArray[0] = 9;
console.log('originArray', originArray);
console.log('newArray', newArray);
打印的結(jié)果是
example 1
//example 2
let a = {}, b = {}, c = {};
a却嗡、b、c每個(gè)的引用都是一個(gè)不同的空對(duì)象嘹承。
//example 3
let a = b = c = {};
a稽穆、b、c都引用的是同一對(duì)象赶撰。
對(duì)于非對(duì)象的數(shù)據(jù)是可以復(fù)制的,不存在引用柱彻。
//example 4
let originString = 'abc';
let newString = originString;
originString = 'def';
console.log('originString', originString);
console.log('newString', newString);
打印結(jié)果是
example 4
下面再來看一個(gè)列子:
//example 5-1
let data = {a: 1, b: [0, 1, 2]};
let dataOne = data;
function change(dataTwo) {
dataTwo['c'] = 5;
console.log('dataTwo', JSON.stringify(dataTwo));
}
change(dataOne);
console.log('dataOne', JSON.stringify(data));
console.log('data', JSON.stringify(data));
這樣的情況下豪娜,打印的結(jié)果是
example 5-1
但是對(duì)象引用賦值后,如果將對(duì)象置空哟楷,相互不受影響瘤载。
//example 5-2
let data = {a: 1, b: [0, 1, 2]};
let dataOne = data;
function change(dataTwo) {
dataTwo['r'] = 5;
dataTwo = null;
console.log('dataTwo', JSON.stringify(dataTwo));
}
change(dataOne);
console.log('dataOne', JSON.stringify(data));
console.log('data', JSON.stringify(data));
example 5-2
最近在項(xiàng)目中遇到一個(gè)這樣的問題,所以才引起了我對(duì)Refrence的反思卖擅。
const defaultPromo= {
code: '',
isValid: null
};
const defaultDiscounts = {
discount1: defaultPromo,
discount2: defaultPromo
};
const promoCodes = {
discount1: {
code: "inValid",
isValid: false
},
discount2: {
code: "79315",
isValid: true
}
};
const result = _.merge(defaultDiscounts, promoCodes);
result 會(huì)是什么呢鸣奔?是這樣嗎墨技?
{
discount1: {
code: "inValid",
isValid: false
},
discount2: {
code: "79315",
isValid: true
}
}
?????????其實(shí)是這樣的:
{
discount1: {
code: "79315",
isValid: true
},
discount2: {
code: "79315",
isValid: true
}
}
在這種情況下,就需要使用clone或者使用...
const defaultPromo= {
code: '',
isValid: null
};
const defaultDiscounts = {
discount1: {... defaultPromo},
discount2: {...defaultPromo}
};
const promoCodes = {
discount1: {
code: "inValid",
isValid: false
},
discount2: {
code: "79315",
isValid: true
}
};
const result = _.merge(defaultDiscounts, promoCodes);