所以我正在尝试创建一个温度转换函数,该函数接受具有数字温度属性和华氏度或摄氏度表示属性作为参数的对象(var 温度),但是当我稍后提醒函数时,它只返回 [对象对象]。我不确定如何访问温度中的特定属性,因为它说如果我不使用 for...循环中。下面是我让函数返回一个包含转换后的数字温度值以及更改的 tempUnits 属性值的对象的最佳尝试。感谢您的帮助!
var temperature = {
temp: 75,
tempUnits: "f" // means Fahrenheit (°F) or Celsius (°C), °F here.
};
// (°F - 32) * (5/9) = °C
// (°C) * (9/5) + (32) = °F
var convertTemperature = function (object) {
for (var prop in object) {
if (object[prop] === "f") {
var temperatureC = {
temp: (((object[prop]) - 32) * (5 / 9)),
tempUnits: "c"
};
return temperatureC;
} else if (object[prop] === "c") {
var temperatureF = {
temp: (((object[prop]) * (9 / 5)) + 32),
tempUnits: "f"
};
return temperatureF;
}
}
};
alert(convertTemperature(temperature)); // returns [object Object]
你以一种非常奇怪的、迂回的方式做到这一点:
var temperature = {
temp: 75,
tempUnits: "f" // means Fahrenheit (°F) or Celsius (°C), °F here.
};
// (°F - 32) * (5/9) = °C
// (°C) * (9/5) + (32) = °F
var convertTemperature = function (o) {
var val = o.temp;
if (o.tempUnits === 'f') {
return temperatureC = {
temp: ((val - 32) * (5 / 9)),
tempUnits: "c"
};
} else {
return {
temp: ((temp * (9 / 5)) + 32),
tempUnits: "f"
};
}
};
var o = convertTemperature(temperature);
alert(o.temp + ' ' + o.tempUnits);
JavaScript 类型强制的另一个有趣例子,它掩盖了新手错误的本质!
每当你在 JS 程序的输出中看到"[object Object]"
时,你都有一个类型不匹配,其中非原始对象被放置在需要字符串的地方(除非你想具体查看"[object Object]"
)。 在您的情况下,convertTemperature
返回一个对象; alert
需要一个字符串。 可悲的是,alert
没有举起某种危险信号,而是默默地将你的对象(或数字,或你拥有的东西)强行塞成一根绳子。 除非您覆盖对象上的toString
,否则它将始终被强制"[object Object]"
。
但是,问题的根源似乎是对JS中对象语法的根本误解。 如果您发布的代码导致您选择引入for
循环,我相信我们会看到一个明显的(对 JS 老手来说)错误,该错误首先导致了问题。 我敢打赌你尝试过这样的事情:
if (temperature[tempUnits] === "f") {
访问名为 temperature
的对象名为 tempUnits
的属性的正确语法是 temperature.tempUnits
或完全等效的temperature["tempUnits"]
。 当你写temperature[tempUnits]
时,JS认为你有一个名为tempUnits
的其他变量,你试图将其值用作属性名。 由于没有这样的变量,因此tempUnits
的值是undefined
的 - 这不是temperature
的属性。
在以下最后一行:
var convertTemperature = function (object) {
for (var prop in object) {
if (object[prop] === "f") {
var temperatureC = {
temp: (((object[prop]) - 32) * (5 / 9)),
object[prop]
的值是 'f'
。你想要的是object['temp']
或只是object.temp
.
由于您传递的是具有固定属性名称的对象,因此只需执行以下操作:
function convertTemperature(obj) {
if (obj.tempUnits == 'f') {
return {temp: (obj.temp - 32) * 5 / 9, tempUnits: 'c'};
}
return {temp: obj.temp * 9 / 5 + 32, tempUnits: 'f'};
}
alert(convertTemperature({temp:212,tempUnits:'f'}).temp); // 100