You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建对象时为何要加括号?移除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 17:27:04