尝试为文档正文设置背景颜色,我很疑惑为什么以下代码不起作用(在Chrome中测试):
var a = 'blue';
var b = document.getElementById('body').style.backgroundColor;
b = a; // Not working.
虽然这样可行但
var a = 'blue';
var b = document.getElementById('body').style;
b.backgroundColor = a; // works.
,这也有效:
document.getElementById('body').style.backgroundColor = 'blue'; //works
有人可以解释为什么第一个版本不起作用吗?
答案 0 :(得分:1)
var b = document.getElementById('body').style.backgroundColor;
像吸气剂一样行动并返回具有身体ID的元素的背景颜色。它没有像你想象的那样握住它的指针。因此b
将包含类似purple
的字符串或您设置的任何颜色。
然后您正在执行b = a;
,只会使用b
的值覆盖a
的值。
答案 1 :(得分:1)
这是经典指针用户错误。我多次犯了这个错误。
var a = 'blue';
var b = document.getElementById('body').style.backgroundColor;
b = a; // Not working.
上述代码不起作用,因为document.getElementById('body').style.backgroundColor
的值被复制到标识符b
。当您使用b
的值重新分配a
时,您不会重新分配document.getElementById('body').style.backgroundColor
的值。
这就是为什么thiis代码有效:
var a = 'blue';
var b = document.getElementById('body').style;
b.backgroundColor = a; // works.
因为您要将style
的值保存到标识符b
。 b
复杂类型。现在,当您重新分配b.style
时,您还会重新分配document.getElementById('body').style
,因为标识符b
与document.getElementById('body').style
保持相同的引用。
让我试着打破这一点:
在javascript(以及许多其他语言)中,当您将复杂类型(即对象或数组)分配给标识符时,您实际上正在为"某些内容"在记忆中。您可以将标识符的值视为"地址"而不是保持复杂类型的所有值,并且当您尝试使用obj.prop
语法从标识符中提取值时,您实际上是在告诉程序转到该地址并获取所需的值。
因此,如果有任何财产,那么"某事物"更改,引用(又称指针)也将反映这种变化:
const complexType = {
a: 'something'
}
const x = complexType;
const y = complexType;
console.log(`from x: ${x.a}`);
console.log(`from y: ${y.a}`);
complexType.a = 'something else';
// notice how they change
console.log(`from x again: ${x.a}`);
console.log(`from y again: ${y.a}`);

相比之下,简单/原始类型总是在赋值时复制。这意味着标识符保留完整值而不是保存地址。这意味着无论何时为简单/原始值分配标识符,即使更改原始值,该值也将持久化。
// original value
let simpleType = 'something';
let a = simpleType;
let b = simpleType;
console.log(`from a: ${a}`);
console.log(`from b: ${b}`);
// re-assign
simpleType = 'something else';
// notice how they *don't* change
console.log(`from a again: ${a}`);
console.log(`from b again: ${b}`);

总而言之,document.getElementById('body').style.backgroundColor
返回一个简单类型。这个简单类型在赋值时被复制。这就是为什么你不能这样做的原因:
var a = 'blue';
var b = document.getElementById('body').style.backgroundColor;
b = a; // Not working.
希望有所帮助!