《JavaScript启示录》——1.13 如何存储或复制复杂值

1.13 如何存储或复制复杂值

复杂值是通过引用进行存储和操作的,理解这一点相当重要。创建一个包含复杂对象的变量时,其值是内存中的一个引用地址。引用一个复杂对象时,使用它的名称(即变量或对象属性)通过内存中的引用地址获取该对象值。当考虑试图复制一个复杂值时会发生什么事的时候,这就非常重要了。下面创建一个对象,并将它保存在变量myObject中,然后将myObject中的这个值复制到变量copyOfMyObject中。实际上,这并不是复制对象,更像是复制对象的地址。

<!DOCTYPE html><html lang="en"><body><script>

var myObject = {};
var copyOfMyObject = myObject; //没有复制值,而是复制了引用

myObject.foo = 'bar'; // 操作myObject中的值

/* 现在如果输出myObject和copyOfMyObject,则均会输出foo属性,因为它们引用的是同一个对象*/
console.log(myObject, copyOfMyObject); /* 输出 'Object { foo="bar"}
                                       Object { foo="bar"}' */

</script></body></html>

我们必须认识到的是,与复制值的原始值不同,对象(也称为复杂值)是通过引用进行存储的。因此,复制的是引用(也称为地址),而不是实际的值。这意味着根本就没有复制对象。就像我说过的,复制的是内存堆栈中对象的地址或引用。在代码示例中,myObject和copyOfMyObject都指向存储于内存中的同一个对象。

这里的重点是,当更改复杂值时,所有引用相同地址的变量的值都会被修改,因为复杂值是通过引用进行存储的。在上述代码示例中,更新myObject和copyOfMyObject中任何一个变量中的值,两者都会被更改。

注意

  • 使用new关键字创建String()、Number()和Boolean()值时,或者这些值在幕后被转换成复杂对象时,值依然是按照值进行存储/复制的。因此,即使原始值可以被看做是复杂值,它们也不具备通过引用进行复制的特性。
  • 若要真正地复制一个对象,必须要从旧的对象中提取值,并将提取的值注入新对象。
时间: 2024-07-29 14:16:51

《JavaScript启示录》——1.13 如何存储或复制复杂值的相关文章

《JavaScript启示录》——1.9 如何存储和复制原始值

1.9 如何存储和复制原始值 原始值在"面值(face value)"中的存储和操作,理解这一点相当重要.这可能听起来很简单,但是这意味着如果将字符串值"foo"存储在myString变量中,那么从字面上讲,"foo"值同样存储于内存中.为什么了解这个知识很重要?因为一旦开始操作(即复制)值,我们就必须了解它,因为原始值是真实值复制. 在下面的示例中,我们在变量myStringCopy中存储了myString值('foo')的一个副本,其值是真实

《JavaScript启示录》——导读

前言 本书无关于JavaScript设计模式,也无关于JavaScript面向对象代码实现.本书的写作目的也不是鉴别JavaScript语言特点的好坏.本书并不是一本完整的参考指南.它面向的读者人群并不是编程新手或对JavaScript完全陌生的人员.同时,它也不是一本JavaScript攻略手册.关于上述这些方面的书籍都已经面世. 本书的撰写意图是通过考察原生JavaScript对象和不同环境对原生对象的支持的细微差别,来给读者展现准确的JavaScript世界观:复杂值.原始值.作用域.继承

javascript 密码框防止用户粘贴和复制的实现代码

 本篇文章主要是对javascript 密码框防止用户粘贴和复制的实现代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 <input id="password" type="password" onpaste="return false" onselectstart="return false" />   onpaste="return false":防止粘贴   onselects

javascript-jsp 在JavaScript存储session和取值

问题描述 jsp 在JavaScript存储session和取值 alert(rec.platformName); 能得到值 '<%=session.setAttribute("platformName",rec.platformName)%>';这个就不能保存了 解决方案 JSP获得JS数据一定要提交以后才能获得,JS获得JSP数据可以直接获得 .拼个form表单提交,然后获取值就行 解决方案二: onSelect: function(rec){ 在这里得到platfor

JavaScript实现基于Cookie的存储类实例_javascript技巧

本文实例讲述了JavaScript实现基于Cookie的存储类.分享给大家供大家参考.具体分析如下: 通过这个JS类,你可以象使用session一样使用cookie,非常简单了! /* * CookieStorage.js * 本类实现像localStorage和sessionStorage一样的存储API * 不同的是,它是基于HTTP Cookies实现的. */ function CookieStorage(maxage, path) { // 两个参数分别代表储存有效期和作用域 // 获

《JavaScript启示录》——1.2 JavaScript构造函数构建并返回对象实例

1.2 JavaScript构造函数构建并返回对象实例 构造函数的作用是创建多个共享特定特性和行为的对象.构造函数主要是一种用于生成对象的饼干模具,这些对象具有默认属性和属性方法. 如果说"构造函数只是一个函数",那么我会说"你是对的,除非使用new关键字来调用该函数."(如new String('foo')).如果使用new调用某函数,该函数则担任一个特殊的角色,JavaScript给予该函数特殊待遇,将该函数的this值设置为正在构建的新对象.除了这个特殊行为,

javascript数组与php数组的地址传递及值传递用法实例_php技巧

本文实例讲述了javascript数组与php数组的地址传递及值传递用法.分享给大家供大家参考.具体如下: javascript数组为地址传递/引用传递,而php数组为值传递 实例代码如下: 复制代码 代码如下: <?php $arr = array(3,9,4); function test($arr){  $arr[0] = 30; } test($arr); foreach($arr as $val){  echo $val." "; } ?> <script

图片-怎样用JavaScript 关联多个select列表,使取得值相同

问题描述 怎样用JavaScript 关联多个select列表,使取得值相同 当选择select列表1的值时,select列表2和列表3自动选择为列表1的值 请问怎么 实现啊 求帮助啊 好心人们 解决方案 思路:1.的onchange的方法中迭代2,3当2,3的值等于选中一的之后给该option 添加checked 解决方案二: 直接给1添加个change的事件,然后在事件里面动态设置2,3选中1的值即可. //jq: $("#select1").change(function(){

JavaScript设置、获取、清除单值和多值cookie的方法_javascript技巧

废话不多说了,直接给大家贴代码了. 具体代码如下: var CookieUtil = (function () { var Cookie = function () { // 获取单值cookie this.get = function(name) { var start = document.cookie.indexOf(encodeURIComponent(name)) ; var end = document.cookie.indexOf(';', start) ; if(end == -