以前感觉js的变量就是var定义一下就可以保存各种数据类型的值,最近看高程设计,刚刚把作用域搞的稍微明白点,顺便就把变量也重新钻研一遍,发现js确实是博大精深,想要用好js确实要花大功夫。
一、变量
js的变量和别的语言的变量有很大区别,是松散类型的(所谓松散类型就是可以用来保存任何类型的数据),不需要起声明变量的类型就可以直接定义。
var i=1;//Number类型
var i="Javascript";//String类型
var i={x:4};//Object类型
var i=[1,2,3];//虽然是Array,但是也是Object类型
Javascript的变量包含两种不同数据类型的值:基本类型值和引用类型值。
基本类型值指的是简单的数据段,而引用类型值值那些可能由多个值构成的对象。
js中有5种基本数据类型,Undefined、Null、Boolean、Number、String。还有1种复杂数据类型Object。
1.给对象添加属性,只能给引用类型值动态添加属性
var person= new Object();
person.name="Nicholas";
console.log(person.name); //"Nicholas"
如果给基本类型的值添加属性,不会报错,但是会undefined。
var name="Nicholas";
name.age=27;
console.log(name.age); //undefined
2.复制变量值
对于基本类型值来说,从一个变量向另一个变量复制的时候,会在变量对象上创建一个新值,然后复制到新变量分配的位置上。
var num1=5;
var num2=num1;
console.log(num2); //5
num2=10;
console.log(num1); //5
console.log(num2); //10
但是对于引用类型的值来说,同样也会讲存储在变量对象的值复制一份放到为新变量分配的空间中。不同的是,这个值实际上是一个副本,而这个指针指向存储在堆中的一个对象。复制结束后,两个变量将引用到同一个对象。
var obj1=new Object();
var obj2=obj1;
obj1.name="Nicholas";
console.log(obj2.name); //Nicholas
obj2.name="csdn";
console.log(obj1.name); //csdn
3.传递参数
访问变量有按值和按引用传递,但是参数只能按值传递,先看个例子
function addTen(num){
num +=10;
return num;
}
var count=20;
var result=addTen(count);
console.log(count); //20,没有变化
console.log(result); //30
函数addTen()有一个参数num,而参数实际上是函数的局部变量,调用函数时,变量count作为参数把值传给函数。实际上参数num和变量count互不认识,只是有相同的值罢了,被改变的是num而不是count。如果是引用传递的话,count的值也会变成30。