变量-内存-作用域(JavaScript)

基本类型和引用类型

ECMAScript变量可能包含两种不同数据类型的值:基本数据类型值和引用类型值。

基本数据类型为:Undefined,Null,Boolean,Number和String五种。

引用类型为:Object,Array,Date,RegExp,Function。

基本变量值复制

var a = 11;
var b = a;
console.log(b);//11
a = 22;
console.log(a);//22
console.log(b);//11
//b still has not been changed after the a was changed

以上代码说明:值复制(b复制a的值)后的两个变量(a和b)可以参与任何操作而不会相互影响。

对象变量值复制

var obj1 = new Object();
var obj2 = obj1;
obj1.name = ‘MUSTANG‘;
console.log(obj2.name);//MUSTANG
obj1.age = 23;
obj2.age = 24;
console.log(obj1.age);//24

以上代码说明:obj2复制obj1后,两个对象指向的是同一个堆内存(即共享一个堆内存)。

因此任意一个对象(obj1或者obj2)添加/删除属性或者方法都是在堆内存中更改的(如果两个对象拥有同一个属性名或者方法名,则以最后一个为准,即同名时前者被后者覆盖)。

参数的传递

function add(num){
    num += 20;
    return num;
}
var a = 10;
var result = add(a);
console.log(result);//30
console.log(a);//10

以上代码说明:参数是按值传递的,如果num是按引用传递,那么a的值也将为30。因为引用传递是通过堆内存来传递的。

一个有趣的例子

//#1
function setName(obj){
    obj.name = ‘MUSTANG‘;
}
var horse = new Object();
setName(horse);
console.log(horse.name);//MUSTANG
//---------------------------------
//#2
function setName(obj){
    obj.name = ‘MUSTANG‘;
    obj = new Object();
    obj.name = ‘SHELBY‘;
}
var horse = new Object();
setName(horse);
console.log(horse.name);//MUSTANG
//still MUSTANG

以上代码说明:结合#1看#2,首先执行setName()时参数按值传递,但是此时的参数是一个对象,对象则是按引用传递。

因此当执行setName()时,obj对象(即person对象)添加了name属性。

前面讲到,对象添加/删除属性或者方法都是在堆内存中操作的,因此外部person也会添加name属性。

因此执行console.log(horse.name)得到的是’MUSTANG’而不是’SHELBY’

至于为什么obj = new Object(); obj.name = ‘SHELBY‘;不会生效是因为此时的obj是局部变量,而且此时的obj又是另外一个堆内存了,所以并不会影响外部结果。

文章说明:

参考资料文献:《JavaScript高级程序设计》(第3版) 第四章

水平有限,欢迎指正。

时间: 2024-11-02 20:37:15

变量-内存-作用域(JavaScript)的相关文章

js基础--javascript基础概念之变量与作用域

js基础--javascript基础概念之变量.作用域 javascript按照ECMA-262 的定义,变量与其他语言变量有所不同.js变量时松散的,不需要事先定义变量类型的.这使得他只是一个保存特定值的一个名称.变量与其数据类型可以在脚本的生命周期内改变. 还有明白几点: JavaScript的变量作用域是基于其特有的作用域链的,JavaScript没有块级作用域. 基本类型和引用类型的值 ECMAScript 的变量有两种不同的数据类型:分别是 基本数据类型值 和 引用类型值 : 基本数据

javascript学习日记之变量的作用域

``` 很显然第一个弹出框并没有如我所想弹出的global而是undefined 这是为什么呢? 其实由于函数作用域特性 函数域始终优于全局域 同名的局部变量会覆盖掉全局变量 而第一次调用alert的时候scope还没正式定义 所以为undefined 以上代码可以理解为: ``` function f(){ var scope; alert(scope); var scope ="local"; alert(scope); }; f(); //等价与函数内变量的声明'提前'至函数体顶

JavaScript的进阶之路(二)函数简介,变量、作用域和内存问题

