Javascript 高级编程 4章68页 【基本类型的值】【引用类型的值】

119 阅读2分钟

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类型的对象吗