JavaScript给输入赋值引起的基本类型值和引用类型值的问题
我在自己做事情的时候遇到了一个问题。以博客公园首页右侧的搜索为例,使用控制台进行操作。
现在我需要将数据从另一个地方发送到input,这样它一刷新就能显示数据。
这并不难,所以我按照我的理解去做了。
代码如下:
此时,id为zzk_q的值应该是一个测试,即测试应该显示在输入框中。但结果是。
咦,怎么没变?这是不对的。我试了一遍又一遍,但还是不行。当然,代码基本相同。突然想起以前遇到过这样的问题,仔细回忆了一下当时的解决方法(当时好像没看懂,只是找到了解决方法,就通过了)。现在,我试一试,代码如下:
看看结果:
就变成了这一次。第一次遇到这个问题的时候,没有仔细思考过。当我成功时,我跳过了它。但这次我开始怀疑为什么?为什么呢?这是怎么发生的?我无法理解。然后自己翻来覆去,还是想不通。同样的任务。有什么区别?有什么区别?后来才知道是值类型和引用类型,当然是别人给我指出来的(……)。
然后我去这一带找东西,发现我见过,可汗。
自从Javascript在1997年标准化以来,它已经定义了六种基本类型。在ES6之前,JS程序中的任何值都属于以下类型之一。
未定义空布尔值数字字符串对象
但是,ES6增加了另一种基本类型:符号类型。这个我不太了解,就不讨论了。等以后熟悉了再说。我需要重新学习。
在JavaScript变量中,有两种类型的值:基本类型和引用类型。基本类型值(也称为值类型)是一个简单的数据段,它由值访问并对其中的值进行操作。和引用类型值、值、可能由多个值组成的对象。赋值时,解释器必须确定该值是基本类型还是引用类型。
基本数据类型有:未定义、空、布尔、数字和字符串。引用类型是存储在内存中的对象,即对象,它是方法和属性的组合。
1.类型值的动态属性。
这是参考类型:
var person=new Object();person.name=' fooconsole . log(person . name);//food elete person . name;在本例中,console . log(person . name)://undefined,我们首先创建一个空对象,然后将其保存在person变量中,然后向该对象添加一个属性名,并为该属性分配一个字符串“foo”,然后将其输出。我们可以看到字符串foo被输出,然后我们删除这个属性并输出undefined。这些表明,我们可以动态地向对象添加属性和方法,除非对象被销毁或属性被删除,否则这些属性和方法将一直存在。
这是基本类型:
var name=' fooname.age=22console . log(name . age);//undefined在这种情况下,我们在一个name变量中保存一个字符串‘foo’,然后给它添加一个属性age,赋值22,然后输出,就像我之前想的那样,输出是22,但是实际情况是undefined。
这个值是否可以理解为基本类型是不可变的,而引用类型可以动态改变。
2.复制变量值。
如上所述,基本类型是通过值访问的。至于引用类型,与其他语言不同,JavaScript允许直接访问内存中的位置,这意味着我们不能直接操作对象的内存空间,那么我们该怎么办呢?当操作一个对象时,它实际上是对被操作对象的引用,引用类型的值是根据被引用对象来访问的。引用类型的存储需要栈内存和堆内存,栈内存在堆内存中存储变量标识符和指向对象的指针,也可以说是对象在堆内存中的地址。
先看例子:
var num 1=5;var num2=num1//5nu m1=1;//6 num m2;//5要将基本类型值从一个变量复制到另一个变量,我们将在变量对象上重新创建一个新值,然后将该值复制到新变量分配的位置。这两个值完全相反,对这两个变量的其他操作不会相互影响。它们应该保存在堆栈内存中,如下图所示:
查看引用类型:
var obj1=新对象();var obj2=obj1obj 1 . name=' foo ';console . log(obj 2 . name);//foo obj 2 . age=22;console . log(obj 1 . age);//22将引用类型的值从一个变量复制到另一个变量时,该值的副本也将放在新的空间中。然而,如上所述,引用类型的存储需要堆栈内存和堆内存。这个值实际上是一个指针,这个指针指向一个存储在堆中的对象。在复制操作之后,这两个变量实际上是同一个指针,也就是说,它们引用同一个对象。因此,如果一个变量改变,另一个变量也会改变。下图:
参见JavaScript高级编程。
这个一理清,我们就对最初的问题有了一些了解。对于初始错误,在开始时,我们得到input的值(此时为空),将其复制到title,然后通过更改title来更改input的值。但输入的值(可视为变量)是基本类型。复制后,两者完全独立,互不影响。此外,如果成功,取出值,首先将输入(对象)复制到标题中,然后将value属性添加到标题中并赋值。这时,两者指向同一个对象,改变其中一个也会影响另一个。对,就是这样。
虽然很多知识都是从书上或者其他地方读过一遍或者多遍,但是真正遇到的时候感觉很奇怪。这是怎么发生的?那你自己去找吧。被别人发现或指出后,才发现我以前见过这个,有的甚至自己解决了(不能说我解决了,只能说我没有深入,没有完全理解)。也有一些大学忘记了7788的基础(没学好)。甚至搜索了堆栈内存和堆内存。好吧,既然你已经决定走这条路,那就好好学习吧。
最后:
好好编码,天天向上!PS:(集合的赋值不同于引用类型和基本数据类型的赋值)一个简单的java问题。
span style=' white-space : pre '/spanListPeer list=new arrayListPeer();span style=' white-space : pre '/span person PP=new person();span style=' white-space : pre '/span list . add(PP);span style=' white-space : pre '/spanpp . setivalue(12);span style=' white-space : pre '/spanpp . setivalue(20);span style=' white-space : pre '/spanpp=null;span style=' white-space : pre '/spant b=0;span style=' white-space : pre '/spant a=b;span style=' white-space : pre '/span b=8;span style=' white-space : pre '/SPan SYStem . out . println(a);span style=' white-space : pre '/span for(person PPP : list){ span style=' white-space : pre '/span PPP . GetVaLue();span style=' white-space : pre '/span } span style=' white-space : pre '/span添加对象后不能更改列表,但可以修改对象中的属性值。
不能更改简单字符串中的值。
结果:
11 8888
记住:最好还是正常书写,以免混淆。
版权声明:JavaScript给输入赋值引起的基本类型值和引用类型值的问题是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。