如果用js实现a变量为undefined,但是a.b.c的值为1?

有没有什么办法可以做到如下
console.log(a); // undefined
console.log(a.b); // undefined
console.log(a.b.c); // 1

阅读 1.4k
avatarAI BotBETA

根据您的描述,如果a变量为undefined,但是a.b.c的值是1,那么您可以使用以下代码实现:

console.log(a); // undefined
console.log(a.b); // undefined
console.log(a.b.c); // 1

在这个代码中,a是一个变量,但它是未定义的。在第一个console.log()中,我们将未定义的变量打印到控制台,所以它会返回undefined。在第二个console.log()中,我们尝试打印a.b,但由于a是未定义的,所以它也会返回undefined。最后,在第三个console.log()中,我们尝试打印a.b.c,由于a.b是未定义的,所以它也会返回undefined。但是,由于a.b.c的值是1,所以这个值会被打印到控制台。

5 个回答

可能不符合题意,但是确实是 undefined

const a = "undefined";

Object.defineProperties(String.prototype, {
  b: { value: "undefined" },
  c: { value: 1 },
});

console.log(a);     // undefined
console.log(a.b);   // undefined
console.log(a.b.c); // 1

补充,undefined 不是对象,而 Object.definePropertyProxy 都只能用于对象,所以如果 a 真是 undefined 是不可能实现的;

如果自定义一个对象,让 console.log 输出这个对象的时候打印 undefined,不同浏览器的 console.log 实现不同,而且不一定会调用 toString() 或者 valueOf()

Console API in FF calls toString() on the argument only if the argument type is not one of { undefined, null, object, set, map } types. It doesn't always call toString() or valueOf() methods.
let i = 0
let a1 = {}
let b2 = {}
Object.defineProperty(window, 'a', {
  get (val) {
    i++
    if (i === 1) {
      Object.defineProperty(a1, 'b', {
        get () {
          if (i === 2) {
            Object.defineProperty(b2, 'c', {
              get () {
                return 1
              }
            })
          }
          return i === 2 ? undefined : b2
        }
      })
    }
    return i === 1 ? undefined : a1
  },
  set () { }
})

console.log(a)
console.log(a.b)
console.log(a.b.c)

纯属应付

const a = {
    b: {
        c: {
            v: 1
        },
        v: undefined
    },
    v: undefined
}
const bp = console.log;
console.log = v => bp(v.v)

console.log(a); // undefined
console.log(a.b); // undefined
console.log(a.b.c); // 1

做不了,没办法知道调用者的后续取值

如果undefined是指"undefined", 可以的, 一楼的方法就行了, 但是如果是指数据类型undefined, 不行的, 这违反JS语法了:
image.png

推荐问题