`
ytuwlg
  • 浏览: 93756 次
  • 性别: Icon_minigender_1
  • 来自: 威海
社区版块
存档分类
最新评论

JavaScript 变量值类型&内存分配&参数传递

    博客分类:
  • JS
阅读更多

        JavaScript 变量包含两种不同类型的值,分别为基本类型值(primitive values)和引用类型值(reference values)。primitive values primitive type值,在JavaScript primitive type 包括 Undefined , Null , Boolean , Number , String  五种类型。reference values Object 类型的值。

        JavaScript 对两种值类型的处理是不同的。把一个primitive values 赋值给变量时,primitive type 数据的长度是固定的,因此在创建primitive type值时,直接在stack中分配内存。在变量中直接存储的是 data value;然而当把一个 reference values 赋值给变量时,因为 Object 类型数据的长度是动态变化的,所以在实例化对象时是在 heap 中分配内存的。在变量中存储的是对象在 heap 中的pointer。下面的图展示了两种值类型的内存分配情况:

            JavaScript function 参数传递采用value传递方式。看下面的例子:

function setName(obj){
	obj.name = ‘wlg’;
}
var person  = new Object();
person.name = ‘ytu’;
setName(person);
alert(person.name)  // 显示 wlg

 

       看了上面的例子。有的同学可能说,在JavaScript中对象类型的变量,参数传递采用的是reference传递的方式,因为函数setName中参数objglobal variable person指向同一个对象。obj与person指向同一个对象是正确的,但认为采用的是reference 传递方式是错误的。再看一个例子:  

function setAge(obj){
	obj.age = 12;
	obj = new Object();
	obj.age = 15;
}	
var person = new Object();
person.age =  13;
setAge(person);
alert(person.age); //显示 12

 

          如果参数传递采用的是reference方式,那么执行setNameperson)后,person应该指向函数setName中创建的新对象,alertperson.age)显示的应该为15。然而执行结果显示的是12person并没有指向新对象。

      在JavaScript中参数的传递采用值传递的方式,拿第二个例子来说,首先声明一个person变量并创建对象(取名为对象1)对其进行赋值。此时personvalue 为对象1在内存heap中的pointer 。调用function setName,将person作为参数传入functionJavaScript进行参数的值传递,person中的value 复制给function的参数obj ,此时obj value为对象1heap中的pointerobj person无任何关联。因为objperson中的value均为对象1pointer,所以双方修改读取的为同一个对象,同一段内存。在setName中创建新对象(对象2)并赋值给obj,此时objvalue 为对象2pointerpersonvalue没有发生变化,仍然为对象1pointer,所以最后alertperson.age)显示12

      因此JavaScript中参数采用值传递的方式。

 

 

 

  • 大小: 19.1 KB
1
0
分享到:
评论

相关推荐

    JavaScript内存管理相关.docx

    这通常涉及改变变量或对象的属性值,以及将值作为函数参数传递等。 #### 五、释放内存 在JavaScript中,内存的释放是由垃圾回收机制自动完成的。然而,如何确定哪些内存已经不再需要是一个复杂的问题。通常情况下...

    JavaScript 变量、作用域及内存

    在JavaScript中,复制变量值也有基本类型和引用类型的区别。基本类型值在赋值时复制的是值本身,而引用类型值在赋值时复制的是引用地址。这意味着对引用类型值进行修改时,所有指向该引用的变量都将反映出修改后的值...

    javascript错误的认识不用关心内存管理.docx

    #### JavaScript 内存分配 在 JavaScript 中,内存分配主要发生在以下几个场景: - **值的初始化**:为变量赋值时,JavaScript 会自动分配内存。例如: ```javascript var n = 123; // 分配数字内存 var s = ...

    JavaScript变量类型以及变量作用域详解

    在JavaScript中,所有的变量都存储为对象的引用,在内存中分配给变量的是对象值的引用而非实际值本身。这与其他一些语言中,对象被认为是引用类型,而基本类型则是值类型不同。 ECMAScript定义了五种基本数据类型:...

    03_JS内存管理和闭包(day03)1

    栈内存主要用于存储基本数据类型,如数字、字符串、布尔值等,这些数据在声明时直接在栈中分配空间,生命周期较短,当变量的作用域结束时,其占用的内存会被自动回收。 堆内存则用于存储复杂的数据结构,如对象、...

    JavaScript数据类型之基本类型和引用类型的值

    理解JavaScript中的基本类型和引用类型之间的区别,以及它们如何在赋值、复制和参数传递过程中工作,是成为一名熟练的JavaScript开发者的关键步骤。这些概念对于解决诸如作用域、闭包、深拷贝和浅拷贝等问题至关重要...

    javascript 内存模型实例详解

    这一特性使得const声明的变量在处理不可变数据时非常有用,比如在函数参数传递和常量定义中。 值得注意的是,在javascript中,无论是使用let还是const,原始数据类型的数据本身都是不可变的。所谓的“改变”指的是...

    JavaScript核心技术开发解密1

    在内存空间部分,读者将了解到JavaScript的基础数据类型(如字符串、数字、布尔值、null、undefined)以及变量对象的概念,这些都是理解JavaScript内存分配和作用域的关键。 函数是JavaScript的核心特性之一,书中...

    编程语言语法(vb powerbuilder c++ javascript)对照

    它有复杂的内存管理机制,包括指针操作和动态内存分配。 - **JavaScript**:主要用于客户端Web开发的脚本语言,与HTML和CSS紧密配合,实现网页的交互性。它支持函数式编程、原型继承和异步编程模型。 通过比较这四...

    掌握数据交换语言:JavaScript中的JSON使用全解析

    此外,函数在JavaScript中被视为一等公民,这意味着它们可以作为参数传递、赋值给变量,甚至是作为其他函数的返回值。这些特性共同构成了JavaScript的强大功能,使其成为前端Web开发不可或缺的一部分。 #### ...

    js变量、作用域及内存详解

    4. **参数传递**:JavaScript中的参数传递总是按值传递,这意味着函数内部修改参数不会影响到外部变量。如果期望函数内部的修改能影响外部,通常需要将参数作为对象传递,因为对象是引用类型。 5. **作用域**:作用...

    All function arguments in ECMAScript are passed by value

    与原始值不同,当引用值(通常是对象或数组)被赋值给一个变量时,实际分配的空间位于堆内存中。这意味着,当一个引用值被赋值给另一个变量时,实际上是在栈内存中复制了指向该对象的地址,而不是对象本身。这种方式...

    javascript错误的认识不用关心内存管理

    使用值,即对分配的内存进行读写操作,包括访问变量、对象属性,或者传递参数给函数。然而,确定何时不再需要内存是内存管理中的难点。在高级语言中,垃圾收集器负责追踪内存的分配和使用,试图确定哪些内存可以安全...

    再谈Javascript中的基本类型和引用类型(推荐)

    3. 在函数参数传递方面,Javascript中所有的参数传递实际上都是按照值传递的方式进行的,也就是将外部变量的一个副本传递给函数的参数。这意味着函数内部对参数的操作不会影响到外部的原始变量。这一点对于基本类型...

    js内存泄漏(超详细)

    复制变量值基础数据类型引用数据类型3. 传递参数先到执行环境及作用域作用域和执行上下文解释:执行再到闭包闭包再到内存泄漏什么是内存泄漏?`JavaScript`中的内存管理标记清除算法步骤闭包造成内存泄漏的情况最后...

    深入理解C语言指针的奥秘

    这种特性使得指针成为C语言中实现动态内存分配、数据结构(如链表、树)以及函数参数传递的关键。 在C语言中,声明指针的基本语法是`类型 *名称`,例如`int *ptr`表示一个指向整型变量的指针。指针的初始化通常需要...

    javaScript深入大纲

    - 堆栈内存分配。 - 变量生命周期。 - 垃圾回收机制。 6. **执行上下文** - 全局执行上下文。 - 函数执行上下文。 - 作用域链。 7. **闭包** - 表面现象。 - 真正原理。 - 形式与应用案例。 8. **递归**...

    Java初级教材 连载

    JavaScript提供了三种操作数据值的方式:复制、作为参数传递给函数或方法以及比较大小。复制是通过创建新变量并赋予原值的一个副本完成的,两个值互不影响。传值和传址是两种不同的操作方式,传值复制的是值,而...

    JavaScript Objects Functions and Arrays Explained

    本节解释了JavaScript中的内存管理方式,包括变量存储的位置以及如何在堆和栈之间进行分配。通过理解这些概念,读者可以更好地控制数据结构和提高程序性能。 - **变量与引用类型**:讨论了基本类型(如字符串、数字...

    js中的值类型和引用类型小结 文字说明与实例

    了解值类型和引用类型的概念对于编写正确的代码非常重要,特别是在涉及到函数参数传递、比较操作和对象克隆时。例如,在JavaScript中,函数参数是通过值传递的,但引用类型的参数是通过引用传递的。如果传递给函数的...

Global site tag (gtag.js) - Google Analytics