Javascript 基元包装类型

由 alexbro 创建,youj 最后一次修改 2017-01-06

Javascript面向对象设计 - JavaScript基元包装类型


有三种基元包装类型:String,Number和Boolean。

它们是存在用于处理原始值的引用类型。

在读取字符串,数字或布尔值时,会在幕后自动创建原始包装类型。

我们可以创建一个原始字符串值并将其赋给一个变量。 然后像一个对象一样处理变量,并使用点符号调用其函数。

例子

var name = "Javascript"; 
var firstChar = name.charAt(0); 
console.log(firstChar);      

上面的代码生成以下结果。


注意

以下代码是幕后发生的:

var name = "Javascript"; 
var temp = new String(name); 
var firstChar = temp.charAt(0); 
temp = null; 
console.log(firstChar);   

要测试这一点,请尝试向字符串添加属性,就像它是常规对象一样:

var name = "Javascript"; 
name.last = "CSS"; 

console.log(name.last);   // undefined 

上面的代码生成以下结果。

上面的代码尝试将属性 last 添加到字符串 name

当使用常规对象时,我们可以随时添加属性。

使用原语wrapper类型,属性消失,因为对象上属性被分配后立即被销毁。

这里是JavaScript引擎中实际发生的事情:

// what the JavaScript engine does 
var name = "Javascript"; 
var temp = new String(name); 
temp.last = "CSS"; 
temp = null;                            // temporary object destroyed 

var temp = new String(name); 
console.log(temp.last);                 // undefined 
temp = null; 

虽然对原始值自动创建引用值,但这些值的 instanceof 返回false:

var name = "Javascript"; 
var count = 10; 
var found = false; 

console.log(name instanceof String);    // false 
console.log(count instanceof Number);   // false 
console.log(found instanceof Boolean);  // false 

上面的代码生成以下结果。

instanceof运算符返回false,因为只有在读取值时才创建临时对象。

注意

我们可以创建原始包装器  类型手动,但有一定的副作用:

var name = new String("Javascript"); 
var count = new Number(10); 
var found = new Boolean(false); 

console.log(typeof name);           // "object" 
console.log(typeof count);          // "object" 
console.log(typeof found);          // "object" 

上面的代码生成以下结果。

我们不能使用String,Number和Boolean对象将原始值。

例如,以下代码使用Boolean对象。


var found = new Boolean(false); 
if (found) { 
   console.log("Found");       // this executes 
} else{
   console.log("Not Found");       // this executes 
}

上面的代码生成以下结果。

布尔对象是 false ,但 if(found) return true

对象表示为false没有关系; 它是一个对象,所以它的最终计算结果为true。

我们应该避免在代码中创建基元包装类型。

以上内容是否对您有帮助:
硅心科技
二维码
建议反馈
二维码