JavaScript中使用class与不使用class编写代码有什么区别
核心错误说明
首先纠正两个基础认知偏差:
- 你对
Set的运行结果理解错了。Set是ES6新增的独立值集合结构,不是普通键值对对象,执行mySet.add("hello")后,内部存储的是"hello"这个值本身,不存在hello: true的键值对,你看到的{hello: true}是调试工具做的格式转换,不是代码实际运行的结构。 - 方括号属性访问语法从来不是ES6类的专属特性。你写的
car[built] = 2019报错,和是不是在类里写没有任何关系。
报错根本原因
JS里用方括号访问/赋值对象属性时,方括号内部接收的是变量或者可执行表达式,引擎会先计算括号里内容的值,再把这个值作为属性名操作。
你写car[built] = 2019时,从来没有在当前作用域定义过名为built的变量,引擎找不到这个变量,自然会抛出built is undefined的错误。
正确写法
根据你的需求,对应两种正确写法:
- 如果你就是要给
car加一个名为built的属性,直接用点语法,或者在方括号里传字符串字面量即可:
const car = { color: "red" } // 点语法直接写属性名 car.built = 2019 // 方括号传字符串字面量,效果和上面完全一致 car["built"] = 2019
- 如果你要做动态键名赋值,也就是用变量里存的值当属性名,必须先定义对应变量:
const car = { color: "red" } // 先定义变量,存你要设置的属性名 const built = "productionYear" // 这行等价于 car["productionYear"] = 2019 car[built] = 2019
你觉得这个语法只能在类里用,大概率是把类/对象字面量里的计算属性名语法和普通属性赋值搞混了。不管是在类里、对象字面量里还是普通赋值场景,只要方括号里写的是未定义的变量,都会报一样的错,不存在类专属的规则。比如下面的代码不管在哪写都会报错:
// 没定义built,不管是写在对象字面量还是类里,都会报built未定义 const car = { [built]: 2019 }
内容的提问来源于stack exchange,提问作者AshKetchup
相关产品推荐
相关产品推荐

