从头开始学JavaScript (八)——变量

一、变量分类:
基本类型值:null、undefined、number、string、Boolean;
引用类型值:保存在内存中的对象,如:Object / Array / Function / Date / RegExp / Error / Map / Set …
二、属性
二者的定义方式是类似的:创建一个变量并为其赋值。
2.1基本类型值不能添加删除属性
2.2引用类型的属性可以动态添加删除属性
例如:
<script type="text/javascript">
var person = new Object();
person.name = "Nicholas";
alert(person.name); //"Nicholas"
</script>
上述例子创建了一个对象并将其保存在变量person中,然后我们又为这个对象添加了一个name属性,并将一个字符串赋值给该属性。
再看一个例子:
<script type="text/javascript">
var name = "Nicholas";
name.age = 27;
alert(name.age); //undefined
</script>
可见基本类型的值是不能动态添加属性的,尽管不报错。
三、复制变量值
3.1基本类型值复制变量
同样通过代码来说明:
var num1=2;
var num2=num1;
变量num2只是把num1中存储的值(2)复制了一份,然后保存在自己的内存空间,此后这两个变量可以参与任何操作而互不影响。
3.2引用类型值复制变量
var obj1= new Object();
var obj2=obj1;
obj1.name="jack";
alert(obj2.name);//jack
同样的,obj2也是把obj1中存储的值复制了一份,然后保存在自己的内存空间,只不过这个值实际上是一个指针,而这个指针指向存储在堆中的一个对象。复制操作结束后,两个变量实际上将引用同一个对象。两个变量其实是相互同步的。
四、传递参数
ECMAscript中所有函数的参数都是按值传递的:把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。
4.1基本类型的值
被传递的值会被复制给一个局部变量(也就是命名参数:形参,也就是arguments对象中的一个元素)。见http://www.cnblogs.com/yxField/p/4224380.html中所提到的。
需要说明的是:String一个特殊的基本数据类型
在很多语言中,String是以对象的形式表示的,但在ECMAScript里没有沿用这种传统,String是当作一种基本数据类型,但它是一个比较特殊的基本类型。
看上去好像String应该做为一个引用类型,可实际上它不是,因为它不是对象。那么看起来它应该是基本数据类型,应该是通值传递的方式来操作。
看下面例子:
var stra = "这是一个字符串";
var strb = stra;
stra = "这是另外一个字符串";
console.log(strb); // 这是一个字符串
上面例子我们看到,仿佛stra通过值传递的方式复制了一份给了strb。当stra改变的时候,strb并没有改变,似乎我们已经可以下结论,String就是个基本数据类型。
可是,因为String是可以任意长度的,通过值传递,一个一个的复制字节显示效率依然很低,看起来String也可以当作引用类型。
看下面例子:
var a = "myobject";
a.name = "myname";
console.log(a.name); // undefined
显示String无法当作一个对象来处理。实际上,javascript里的String是不可以改变的,javascript也没有提供任何一个改变字符串的方法和语法。
var a = "myobject";
a = a.substring(3,5)
console.log(a); // bj
记住这样做,就没有改变String字符串"myobject",只a引用了另一个字符串"bj","myobject"被回收了。
所以可以这样讲,String实际上并不符合上面两种数据类型分类。它是具有两方面属性介于两都之间的一种特殊类型。
4.2引用类型的值
在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反应在函数的外部。
例如:
<script type="text/javascript">
function setName(obj) {
obj.name = "Nicholas";
} var person = new Object();
setName(person);
alert(person.name); //"Nicholas" </script>
上述例子中,变量person在复制给obj时,把它所保存的对象在内存中的地址复制给了obj,所以obj和person引用的还是同一个对象。
为了证明对象是按值传递的,再看个例子:
function setName(obj) {
obj.name = "Nicholas";
obj=new Object();
obj.name="jack";
}
var person = new Object();
setName(person);
alert(person.name); //"Nicholas"
上述例子中,如果person是按引用传递的,那么person.name就会变成Jack,这说明即使在函数内部修改了参数的值,但是原始的引用仍然保持不变。实际上,当函数内部重新写obj时,这个变量引用的就是一个局部对象了,这个局部对象会在函数执行完之后被立即销毁。
五、检测类型
5.1检测基本数据类型:typeof
见http://www.cnblogs.com/yxField/p/4211704.html
5.2检测引用类型值:instanceof
例如:
var s =[1,2];
var a = true;
var i = new Object(); alert(i instanceof Object); //true
alert(a instanceof Object); //false
alert(s instanceof Array); //true
从头开始学JavaScript (八)——变量的更多相关文章
- 从头开始学JavaScript (二)——变量及其作用域
原文:从头开始学JavaScript (二)--变量及其作用域 一.变量 ECMAscript变量是松散型变量,所谓松散型变量,就是变量名称可以保存任何类型的数据,每个变量仅仅是一个用于保存值的占位符 ...
- 从头开始学JavaScript (十一)——Object类型
原文:从头开始学JavaScript (十一)--Object类型 一.object类型 一个object就是一系列属性的集合,一个属性包含一个名字(属性名)和一个值(属性值). object对于在应 ...
- 从头开始学JavaScript (十二)——Array类型
原文:从头开始学JavaScript (十二)--Array类型 一.数组的创建 注:ECMAscript数组的每一项都可以保存任何类型的数据 1.1Array构造函数 var colors = ne ...
- 从头开始学JavaScript (十)——垃圾收集
原文:从头开始学JavaScript (十)--垃圾收集 一.垃圾收集 1.1javascript垃圾收集机制: 自动垃圾收集,执行环境会负责管理代码执行过程中的使用的内存.而在C和C++之类的语言中 ...
- 从头开始学JavaScript (九)——执行环境和作用域
原文:从头开始学JavaScript (九)--执行环境和作用域 一.执行环境:定义了变量或者函数有权访问的其他数据,决定了它们各自的行为.每个执行环境都有与之关联的变量对象. 变量对象:保存着环境中 ...
- 从头开始学JavaScript (六)——语句
原文:从头开始学JavaScript (六)--语句 一.条件分支语句:if 基本格式: if (<表达式1>){ <语句组1>}else if (<表达式2> ...
- 从头开始学JavaScript (五)——操作符(二)
原文:从头开始学JavaScript (五)--操作符(二) 一.乘性操作符 1.乘法:* 乘法操作符的一些特殊规则: 如果操作数都是数值,按照常规的乘法计算,如果乘积超过了ECMAscri ...
- 从头开始学JavaScript (四)——操作符
原文:从头开始学JavaScript (四)--操作符 一.一元操作符 1.自增自减操作符:分为前置型和后置型: 前置型:++a;--a; 后置型:a++;a--; 例: <script typ ...
- 从头开始学JavaScript (三)——数据类型
原文:从头开始学JavaScript (三)--数据类型 一.分类 基本数据类型:undefined.null.string.Boolean.number 复杂数据类型:object object的属 ...
随机推荐
- RH133读书笔记(2)-Lab 2 Working with packages
Lab 2 Working with packages Goal: To gain working experience with package management System Setup: A ...
- Chrome console(转)
阅读目录 写在前面 谷歌控制台Elements面板 查看元素上绑定的事情 样式操作 总况 console.log console.info console.error console.warn con ...
- 开源Math.NET基础数学类库使用(07)一些常用的数学物理常数
原文:[原创]开源Math.NET基础数学类库使用(07)一些常用的数学物理常数 本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/ ...
- 使用jquery点击一个实现button或连接,进行以下div显示,在点击隐藏
jquery代码: <script type="text/javascript" src="js/jquery-1.7.2.js"></scr ...
- 菜鸟学SSH(十二)——Hibernate与Spring配合生成表结构
前几天向大家介绍了一种用工具类生成数据表的方法,只是之前的方法须要使用一个跟项目关系不大的工具类.不免让人认为有些多余,所以呢.今天再向大家介绍一种方法.即Hibernate与Spring配合生成表结 ...
- MCC460MNC08
因为搜得辛苦,正好也写点关于我morto工作有关的事情,给大家和我一样扫盲,哈哈 The GSM Mobile Country Code (MCC) is different from the i ...
- 当向后台插入或读取JSON数据遇见回车时
今天在项目中发现.当插入或读取JSON数据时遇见回车符.返回JSON数据格式时会报错(firebug里体现为乱码),百度了一下发现JSON不支持字符串里存在回车! 解决的方法: 在向接口插入带json ...
- NIVC->IPR[IPADDR]
#include <stm32f10x.h> #include "sys.h" //表偏移地址 //NVIC_VectTab:基址 //Offset:偏移量 //C ...
- 推荐几个我一直在使用chrome小工具(上)
我用的chrome插件挺多的,所谓工欲善其事必先利其器,我热衷于搜寻好用的工具来让我平时的工作事半功倍. 以下介绍几款我正在用的感觉还不错的插件,假设大家还有其他好用的(肯定有,chrome插件库太庞 ...
- Shark集群搭建配置
一.Shark简单介绍 Shark是基于Spark与Hive之上的一种SQL查询引擎,官网的架构图及性能測试图例如以下:(Ps:本人也做了一个性能測试见Shark性能測试报告) 我们涉及到了2个依赖组 ...