Javascript 基元包装类型
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。
我们应该避免在代码中创建基元包装类型。
更多建议: