引用类型-基本包装类型

什么是基本包装类型

为了便于操作基本类型值ECMAScript中提供了三个特殊的引用类型值:boolean、string、number。这三个值就是基本数据类型boolean、string、number的对象模式。

每当读取一个基本类型值的时候,就会在后台创建一个对应的基本包装类型对象。

 

var string = 'this is a string';
var result = string.substring(2);
alert(result);

 

 

我们知道基本类型的值并不是对象,所以没有方法。但是以上代码却调用了字符串的substring()方法,这就显得很奇怪。

这里的过程是这样的,第二行访问string的时候,即在调用string上的方法的时候,处于一种读取模式,也就是从内存中读取字符串的值。读取模式访问字符串的时候会在后台完成如下操作:

1、创建String()类型的一个实例

2、在实例上调用指定的方法

3、销毁这个实例

var string = new String('this is a string');
var result = string.substring(2);
string = null;
alert(result);

引用类型和基本包装类型(基本类型值对应的引用类型)有一个最主要的区别就是对象的生存期。

使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前一直保存在内存中。而自动创建的基本包装类型值的对象,则只存在一行代码的执行瞬间然后立即被销毁。所以不能在运行时给基本类型值添加方法。

var string = 'this is a string';
string.name = 'string';  //自动生成的,赋值后就销毁,生存期只在这一行
alert(string.name);  //undefined
var arr = ['yellow', 'red'];
arr.name = 'arr';
alert(arr.name);  //arr

上面的代码可以看到,在为基本类型值添加属性,在进行访问的时候属性值为undefined。因为在第二行代码为string添加name属性的时候,创建了一个基于stirng的基本包装类型对象,然后这行代码执行完毕的时候立即被销毁,第三行访问的时候,又基于string创建了一个基本包装类型对象,但是这个对象上面是没有name属性的。

基本包装类型的创建

注意:可以显示的创建基本包装类型的对象。即以这种方式:

 

var string = new String('this is a string');
string.name = 'liudehua';
alert(string.name);  //这样就是一个对象,可以添加属性和方法

 

但是只有在必要的情况下用显示调用Boolean、String、Number这些构造函数来创建基本包装类型。因为这样会使人分不清处理的是基本类型值还是引用类型值。

并且在typeof检测数据类型的时候,对基本包装类型都是object,不容易区分到底是何种基本类型值。

最后要注意的是,所有的基本包装类型都会被转换成布尔值true。

var booleanFalse = new Boolean(false);
if(booleanFalse) {
    alert('虽然是false但是被自动转换成了true,我还是执行了。');
}
alert(typeof booleanFalse);  //我并非boolean,因为我现在是基本包装类型。

使用new操作符调用基本包装类型的构造函数会创建对应的基本包装类型的对象。但是如果省略了new,那么就是调用了相应的转型函数。String()转换成字符串、Number()转换成数字、Boolean()转换成布尔值。

 

var string1 = new String('this is a string');
var string2 = String(123456);
alert(typeof string1);  //Object
alert(typeof string2);  //string

 

也可以通过给构造函数Object()传递不同的参数创建不同的基本包装类型,即传递布尔值就是布尔值的基本包装类型。

var string = new Object('this is a string');
alert(string instanceof String);
var boolean = new Object(true);
alert(boolean instanceof Boolean);
var number = new Object(1123);
alert(number instanceof Number);

基本包装对象的实例方法继承于Objec.prototype。

valoeOf()方法,返回基本包装类型值对应的基本数据类型。

 

var string = new String('this is string');
var result = string.valueOf();
alert(typeof result);  //string,返回的是字符串string,即构造函数传递的参数。

 

toString()方法,就是返回实例对应的字符串形式。

var number = new Number(123);
var result = number.toString();
alert(typeof result);

如果对基本包装类型和基本类型的值进行混合运算,会将基本包装类型的值调用valueOf()方法将其转换为基本类型的值。

var number = new Object(123);
var num = 123;
alert(number + num);  //对象和基本类型值相加,不可想象,但是自动转换了
var string = new String('this is a');
var str = ' string';
alert(string + str);  //同样的道理完成字符串拼贴

可以通过为基本包装类型的原型上添加方法,以便基本类型的值调用。

Number.prototype.sum = function(value) {
    if(typeof value == 'string') {
        return '请输入正确的数字';
    }
    if(typeof value == 'number') {
        return this + value;
    }
}
var num = 23;
var result = num.sum(27);
alert(result);

Boolean类型

如前所属创建基本基本包装类型,但是这种显示的方法要很少用,因为会早成误解。

 

var boolean = new Boolean(false);
var result = boolean && true;  //前面说过所有的基本包装类型对象都会被转换成布尔值true,即使传递的参数是false也会被转换成true。所以,result为true。
alert(result);

 

如果是基本类型的值就不会出现这种情况

var boolean = false;
var result = boolean && true;
alert(result); //false

基本类型值和引用类型值的布尔值的两个区别,typeof和instanceOf

var boolean = new Boolean(true);
var bool = true;
alert(typeof boolean);  //object
alert(typeof bool);  //boolean
alert(boolean instanceof Boolean);  //true,boolean对象是Boolean构造函数的实例。
alert(bool instanceof Boolean);  //false,基本类型值不是对象。

Bollean的valueOf()方法,和toString()方法。

刚才已经说过这两个方法,现在更具体一些,boolean的valueOf()方法返回布尔值true和false,toString()方法返回字符串‘true’和‘false’。

var boolean = new Boolean(true);
var resultToV = boolean.valueOf();
var resultToS = boolean.toString();
alert(typeof resultToV);  //boolean,转换成布尔值
alert(typeof resultToS);  //stirng,转换成字符串

将Boolean构造函数当作转型函数使用。

特殊值undefined和null、NaN、空字符串、0,false会被转换成false。

 

alert(Boolean(undefined))
alert(Boolean(null));
alert(Boolean(NaN));
alert(Boolean(''));
alert(Boolean(0));
alert(boolean(false));

 

为0任意数字,非空任意字符串、对象(object对象,数组对象,函数对象,正则),true都会被转换成true。

alert(Boolean(12));
alert(Boolean(' '));
alert(Boolean([]));
alert(Boolean({}));
alert(Boolean(function() {}));
alert(Boolean(/a/));
alert(Boolean(true));

使用双重的否运算符也可以实现转型函数Boolean的效果,转换规则和使用Boolean转型函数时没什么不同。

alert(!!undefined);  //false
alert(!!null);  //false
alert(!!NaN);  //false
alert(!!'');  //false
alert(!!0);  //false
alert(!!false); //false

alert(!!' ');  //true
alert(!!12);  //true
alert(!![]);  //true
alert(!!{});  //true
alert(!!function(){});  //true
alert(!!/at/);  //true
alert(!!true); //true

转型函数接收的特殊值undefined和null或者NaN都会被转换成false,但是使用构造函数的时候,创建的所有包装类型都会转换成true。这点在进行判断的时候要注意。

var boolean = new Boolean(undefined);  //转换成true
var bool = Boolean(undefined);  //转换成false

if(boolean) {
    alert('zhixing');
}
if(bool) {
    alert('buhuizhixing')
}

 

posted @ 2017-02-22 11:21  398883362  阅读(88)  评论(0)    收藏  举报