【问题标题】:When object property is not defined then console.log(obj.property) gives "undefined", why?当未定义对象属性时,console.log(obj.property) 给出“未定义”,为什么?
【发布时间】:2016-08-01 08:38:32
【问题描述】:

假设我们有,

    var obj = {
      name: "AKS"
    };
    console.log(obj.name);
    console.log(obj.lname);

输出:

     AKS
     undefined

如果我们这样做,还有什么地方:

var func = function() {
  var name = "AKS";
};
console.log(name);

输出:

error: name is not defined
  1. 在第一个 sn-p 中,未定义 obj 属性 lname。那为什么 不抛出错误?
  2. 在第二个 sn-p 中,名称未在 函数范围,也不在全局范围内。因此错误是 预计。

两者的基本区别是什么? 提前致谢。

【问题讨论】:

  • 终于找到了答案。 当解释器发现一个对象试图访问一个属性(newObj.prop)时,它首先查看该属性是否直接定义在该对象上。如果没有找到,它会查找 Prototype 对象。如果它在那里找到它会重新运行该值,否则返回 undefined

标签: javascript javascript-objects


【解决方案1】:

这就是定义行为的方式。如果您访问对象上未定义的属性,它将返回值undefined。但是,如果您尝试使用不存在(即从未定义过)的本地定义的符号名称(又名变量),那就是错误。

为什么语言设计者决定最好通过尝试访问该属性来测试属性是否存在,这是任何人的猜测。但是,引发错误的不存在变量是跨语言的非常标准的行为。

请注意,未定义的属性行为不适用于所有类型。最值得注意的是,您无法访问undefined 上的属性,它会产生错误。所以foo.bar.baz 其中barundefined 会产生错误。

【讨论】:

  • 在 javascript 中并非如此。如果“使用严格”;不使用,则当对未声明的变量执行读操作时会抛出错误,但是,如果对未声明的变量执行写操作,则该变量将置于全局范围内,将对变量执行写操作。
  • 还有in 运算符。
  • @Aks, gca 是的,对于更详细的行为,有一千个警告......但是,我不会在这里背诵整个 ECMAScript 规范和所有使用模式。
【解决方案2】:

如果你使用严格模式,它可能会给你错误然后对象是sealedfrozen

【讨论】:

  • 我明白这一点,但我想了解这里的行为。谢谢
猜你喜欢
  • 2020-01-05
  • 2020-04-14
  • 1970-01-01
  • 2021-11-10
  • 2012-01-10
  • 2021-08-16
  • 2019-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多