JavaScript是一门弱类型语言,它对变量的声明只需要一个var,与强类型语言如(Java)需要再声明变量的同时还必须为变量指明类型;
Javascript变量分为如下两种类型
1、基本类型值:Undefined,Null,Boolean,Number,String
2、引用类型值
基本类型值是按值访问的,因为可以操作保存在变量中的实际的值;
引用类型值是保存在内存中的对象,但JS并不能直接访问内存中的位置,所以实际操作的是对象的引用,因此引用类型的值是按引用访问的。
a、动态属性:
创建一个变量只需要用var声明即可,但是当值保存到变量中之后,对于如上两种类型的变量的操作是不一样的:
比如:
(1) var person = new Object();
person.name = "jack";
alert(person.name) //输出jack
(2) var person = "jack";
person.age = "12";
alert(person.age) // undefined;
由此可见:JS只能给引用类型值动态的添加属性;
b、复制变量值:
复制变量值也是有很大不同的:
基本类型值:复制给另外一个变量时,相当于在内存中创建了一个新值,两个变量之间是没有任何关系的;
引用类型值:复制给另外一个变量时,只是复制了对于该对象的引用,并没有生成新的值;
比如:
(1) var name = "jack"
var person = name;
var person = "rose";
alert(name + "," + person) // jack,rose
(2) var obj1 = new Object();
var obj2 = obj1;
obj2.name = "jack";
alert(obj1.name) // jack
obj1 与 obj2 同时指向了内存中的同一个Object对象;
c、传递参数
JS中所有的函数的参数都是按值传递的;
但是需要注意的是,当参数类型是基本类型的值时候,就跟基本类型变量值的复制一样,两个变量之间没有关联;如果参数是引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,创建的是副本,并且局部变量的变化会反应在函数的外部;
比如:
(1) function addT(num){
num += 10;
return num;
}
var count = 20 ;
var result = addT(count);
alert(count) //20;
alert(result) //30;
(2) function setName(obj){
obj.name = "jack"
}
var person = new Object();
setName(person);
alert(person.name) // "jack"
(2)中代码会让人产生误解,因为局部作用域修改的值在全局作用域中显示出来了,这难道不是说明参数是按引用传递的么;其实不是,如下代码
(3)
function setName(obj){
obj.name = "jack"
obj = new Object();
obj.name = "rose"
}
var person = new Object();
setName(person);
alert(person.name) // "jack"
很不如人意:rose并没有出现,如果参数是按照引用传递的话,那么应该输出rose;其实当执行obj = new Object()的时候重写了obj ,这个obj变成了局部变量;
之所以前面一个obj局部改变值能在全局作用域中反应,完全是因为JS参数传递的值类型决定的;
d、检测类型
要检测一个变量是不是基本数据类型,typeof是最佳的工具:
var s = "jack";
var b = true;
var i = 22;
var u;
var n = null;
var o = new Object();
alert(typeof s) //string
alert(typeof b) //boolean
alert(typeof i) //number
alert(typeof u) //undefined
alert(typeof o) //object
对于引用类型则使用 instanceof (variable instanceof constructor);任何引用类型的值都是Object的实例,所以任何引用类型的值instanceof Object 都返回true;
检测基本类型的值的时候 都返回false;
原文:http://www.cnblogs.com/zjw1993/p/5114664.html