<h3>ECMAScript中函数不存在函数签名的概念,没有重载</h3><h3>无需指定返回值,可以在任何时候返回任何值.未指定返回值的函数,返回的是一个特殊的undefined值</h3> <script type="text/javascript"> function sayHi(){ console.log("Hi"); }; sayHi(); function sayName(name,age){

JavaScript中变量、作用域和内存问题(JavaScript高级程序设计第4章)

一.变量 (1)ECMAScript变量肯能包含两种不同的数据类型的值:基本类型值和引用类型值.基本类型值指的是简单的数据段,引用类型值指那些可能由多个值构成的对象. (2)基本数据类型是按值访问,可以操作保存在变量中的实际的值:引用类型的值是保存在内存中对象,操作对象时,实际上是在操作对象的引用而不是实际的对象,引用类型的值是按引用访问的. (3)传递参数.ECMScript中所有的函数的参数都是按值传递的. function setName(obj){ obj.name = "Nichola

javascript中的变量、作用域和内存问题

[变量][1]定义:可变的量,相当于给一个不定的数据起了一个外号.变量是存储信息的容器.[2]特性:js中的变量是松散类型的,可以保存任何类型的数据.它只是在特定时间用于保存特定值的一个名字而已.由于不存在定义某个变量必须要保存何种数据类型值的规则,变量的值及其数据类型可以在脚本的生命周期内改变.[3]变量声明:变量可以在声明时赋值,但不能有其他操作,如+=.-=等 var a = 2;//是正确的 var a += 2;//是错误的 var a = 2++;//是错误的,++只能用于变量,不能

JavaScript 变量、作用域和内存问题

按照ECMA-262第三版的定义,JavaScript的变量与其他语言的变量有很大区别.JavaScript变量松散类型的本质,决定了它只是在特定时间用于保存特定值的一个名字而已.由于不存在定义某个变量必须要保存何种数据类型的规则,变量的值及其数据类型可以在脚本的生命周期内改变.尽管从某种角度看,这可能是一个既有趣又强大,同时又容易出问题的特性,但JavaScript变量实际的复杂程度还远不止如此. 1,基本类型和引用类型的值 ECMAScript变量可能包含两种不同类型的值:基本类型值和引用类

PHP (20140510)深入浅出 JavaScript 变量、作用域和内存 v 0.5

深入浅出 JavaScript 变量.作用域和内存 v 0.5 本文主要从原理入手分享变量和作用域的相关知识,最后结合本文所分享知识,再次深入了解下闭包的运行原理. 主要参考<JS高级程序设计> <JS权威指南> <高性能 JS> 三本书. 目录 1 变量 1.1 变量的声明 1.2 变量类型的特点 2 执行环境和作用域 3 再谈谈闭包 变量 对 JavaScript 稍微有点了解的同学都知道,JavaScript 中的变量与其他语言的变量有很大区别. JS 的弱类型的

JavaScript变量、作用域和内存问题(一)

接下来博客的内容 理解基本类型和引用类型的值 理解执行环境 理解垃圾收集 按照 ECMA-262 的定义,JavaScript 的变量与其他语言的变量有很大区别.JavaScript 变量松散类型的本质,决定了它只是在特定时间用于保存特定值的一个名字而已.由于不存在定义某个变量必须要保存何种数据类型值的规则,变量的值及其数据类型可以在脚本的生命周期内改变.尽管从某种角度看,这可能是一个既有趣又强大,同时又容易出问题的特性,但 JavaScript 变量实际的复杂程度还远不止如此. 基本类型和引用

《JavaScript高级程序设计》读书笔记 ---变量、作用域和内存问题小结

JavaScript 变量可以用来保存两种类型的值:基本类型值和引用类型值.基本类型的值源自以下5种基本数据类型:Undefined.Null.Boolean.Number 和String.基本类型值和引用类型值具有以下特点:? 基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中:? 从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本:? 引用类型的值是对象,保存在堆内存中:? 包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针:? 从一个变量向另一个变