js的变量和其他语言的变量区别还是挺大的,它只是在特定时间用于保存特定值的一个名字而已,js的变量高度灵活,同时又很容易出问题,需要专门学习。
一,基本类型和引用类型的值
基本类型值指数据的五种基本类型,undefined、null、布尔值,数字和字符串。值得注意的是在很多语言中,字符串都是以对象的形式表现的。引用类型的值是指那些可能由多个值构成的对象。值得注意的有以下几点:
1,复制引用类型值
引用类型是存在内存里面的,当从一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份放到为新变量分配的空间中,不同的是,这个副本实际上是一个指针,而这个指针指向存储在堆中的一个对象。复制操作结束后,两个变量实际上将引用同一个对象,因此,改变其中一个变量,就会影响另一个变量。
var obj1 = new Object();
var obj1 = obj2;
obj1.name = "xiaozan";
alert(obj2.name); //xiaozan
2,传递参数
函数外部的复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。对这个对象的操作会生效,但是对这个变量重新赋值的话,操作不会生效。
function setName(obj) {
obj.name = "Nicholas";
obj = nem Object();
obj.name = "xiaozan";
}
var person = new Object();
setName(person);
alert(person.name); //"Nicholas"
3,类型检测
基本数据类型用typeof,引用数据类型用instanceof。
var s = "Nicholas";
var b = true;
var i = 22;
var u;
var n = null;
var o = new Object();
alert(typeof s); //string
alert(typeof i); //number
alert(typeof b); //Boolean
alert(typeof u); //undefined
alert(typeof n); //object
alert(typeof o); //object
二,指向环境及作用域
局部变量继承关系和其他语言差不多。值得注意的是js没有块级作用域。在其他类C的语言中,由花括号封闭的代码块都有自己的作用域(比如if,for),但是js不是。在if和for里面定义的局部变量,在判断外依然可以获取。
其实这章还提到了垃圾回收问题,在这简单介绍最常见的垃圾收集方式吧。
1,垃圾收集器会在运行的时候给存储在内存的所有变量加上标记。
2,去掉环境中的变量以及被环境中的变量引用的变量的标记
3,把仍然有标记的变量销毁,回收内存空间
就说这么多吧,其实还有一些细节,但是我仔细看了之后觉得不是很重要,比如基本类型存在栈,引用类型存在堆这种小知识点就不说了。