【问题标题】:JavaScript: How browser consoles displays the object key valuesJavaScript:浏览器控制台如何显示对象键值
【发布时间】:2018-09-19 17:04:06
【问题描述】:

从 Chrome 控制台:

> myParam = {"test": "test value"}    
> myFunc = function(x) { myParam[x] = x; }

> myFunc("func value")
> myParam
{test: "test value", func value: "func value"} // (a) question

> myFunc(2)
> myParam
{2: 2, test: "test value", func value: "func value"}

> myFunc()
> myParam
{2: 2, test: "test value", func value: "func value", undefined: undefined} // (b) question

这是目前最新版本的 Chrome (69.0.3497.100)
请解释如何,在 JavaScript 中

a) 可以创建一个包含空格的对象成员(“myParam.func 值”)
b) 可以创建一个“未定义”的对象成员(“myParam.undefined”)
c) 对于 (b) 情况,“未定义”真的是“未定义”还是只是一个字符串“未定义”?


PS.感谢@ryanpcmcquen 的评论,以下PS


PPS. 如果字符串没有像字符串一样显示,您能否确认我的假设是 Google Chrome v(69.0.3497.100) 控制台显示错误 ,“括号之间”和红色?


PPS。
只有 Firefox 似乎可以正确显示字符串键:

Chrome、Opera

Firefox

Edge

MS IE

【问题讨论】:

  • 所有答案都可以在这里找到:Working with objects - JavaScript | MDN
  • @Andreas 幸运的是你没有给我发送google.com 作为帮助链接。 c) 问题呢?
  • 我会再次向您推荐我的链接,因为您的所有问题都会得到解答。
  • @Andreas 令人困惑的时刻是谷歌浏览器如何显示键,它应该像字符串一样显示键,因为有字符串

标签: javascript google-chrome google-chrome-devtools undefined google-chrome-console


【解决方案1】:

考虑对象foo

var foo = {};

a) 可以创建一个包含空格的对象成员(“myParam.func value”)

// You have to use square bracket notation when
// declaring properties with spaces.
foo['func value'] = 'Whatever you want.';

b) 可以创建一个“未定义”的对象成员(“myParam.undefined”)

// Keyword undefined:
foo[undefined] = undefined;
// String 'undefined':
foo['undefined'] = 'undefined';

c) 对于 (b) 的情况,“未定义”真的是“未定义”还是只是一个字符串“未定义”?

取决于你如何定义它。在您的屏幕截图中,属性值是关键字undefined,键是字符串'undefined'

要验证对象内部的类型,您可以运行:

Object.keys(foo).map(key => typeof key);
Object.values(foo).map(value => typeof value);

【讨论】:

  • remark the difference for "func value" is not a string in the OP case(在谷歌控制台中显示时不包含在括号中)
  • 所以,不是foo['func value'] = 'xxx';,而是foo[func value] = 'xxx';
  • @Serge,这不是有效的 JavaScript。 foo[func value] 表示计算的属性名称或变量。这不是这里发生的事情。
  • 查看 OP 示例 (a) 案例中的控制台输出
  • @Serge,我认为这是显示的外观,而不是错误。值得注意的是,Firefox 将对象键显示为字符串。
【解决方案2】:

这是 JavaScript 的优点之一。

a) 我们可以创建带有空格的对象键,因为对象键可以是字符串。当您想查看键为 String 的对象的值时,您需要按以下方式进行操作

var a = {
  'my key': 'my key'
  yourKey: 'your key'
}
a['my key'];
a.yourKey

b) 在 JavaScript 中 undefined 是一种数据类型,因此拥有值为 undefined 的变量是完全合法的

c) 它确实是未定义的。在此处查看更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined

【讨论】:

  • 在我的情况下是a[my key](不带括号)用于(a)情况
  • 是的,但是您将它作为参数传递给函数 - 作为 x,它的值是 string my key
  • 是的,但是您可以在控制台中看到,它不像字符串那样被括号括起来
  • JavaScript 将其视为字符串
  • 我知道这对于来自 C# 的人来说可能很奇怪。这对我来说也很奇怪,但那是 JavaScript
【解决方案3】:

让我们回答您的问题。

a)可以创建一个包含空格的对象成员(“myParam.func value”)

const myParam = {}
myParam["func value"] = 'serge';
console.log(myParam)

是的,但属性名称包含空格或连字符,或以数字开头的属性名称只能使用方括号表示法访问

b)可以创建一个“未定义”的对象成员(“myParam.undefined”)

是的。对象属性名称可以是任何有效的 JavaScript 字符串,也可以是可以转换为字符串的任何内容,包括空字符串

const myParam = {};
myParam.undefiend = 'serge';
console.log(myParam)

c) 对于 (b) 情况,“未定义”真的是“未定义”还是只是一个字符串“未定义”?

我猜是字符串“未定义”

【讨论】:

  • 对于 (b) 的情况,undefinedNOT 字符串,也不是空字符串,据我了解,但真正的 undentified
  • 是的,我的错,我真的不确定。感谢您纠正我。
  • for (c) 你问的是alpha,但实际上你认为是beta?
  • @Serge 我还有什么遗漏吗?
  • @Serge 请务必注意,javascript 对象键是远离字符串。如果您尝试使用 not 字符串的表达式从 javascript 对象中设置/获取字段,则该表达式将被 强制 转换为字符串。
【解决方案4】:

c "undefined" 的答案通常指向 "null" 值,你可以通过 console.log(null) 找到 undefined

【讨论】:

  • 在这个问题的情况下,值undefined 已被强制转换为字符串。这是因为 JS 对象属性名必须是字符串。
猜你喜欢
  • 2018-01-31
  • 1970-01-01
  • 1970-01-01
  • 2020-04-16
  • 1970-01-01
  • 2020-06-30
  • 1970-01-01
  • 2023-04-02
  • 2019-08-29
相关资源
最近更新 更多