我有以下代码:
function show(){
var a=document.getElementById('somediv').style.display;
a="block";
}
上面的代码不起作用,如果我们使用它就可以了
{
var a=document.getElementById('somediv');
a.style.display="block";
}
上面的代码有什么问题?
我有以下代码:
function show(){
var a=document.getElementById('somediv').style.display;
a="block";
}
上面的代码不起作用,如果我们使用它就可以了
{
var a=document.getElementById('somediv');
a.style.display="block";
}
上面的代码有什么问题?
要理解这一点,您需要了解一点关于 javascript 分配的知识。
当您使用 = 运算符时,javascript 中有两种类型的赋值:按值赋值和按引用赋值。虽然某些语言让您可以选择在任何给定时间使用哪种类型的作业,但 javascript 并没有给您选择。它对何时使用每个规则都有一套严格的规则。
“按值赋值”意味着将特定值(如数字3
或字符串"none"
)分配给另一个变量。
“通过引用赋值”意味着指向另一个变量的指针被放置到您的新变量中,并且对该对象内容的任何编辑都将反映在这两个位置。
对于字符串、数字和布尔值等简单类型,javascript 总是使用按值赋值。对于像数组和对象这样的类型,javascript 总是通过引用进行赋值。这意味着当你这样做时:
var a=document.getElementById('somediv').style.display;
由于display
属性中的值是一个字符串,javascript 将使用按值赋值,并将display
属性中字符串的值复制到a
变量中。一旦制作了这个副本,该变量就与该属性a
没有任何关系。display
您可以完全独立地更改display
属性,a
因为它们每个都有自己的字符串副本。
所以,当你这样做时:
a="block";
您只是为变量分配了一个新字符串,因为它与先前的属性a
无关。display
另一方面,当你这样做时:
var a=document.getElementById('somediv');
您将一个对象分配给a
. 而且,javascript 总是通过引用分配对象。这意味着它a
有一个指向somediv
对象的指针。没有副本,它们都指向完全相同的对象。因此,您对任一引用所做的任何更改实际上都会更改同一个对象。所以,当你这样做时:
a.style.display="block";
您正在更改实际的 DOM 对象。
我记得的规则是数字、字符串和布尔值等简单类型在分配时会被复制(按值分配)。像数组和对象这样的复杂类型不会被复制,只有指向原始对象的指针被放入新变量(通过引用分配),因此它们都指向完全相同的对象。
按值赋值非常简单。通过引用分配可能既强大又偶尔令人困惑,从而导致软件中的错误无法预料到真正引用原始文件的后果。因此,如果您想要一个对象的实际副本,则必须显式地制作该对象的副本,因为赋值不会为您做到这一点。另一方面,只要您了解它的工作原理,拥有可以传递的复杂对象的引用会非常有用。在 javascript 中,无法获取对数字、字符串或布尔值等简单类型的引用。它可以放入一个对象(作为一个属性),然后您可以传递对该对象的引用,但不能传递对简单类型的引用。
这里有一些例子:
// define person
var person = {height: 66, hair: "blonde"};
// assign the person object to bob
// because person is an object, the assignment is by reference
var bob = person;
// change bob's hair
bob.hair = "red";
// because assignment was by reference, person and bob are the same
// object so changing one changes the one original
alert(person.hair); // red
// define person
var person = {height: 66, hair: "blonde"};
// assign the person's height to a variable
// because height is a number, the assignment is by value (e.g. it's copied)
var myHeight = person.height;
// change both heights
myHeight = 72;
person.height = 60;
// because assignment was by value, myHeight and person.height are
// completely separate copies so changing one does not affect the other
alert(myHeight); // 72
alert(person.height); // 60
是=
赋值运算符。您正在将某些内容放入变量中。在第一种情况下,您设置a
为 的值display
。这是一个等于block
或none
等的字符串。
在第二种情况下,您设置a
为 object somediv
。然后在其上设置显示属性。
第一种情况不起作用,因为您的代码说:设置字符串的显示属性。字符串没有显示属性,因此失败。这就像在说:
'foobar'.style.display = 'none'
你写错了函数的拼写。根据您的代码document.getElementById('somediv').style.display
返回 div 的当前显示状态,因此设置显示块会出错。
您将像这样直接设置 div 显示属性
function show(){
var a=document.getElementById('somediv').style.display="block";
}