最详细的JavaScript高级教程(八)值类型和引用类型

值类型和引用类型

在js中,除了Object,其他五种基本类型都是值类型,包括String也是值类型。

注意:

  • 允许给引用类型动态的添加属性值,不允许给值类型添加属性值。
    // 基本类型,不能添加属性,会报错
    var test = "sss";
    test.name = "W";
    alert(test.name);
    
    // 引用类型,可以动态添加属性,输出正常
    var test = new Object();  
    test.name = "W";
    alert(test.name);
    
  • 值类型是复制值,引用类型是复制指针,这个跟其他语言都是一样的,举个例子看一下就行了
    // 引用类型复制指针
    var a1 = new Object();
    a1.name = "W";
    var a2 = a1;
    a2.name = "H";
    alert(a1.name); // 输出H
    
    // 值类型复制值
    var a1 = "W";
    var a2 = a1;
    a2 = "H";
    alert(a1);  // 输出W
    

Object的检测类型

我们之前讲过typeof来判断类型,它是用来判断基本类型的,如果我们想知道Object对象具体是什么类型,就需要用到instanceof。

instanceof检测对象原型链上的类型信息。

给值类型使用instanceof会返回false

实例操作

  • 创建实例
    // 方法1
    var obj = new Object();
    obj.name = "T";
    // 方法2,与方法1等价
    var obj = {};
    obj.name = "T";
    // 方法3
    var obj = {
        name : "T",
        age : 11
    }
    // 方法4,属性名加不加引号最后都会转化为字符串处理
    var obj = {
        "name" : "T",
        "age" : 11
    }
    
  • 使用对象传递参数,判断该属性是否存在
    // 当我们使用对象作为函数参数传递的时候,因为js的对象并不需要定义,所以在使用的时候有可能某个属性没有定义就使用导致错误,我们可以使用typeof巧妙的判断
    function displayInfo(args){
        var output = "";
        if(typeof args.name == "string"){
            output += "Name: " + args.name;
        }
    
        if(typeof args,age == "number"){
            output += "Age: " + args.age;
        }
        alert(output);
    }
    
  • 使用数组的形式访问属性
    // 可以使用中括号访问对象的属性
    // 使用这种方式有两种场景
    // 1. 属性名是变量 2.属性名中有空格等特殊字符
    var person = {
      name: '12'
    };
    person['name'] = '34';
    console.log(person.name);
    // 属性名是变量
    var test = 'name';
    console.log(person[test]);
    // 属性名有特殊字符
    // 注意有特殊字符的时候不能使用对象加点访问属性的方式
    person['test property'] = '123';
    console.log(person['test property']);
    

你可能感兴趣的:(JavaScript高级编程)