本节书摘来自异步社区《JavaScript启示录》一书中的第1章,第1.6节,作者:【美】Cody Lindley著,更多章节内容可以访问云栖社区“异步社区”公众号查看
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中所有东西都用成对象”这两个概念的误解。
相关资源:敏捷开发V1.0.pptx