Javascript的变量
- 松散的
- 既有趣又强大
- 同时又容易出问题
- 复杂
- 可能包含两种数据类型的值:
- 基本类型: 简单的数据段
Undefined,Null,Boolean,Number,String- 按值访问:可以操作保存在变量中的值
- 不能添加属性,尽管这样做不会导致错误
- 复制变量的值:复制来创建一个新值,然后放到为新变量分配的位置上
- 操作新旧变量,不会互相影响
- 引用类型:可能由多个值构成的对象
- 内存中的对象
- 按引用访问:操作对象的引用,而不是实际的对象
- 可以为其添加、改变、删除属性和方法
- 对于添加的属性,只要对象不被销毁以及这个属性不被删除,这个属性就会一直存在
- 复制变量的值:复制来创建一个新的引用值,然后放到为新变量分配的位置上
- 新旧引用值指向同一个对象
- 操作新旧变量,会互相影响
- 基本类型: 简单的数据段
//添加属性:
var person = new Object();
person.name = "Nicholas"; //添加属性name
alert(person.name); //"Nicholas"
var name = "Nicholas";
name.age = 27; //添加属性age
alert(name.age); //undefined
//复制变量的值
var obj1 = new Object();
var obj2 = obj1;
obj1.name = "Nicholas";
alert(obj2.name); //"Nicholas"
var num1 = 5;
var num2 = num1;
Javascript不允许直接访问内存中的位置,即不允许直接操作对象的内存空间,只能操作对象的引用
参数的传递
ECMAScript中所有函数的参数,都是按值传递,而没有按引用传递。即:都是相当于把函数外部的值复制给函数内部的参数。
- 基本类型的参数:就是基本类型的变量复制
- 引用类型的参数:就是引用类型的变量复制
//以下例子用来说明,参数是按值传递的,而不是按引用传递的
function setName (obj) {
obj.name = "Nicholas";
//重新定义了一个对象,但不影响person的指向
obj = new Object();
obj.name = "Greg";
}
var person = new Object();
setName(person);
//说明原始引用仍然保持不变
alert(person.name); //"Nicholas"
检测,基本类型和引用类型
typeof操作符:检测基本类型的得力助手
- 能够得知变量是,
string, number, boolean还是undefined - 对于
null和对象,都返回object - 对于函数,返回function
instanceof操作符:检测引用类型的得力助手
- 引用类型都是
Object的实例
alert(person instanceof Object);
- 我们有时并不是想知道某个值是对象,而是想知道它是什么类型的对象
alert(colors instanceof Array); //是Array类型的对象吗
alert(pattern instanceof RegExp); //是RegExp类型的对象吗