美文网首页
基本包装类型

基本包装类型

作者: zxhnext | 来源:发表于2019-10-01 14:59 被阅读0次

    ECMAScript 提供了 3 个特殊的引用类型:Boolean、Number 和 String。

    基本类型值不是对象,因而从逻辑上讲它们不应该有方法。但是,为了让我们实现这种直观的操作, 后台已经自动完成了一系列的处理。当第二行代码访问 s1 时,访问过程处于一种读取模式,也就是要从内存中读取这个字符串的值。而在读取模式中访问字符串时,后台都会自动完成下列处理。
    (1) 创建 String 类型的一个实例;
    (2) 在实例上调用指定的方法;
    (3) 销毁这个实例。
    可以将以上三个步骤想象成是执行了下列 ECMAScript 代码。

    var s1 = new String("some text");
    var s2 = s1.substring(2);
    s1 = null;
    

    经过此番处理,基本的字符串值就变得跟对象一样了。而且,上面这三个步骤也分别适用于 Boolean 和 Number 类型对应的布尔值和数字值。

    引用类型与基本包装类型的主要区别就是对象的生存期。使用 new 操作符创建的引用类型的实例, 在执行流离开当前作用域之前都一直保存在内存中。而自动创建的基本包装类型的对象,则只存在于一 行代码的执行瞬间,然后立即被销毁。这意味着我们不能在运行时为基本类型值添加属性和方法。来看下面的例子:

    var s1 = "some text";
    s1.color = "red";
    alert(s1.color); // undefined
    

    第二行代码试图为字符串 s1 添加一个 color 属性。但是,当第三行代码再次访问 s1 时,其 color 属性不见了。问题的原因就是第二行创建的 String 对象在执行第三行代码时已经被销毁了。第三行代码又创建自己的 String 对象,而该对象没有 color 属性。

    var value = "25";
    var number = Number(value); //转型函数 
    alert(typeof number); //"number"
    
    var obj = new Number(value); //构造函数 
    alert(typeof obj); //"object"
    

    在这个例子中,变量 number 中保存的是基本类型的值 25,而变量 obj 中保存的是 Number 的实例。

    1. Boolean类型

    var falseObject = new Boolean(false);
    var result = falseObject && true;
    alert(result);  //true
    var falseValue = false;
    result = falseValue && true;
    alert(result);  //false
    

    我们使用 false 值创建了一个 Boolean 对象。然后,将这个对象与基本类型值 true 构成了逻辑与表达式。在布尔运算中,false && true 等于 false。可是,示例中的这行代码是对 falseObject 而不是对它的值(false)进行求值。前面讨论过,布尔表达式中的所有对象都会被转换为 true,因此 falseObject 对象在布尔表达式中代表的是 true。结果,true && true 当然就等于 true 了。
    基本类型与引用类型的布尔值还有两个区别。首先,typeof 操作符对基本类型返回"boolean", 而对引用类型返回"object"。其次,由于 Boolean 对象是 Boolean 类型的实例,所以使用 instanceof 操作符测试 Boolean 对象会返回 true,而测试基本类型的布尔值则返回 false。例如:

    alert(typeoffalseObject); //object 
    alert(typeof falseValue); //boolean 
    alert(falseObject instanceof Boolean); //true 
    alert(falseValue instanceof Boolean); //false
    

    理解基本类型的布尔值与 Boolean 对象之间的区别非常重要——当然,我们的建议是永远不要使 用 Boolean 对象。

    2. Number类型

    var numberObject = new Number(10);
    var numberValue = 10;
    alert(typeof numberObject);   //"object"
    alert(typeof numberValue);    //"number"
    alert(numberObject instanceof Number);  //true
    alert(numberValue instanceof Number);   //false
    

    在使用 typeof 操作符测试基本类型数值时,始终会返回"number",而在测试 Number 对象时, 则会返回"object"。类似地,Number 对象是 Number 类型的实例,而基本类型的数值则不是。

    相关文章

      网友评论

          本文标题:基本包装类型

          本文链接:https://www.haomeiwen.com/subject/hduructx.html