摘要:如很明显可以看到,实际上是函数的局部变量。简单的说就是,复制给参数,在函数内部是局部变量,无论怎么变化,都不影响的变化。
ECMAScript 变量可能包含两种不同数据类型的值:基本类型值和引用类型值。
基本类型和引用类型的值基本类型值(String,Number,Boolean,Null,Undefined)指的是简单的数据段;引用类型值(保存在内存中的对象)指的是那些可能由多个值构成的对象。5种基本类型值的讨论见 JavaScript数据类型的一些注意要点
值得注意的是,很多语言中,字符串以对象的形式来表示。但在ECMAScript 中则放弃了这一点。
动态的属性:动态地为引用类型值添加属性。对于引用类型的值,可以为其添加、改变和删除属性和方法。如:
var persons = new Object(); persons.name = "Oliver"; document.write(persons.name); //"Oliver"
在上面这个例子中,变量persons 储存了一个对象。persons 就是变量,name 就是属性,“Oliver”就是赋值给persons.name 的普通字符串。最后又通过document.write 访问了这个name 属性。如果对象不被销毁或者这个属性不被删除,则这个属性将一直存在。
但是,我们不能给基本类型的值添加属性,尽管这样做不会导致任何错误。如:
var name = "Oliver"; name.age = 18; document.write(name.age); //undefined
所以说,只能用引用类型值动态地添加属性。
复制变量值复制变量值:从一个变量向另一个变量复制基本类型值和引用类型值。
复制基本类型值非常简单,如:
var x = 1; var y = x; document.write(y); //1
supereasy 在这里,复制之后,x 和y 完全独立,互不影响。
复制引用类型值当从一个变量向另一个变量复制引用类型的值时。与基本类型值不同的是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象。如:
var persons = new Object(); persons.name = "Oliver"; var child = persons; document.write(child.name); //"Oliver"
复制操作结束后,两个变量实际上将引用同一个对象。改变其中一个变量,就会影响另一个变量。
传递参数传递参数:函数外部的值复制给函数内部的参数。实际上,就跟把值从一个变量复制到另一个变量一样。该怎么操作怎么操作。
向参数传递基本类型的值(参数是按值传递的,复制给局部变量)向参数传递基本类型的值时,被传递的值会被复制给一个局部变量。如:
function add(x){ x = x + 10; return x; } var num = 1; document.write(num); //1 var result = add(num); document.write(result); //11
很明显可以看到,x 实际上是函数的局部变量。调用这个变量时,num 作为参数被传递给函数,这个变量的值是1。在函数内部,x 被加上了10 但这病不影响外部的num。
简单的说就是,num 复制给参数x,x 在函数内部是局部变量,无论x 怎么变化,都不影响num 的变化。*
向参数传递引用类型的值(参数是按值传递的,传递地址)向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此在这个局部变量的变化会反映在函数的外部。如:
function set(obj){ obj.name = "Oliver"; } var persons = new Object(); set(persons); document.write(persons.name); //"Oliver"
但是
但是
但是
一定要注意的是参数不!是!按!引!用!传!递!的!
看下面这个例子:
function set(obj){ obj.name = "Oliver"; obj = new Object(); obj.name = "Troy" document.write(obj.name); //"Troy" } var persons = new Object(); set(persons); document.write(persons.name); //"Oliver"
上面这个说明了当函数内部重写obj 时,这个变量引用的就是一个局部对象了。而这个局部对象会在函数执行完毕后立即被销毁!!这也是为什么函数内部返回了obj.name 的值是"Troy";函数外部返回了obj.name 的值则是"Oliver"的原因了。
所以说,虽然局部作用域中修改的对象会在全局作用域中反映出来,但仍然不能说明参数是按引用传递的。
所以还是那句话,一定要注意
参数不!是!按!引!用!传!递!的!
检测类型毋庸置疑,检测基本数据类型时,最佳的工具是typeof操作符。如:
var a = "abc"; var b = true; var c = 21; var d = null; var e; var f = new Object(); document.write(typeof a + "
"); //string document.write(typeof b + "
"); //boolean document.write(typeof c + "
"); //number document.write(typeof d + "
"); //object document.write(typeof e + "
"); //undefined document.write(typeof f + "
"); //object
而检测引用类型的值时,最佳的工具是instanceof操作符。如:
var array = new Array; document.write(array instanceof Array); //true; var obj = new Object(); document.write(obj instanceof Array); //false; document.write(obj instanceof Object); //true;
语法是:
result = variable instanceof constructor
所有引用类型的值都是Object 的实例。因此在检测一个引用类型值和Object 构造的函数时,instanceof 操作符始终会返回true。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/86171.html
摘要:垃圾收集具有自动垃圾收集机制。管理内存优化内存的最佳方式,就是为执行中的代码只保存必要的数据。一般适用于大多数的全局变量和全局对象的属性。如执行完毕后,变量被销毁手动解除的引用解除一个值的引用并不意味着自动回收该值所占的内存。 垃圾收集 JavaScript 具有自动垃圾收集机制。 标记清除 JavaScript 中最常用的垃圾收集方式是标记清除。 当变量进入环境(如在函数中声明一个...
摘要:模仿块级作用域在块级语句中定义的变量,实际上是包含函数中而非语句中创建的。避免对全局作用域产生不良影响这种方式可以通过创建私有作用域,避免对全局作用域产生不良影响。一般包括函数的参数局部变量和内部定义的其他函数。 模仿块级作用域 在块级语句中定义的变量,实际上是包含函数中而非语句中创建的。如: function outputNumbers(x){ for (var i = 0;...
摘要:代码约定可读性以下地方需要进行注释函数和方法注释参数代表什么,是否有返回值大段代码描述任务的注释复杂的算法变量和函数命名变量用名词函数名用动词开头等返回布尔值类型的函数用等合乎逻辑不用担心太长变量类型透明化方法一初始化,如下推荐方法二匈牙利 代码约定 可读性 以下地方需要进行注释: 函数和方法:注释参数代表什么,是否有返回值; 大段代码:描述任务的注释; 复杂的算法; Hack 变...
摘要:类型关于引用类型的概念引用类型引用类型的值对象是引用类型的一个实例对象是某个特定引用类型的实例新对象用操作符后跟一个构造函数来创建的如代码这行代码创建了引用类型的一个新实例,然后把该实例保存在了变量中。使用的构造函数是。 Object 类型 关于引用类型的概念: 引用类型:引用类型的值(对象)是引用类型的一个实例; 对象:是某个特定引用类型的实例; 新对象:用new 操作符后跟一个构...
摘要:所以,全局执行环境的变量对象始终都是作用域链中的最后一个对象。搜索过程从作用域链的最前端开始,逐级向后回溯,直到找到标识符为止。查询标识符搜索过程就是沿作用域链向上查询的过程。 执行环境 执行环境就是环境,是js中最重要的概念。执行环境定义了变量或函数有权访问的其他数据。每个执行环境都有一个与之相关的变量对象(我们编写的代码无法访问这个对象)。 全局执行环境(是最外围的执行环境。在W...
阅读 1663·2021-09-26 09:55
阅读 3677·2021-09-22 15:31
阅读 7178·2021-09-22 15:12
阅读 2186·2021-09-22 10:02
阅读 4593·2021-09-04 16:40
阅读 989·2019-08-30 15:55
阅读 2990·2019-08-30 12:56
阅读 1797·2019-08-30 12:44