创建对象时为何要加括号?移除new String()外层括号会产生什么影响?
关于JavaScript中new表达式外层加括号的问题解答
外层括号的作用
这层括号的核心作用是显式指定表达式的求值顺序,避免JavaScript内置的运算符优先级规则引发非预期的代码解析结果。
首先要明确两个运算符的优先级规则:
- 带参数的
new表达式(比如new Foo(arg))和成员访问运算符.优先级相同,结合性为从左到右 - 如果构造函数本身是某个对象的属性(需要通过
.访问获取),没有括号的话会直接出现解析错误
举个实际场景的例子:
// 构造函数挂载在自定义工具对象下 const utils = { MyString: function(str) { this.content = str } } // 给原型加自定义方法 utils.MyString.prototype.toUpper = function() { return this.content.toUpperCase() }
如果我们要创建实例后调用toUpper方法:
- 加括号的写法:
const res = (new utils.MyString('test')).toUpper(),会被正确解析为「先创建utils.MyString的实例,再调用实例的toUpper方法」,运行结果为TEST - 不加括号的写法:
const res = new utils.MyString('test').toUpper(),会被错误解析为「先执行utils.MyString('test').toUpper拿到方法,再把这个方法作为构造函数执行new操作」,直接抛出类型错误。
你的示例代码删除括号后的变化
你给出的原始代码:
var upper = (new String(str)).toUpperCase();
删除外层括号后变成:
var upper = new String(str).toUpperCase();
在这个特定场景下,两段代码的运行结果完全一致,没有任何变化。
原因是String是全局顶层构造函数,不需要通过.访问获取,按照同优先级左结合的规则,会先执行new String(str)创建实例,再调用实例的toUpperCase方法,和加括号的执行逻辑完全相同。
这个场景下加括号属于防御性编码习惯,作用是提升代码可读性,显式告知其他开发者求值逻辑,也避免后续修改代码把String替换为其他挂载在对象下的构造函数时出现解析错误。
内容的提问来源于stack exchange,提问作者Anas Roshdi
相关产品推荐
相关产品推荐

