- 基本数据类型:
Undefined
、Null
、'Boolean'、'Number'、'String'
按值访问,可以操作保存在变量中的实际的值
- 引用类型:
Object
按引用访问,引用类型的是保存在内存中的对象,js不能直接操作对象的内存空间,操作对象时是在操作对象的引用
动态的属性
可以给引用类型动态添加删除属性和方法
var person = new Object();
person.name = "fanison"
alert(person.name); // “fanison”
// 不能给基本类型的值添加属性,不会报错
var name = "fanison";
name.age = 27;
alert(name.age); //undefined
复制变量值
- 基本类型
复制基本类型的值,会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上;两个对象可以参与任何操作而不会互相影响
var num1 = 5;
var num2 = num1;
- 引用类型
复制引用类型的值时,会将存储在变量对象中的指针指向存储在堆中的对象,两个变量将引用同一个对象;改变其中一个变量,就会影响另一个变量
var obj1 = new Object();
var obj2 = obj1;
obj1.name = "fanison"
alert(obj2.name); // "fanison"
传递参数
函数的参数是按值传递的
function addTen(num){
num += 10;
return num;
}
var count = 20;
var result = addTen(count);
alert(count); //20
alert(result); //30
调用函数时,变量count
作为参数传递给函数,数值20被复制给参数num
,num
在函数内加10不会影响函数外部的count
变量
function setName(obj){
obj.name = "fanison";
}
var person = new Object();
setName(person);
alert(person.name); // "fanison"
创建一个对象并将其保存在变量person
中,变量传递到setName()
函数中被复制给obj
function setName(obj){
obj.name = "fanison";
obj = new Object();
obj.name = "Lili";
}
var person = new Object();
setName(person);
alert(person.name); // "fanison"
为证明对象是按值传递,在setName()
函数中重新定义一个对象,并定义一个带有不同值的name
属性;即使在函数内部修改参数值,原始的引用仍然保持未变。
检测类型
instanceof :检测一个引用类型值和Object
构造函数时,instanceof
操作符返回 true
;若检测基本类型的值,会返回false
语法:result = variable instanceof constructor
alert(person instanceof Object);
alert(colors instanceof Array);
alert(pattern instanceof RegExp);
typeof: 检测变量数据类型
var a = "fanison";
var b = true;
var c = 22;
var d;
var f = null;
var o = new Object();
alert(typeof a); // string
alert(typeof b); // boolean
alert(typeof c); // number
alert(typeof d); // undefined
alert(typeof f); // object
alert(typeof o); // object