本节书摘来自异步社区《JavaScript启示录》一书中的第1章,第1.6节,作者:【美】Cody Lindley著,更多章节内容可以访问云栖社区“异步社区”公众号查看
1.6 从构造函数创建字面量值
JavaScript提供了叫做“字面量”的快捷方式——用于创建大多数原生对象值,而不必使用new Foo()或new Bar()这样的方式。大多数情况下,字面量语法与使用new操作符的效果相同。但是也有例外:Number()、String()和Boolean(),请看下面的注释。
如果你有其他编程背景,可能更熟悉用字面量方式创建对象。下面我使用new操作符实例化原生JavaScript构造函数,然后创建相应的字面量等价形式。
<!DOCTYPE html><html lang="en"><body><script>
var myNumber = new Number(23); // 对象
var myNumberLiteral = 23; // 原始数字值,而非对象
var myString = new String('male'); // 对象
var myStringLiteral = 'male'; //原始字符值,而非对象
var myBoolean = new Boolean(false); // 对象
var myBooleanLiteral = false; //原始布尔值,而非对象
var myObject = new Object();
var myObjectLiteral = {};
var myArray = new Array('foo', 'bar');
var myArrayLiteral = ['foo', 'bar'];
var myFunction = new Function("x", "y", "return x*y");
var myFunctionLiteral = function (x, y) { return x * y };
var myRegExp = new RegExp('\bt[a-z]+\b');
var myRegExpLiteral = /\bt[a-z]+\b/;
// 验证创建自同样的构造函数的字面量
console.log(myNumber.constructor, myNumberLiteral.constructor);
console.log(myString.constructor, myStringLiteral.constructor);
console.log(myBoolean.constructor, myBooleanLiteral.constructor);
console.log(myObject.constructor, myObjectLiteral.constructor);
console.log(myArray.constructor, myArrayLiteral.constructor);
console.log(myFunction.constructor, myFunctionLiteral.constructor);
console.log(myRegExp.constructor, myRegExpLiteral.constructor);
</script></body></html>
这里你需要注意的是,在一般情况下,使用字面量只是隐藏了与使用new操作符相同的基本过程。重要的是,它方便多了!
但在原始字符串、数字和布尔值方面,事情变得更复杂了。在这些情况下,字面量值具有原始值的特点,而不是复杂对象值的特点。请查看如下注意事项。
注意
在针对字符串、数字和布尔值使用字面量值时,只有在该值被视为对象的情况下才会创建实际的复杂对象。换句话说,在尝试使用与构造函数有关联的方法或检索属性(如var charactersInFoo = 'foo'.length)之前,一直在使用原始数据类型。当这种情况发生时,JavaScript会在幕后为字面量值创建一个包装器对象,以便将该值视为一个对象。调用方法以后,JavaScript即抛弃包装器对象,该值返回字面量类型。这就是字符串、数字和布尔被认为是原始(或简单)数据类型的原因。我希望这能够澄清对“JavaScript中的所有东西都是对象”与“JavaScript中所有东西都用成对象”这两个概念的误解。