JS构造函数创建实例输出键名无引号问题咨询
问题原因
你观察到的现象由两个核心原因导致,和构造函数本身的逻辑正确性无关:
- 控制台打印原生JavaScript对象时,默认展示规则不会给符合合法标识符规范的键名包裹引号,只会以
key: value的形式展示,这是控制台的可视化渲染逻辑,不代表对象内部的键名存储存在错误。 - 你的代码本身存在键名不匹配的问题:构造函数中给实例挂载的属性是小写开头的
title和rating,和你预期的Title键名完全不一致,自然不会得到对应键名的结果。 - 额外逻辑问题:
map+filter返回的本身已经是数组,你调用filteredList.push(var1)会把整个数组作为单个元素存入,最终得到嵌套的二维数组;同时你用parseInt处理小数评分会丢失小数部分,逻辑存在隐患。
解决方法
按以下步骤调整即可:
- 修正构造函数的属性名,和你预期的键名保持一致
function Movie(Title, imdbRating) { this.Title = Title; this.imdbRating = imdbRating; }
- 修正数组处理逻辑,避免生成二维数组,同时用
parseFloat处理浮点评分
const watchList = [{ "Title": "Inception", "imdbRating": "8.8" }] const filteredList = watchList .map(function(element) { return new Movie(element["Title"], element['imdbRating']) }) .filter(function(elem) { return parseFloat(elem.imdbRating) >= 8.0 })
- 如果你需要得到键名带双引号的标准
"key": "value"格式,不要直接打印原生JS对象,调用JSON.stringify()将对象转为标准JSON字符串后输出即可,该方法生成的字符串会自动给所有字符串类型的键、值包裹双引号:
// 第三个参数2表示格式化缩进2个空格,方便阅读 console.log(JSON.stringify(filteredList, null, 2))
补充说明:不要把控制台的对象展示格式和JSON格式混淆。JSON是一种数据序列化格式,有严格的引号要求;而原生JS对象在控制台的展示只是给开发者看的调试视图,只要你能通过
.或者[]语法正常取到属性值,对象结构就是合法可用的,不需要纠结展示时有没有引号。
内容的提问来源于stack exchange,提问作者sys0rpheus
相关产品推荐
相关产品推荐

