JS红宝书-- 4.1 基本类型和引用类型

  • 基本数据类型: UndefinedNull、'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被复制给参数numnum在函数内加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

你可能感兴趣的:(JS红宝书-- 4.1 基本类型和引用类型)