`

javascript传值机制

阅读更多

应该明确一点,js中只有值传递,不存在引用传递的情况。这儿分两种情况来看,首先是基本数据类型,以Number类型为例:

var a = 2;
var b = a;
a = a + 1;
alert("a = " + a);// 打印:a = 3
alert("b = " + b);// 打印:b = 2

 

在这里var b = a,是把a的值复制一份传给了b,之后两者便是不想关的变量,来看内存中的数据存储结构(基本类型数据存在内存中栈内存中,并且占有固定的内存大小):

 栈:        

 

    a  :   3
    b  :   2

 

 

对于引用类型,js也是传值机制,只是此时传得值是对象在内存中的地址,地址值存在栈中(占固定栈内存),对象存在堆中(占有不固定内存):

var person = new Object();
function f(person){
     person.name = "大光棍";
     person.age = "20";
     person = new Object();
     person.name = "小光棍";
     person.age = "10";
}
f(person);
alert("姓名:" + person.name  + ",年龄:" + person.age );
// 打印:姓名:大光棍,年龄:20 

 

这里要注意,var声明的person是一个全局变量,而作为参数的person是一个局部变量,也就是说二者不是同一个变量,开始在栈中只有一个person变量,里面存放着对象的地址值,当调用函数的时候该变量的地址值被复制了一份存在了局部变量person中,这是栈内有两个person变量,里面存有相同的地址值,指向同一个堆对象,接着使用局部变量的地址值为对象添加了姓名年龄属性。程序继续往下走,“person = new Object();”这句话将局部变量里的地址值替换为了指向堆内另一个对象的地址值,接下来为另一个对象添加了姓名和年龄属性,此时全局变量里的地址值并没有改变。当我们掉用完函数以后,局部变量已失去作用,“alert("姓名:" + person.name  + ",年龄:" + person.age );”这句代码里的person其实是指的全局变量,因此结果会打印最初对象的属性!如果不好理解,这段代码与下面的代码其实是一个意思:

var person = new Object();
function f(p){
     p.name = "大光棍";
     p.age = "20";
     p = new Object();
     p.name = "小光棍";
     p.age = "10";
}
f(person);
alert("姓名:" + person.name  + ",年龄:" + person.age );

 我们在函数内实际上仅仅是操作了局部变量……

再看下面代码:

var person = new Object();
function f(p){
     p.name = "大光棍";
     p.age = "20";
     p = new Object();
     person.name = "小光棍";
     person.age = "10";
}
f(person);
alert("姓名:" + person.name  + ",年龄:" + person.age );
// 打印:姓名:小光棍,年龄:10

 这是不是好理解了呢……

分享到:
评论

相关推荐

    Javascript传值

    本篇主要探讨JavaScript如何实现页面间的传值。 首先,我们来看最常见的通过URL查询字符串进行传值的方式。这种方式简单直观,适用于少量不敏感的数据传递。例如,当父页面调用`window.open`或`window....

    javascript页面之间传值

    在JavaScript编程中,页面间传值是一个常见的需求,特别是在构建多窗口或框架的应用时。本实例将探讨如何在父窗口与子窗口之间有效地传递数据,以及两种实现这一目标的方法。 第一种方法是通过`window.open()`函数...

    基于mvc计算球体体积表面积

    开发者可能还会利用图形库(如OpenGL或Unity)来创建可交互的3D球体,以及JavaScript或jQuery来处理DOM(文档对象模型)更新和事件监听。 总的来说,这个项目结合了计算机科学基础概念(如MVC架构、几何计算)和...

    swift 与 javascript 之间的相互调用及传值

    Swift与JavaScript之间的相互调用和传值是实现跨平台交互的关键技术。通过WKWebView组件,开发者能够在iOS应用中无缝集成JavaScript功能,实现动态内容加载、网页交互等功能。同时,通过WKUserContentController和...

    javascript静态页面传值的三种方法

    【JavaScript静态页面传值的三种方法】 在网页开发中,我们经常需要在不同的页面之间传递数据,尤其是在没有服务器端交互的静态页面中。JavaScript提供了多种方法来实现这一目标,包括通过URL、Cookie以及...

    JS不断给FLASH传值

    这种通信机制可以让我们在网页中利用Flash的动态特性,同时借助JavaScript处理DOM和其他网页交互。本教程将深入讲解如何实现"JS不断给FLASH传值"。 首先,确保Flash Player允许JavaScript与Flash内容进行交互。在AS...

    Web前端页面传值

    在Web开发中,前端页面传值是一个至关重要的概念,它涉及到数据在不同页面或同一页面内的传递。在本文中,我们将深入探讨Web前端页面传值的实现方式,以及如何通过`location`、`href`等手段进行数据传输。首先,我们...

    多窗口互相传值

    - 使用封装好的库或框架,如AngularJS的`$rootScope`广播机制,可以简化跨视图的数据传递。 - 避免使用全局变量,以减少潜在的冲突和bug。 - 对于复杂的数据传递,考虑使用服务或者中间件来管理。 以上就是关于...

    Vue 最常用不同组件传值

    ### Vue不同组件间传值详解 在前端开发中,组件之间的通信是非常常见且重要的环节,尤其是在使用Vue.js这种基于组件化的框架时。本篇文章将详细阐述Vue中不同组件之间如何进行传值,包括常见的几种传值方式以及注意...

    javascript和jsp面之间的传值.docx

    在Web开发中,JavaScript主要负责前端交互,而JSP(JavaServer Pages)则处理服务器端逻辑。两者之间的数据交互是实现动态网页的关键。...这种交互机制使得Web应用能够实现动态的用户体验和复杂的业务逻辑。

    两个页面之间的传值方法

    在Web开发过程中,页面间的传值是实现前后端交互、数据共享的重要手段之一。本文将详细介绍两个页面之间的传值方法,包括常见的几种传值方式及其应用...希望本文能帮助大家更好地理解页面间的传值机制,提高开发效率。

    几种JSP页面传值方式.txt

    以上介绍了几种常用的JSP页面传值方式,包括使用表单、URL重写、JavaScript动态改变表单行为、JSP内置对象和标签库以及Cookie和Session。不同的场景下可以选择不同的方法来满足需求。在实际应用中,开发者还需要考虑...

    iframe父子传值

    首先,我们需要了解浏览器的安全机制——同源策略。同源策略规定,只有相同协议、域名和端口的两个页面才能相互访问彼此的DOM元素和JavaScript变量。因此,如果`iframe`的源URL与包含它的页面不同源,那么它们之间的...

    ajax\HTML 页面与页面之间传值

    1. **利用URL参数传递**:最简单的页面间传值方法是通过URL查询字符串。在超链接或表单提交中,我们可以把参数附加到URL后面,例如`跳转</a>`。在目标页面(child.html)中,可以通过`window.location.search`获取这些...

    javascript与.net的交互

    ASP.NET 提供了一些内置的安全机制,如AntiForgeryToken、HttpOnly Cookie 等,配合 JavaScript 的验证,可以增强应用的安全性。 总结,JavaScript 和 .NET 的交互涉及多个层次和技术,包括但不限于客户端的 Ajax ...

    三级页面传值..

    标题"三级页面传值.."涉及到的正是这种跨页面的数据传递技术。在这个场景中,我们可能有三个层级的页面:首页(一级页面)、中间页(二级页面)以及详细页(三级页面),它们之间需要共享某些数据,比如用户选择的...

    iframe父向子传值实例.rar

    然而,由于浏览器的同源策略限制,`iframe`内的页面与包含它的父页面在不同源时,不能直接访问彼此的DOM或JavaScript变量,这就引出了"iframe父向子传值"的问题。 在标题"iframe父向值实例.rar"和描述中提到的解决...

    android嵌套HTML的程序,相互间传值

    总结,Android与H5的交互是移动开发中的常见需求,通过合理的数据传递机制,我们可以实现两者之间的深度融合,为用户提供更丰富的功能和体验。在实践过程中,注意安全性和性能优化,确保应用的稳定性和用户数据的...

    ASP.NET分页通用组件 支持很多自定义格式和传值方式

    1. **多方式传值**:组件支持三种不同的传值机制,即JavaScript、POST和GET。JavaScript传值可以在不刷新整个页面的情况下更新分页状态,提供更流畅的用户体验;POST方法用于发送大量数据或敏感信息,保证数据安全;...

    模式窗体页面传值关于自定义控件与页面之间的传值

    在ASP.NET中,这可能通过弹出一个JavaScript或AJAX的对话框来实现,而在WinForms中则可以创建一个具有Modal属性的Form实例。 2. **自定义控件(Custom Control)**:自定义控件是扩展.NET Framework提供的基础控件...

Global site tag (gtag.js) - Google Analytics