为什么在javascript中读取属性有时会抛出错误?

Why does reading a property sometimes throw an error in javascript?

本文关键字:出错 错误 javascript 读取 属性 为什么      更新时间:2023-09-26

假设我有一些变量:

var s = 's', i = 0, o = {}, a = [], n = null, nan = NaN, u;

我怎么能使任何意义读取x.p将返回未定义,当它会抛出一个TypeError ?

s.p;  // undefined
i.p;  // undefined
o.p;  // undefined
a.p;  // undefined
n.p;  // TypeError!
nan.p;  // undefined
u.p;  // TypeError!

注:nullundefined是唯一奇怪的值吗?还有其他的吗?

编辑

我意识到,通过像我这样声明变量,我的一些值已经被对象自动包装(例如Number),尽管它们是原语。因此,我可以把它们当作"适当的"对象(例如{}, []),并尝试读取它们的属性。但我找不到太多解释什么是这样包装的,什么不是这样包装的

是的,nullundefined是唯一在属性访问中使用时会抛出异常的值。点和括号属性访问器调用内部CheckObjectCoercible函数,定义如下:

抽象操作CheckObjectCoercible将抛出错误参数是不能使用转换为Object的值ToObject。它由表15定义:

Table 15 — CheckObjectCoercible Results
Argument Type | Result
--------------+------------------
Undefined     | Throw a TypeError exception.
Null          | Throw a TypeError exception.
Boolean       | Return
Number        | Return
String        | Return
Object        | Return

nullundefined是表示Nothing的值,不能转换为对象(如您所说的"包装")。请注意,您当然可以有一个具有现有属性的对象来抛出访问,例如

var o = {get p() { throw new TypeError("you may not access this"); }};
o.p // TypeError

当你读取未定义的属性时。你在说:

什么是undefined或undefined?或者在null的情况下,null的未定义是什么?undefined和null都不是对象,因此你不能设置或从中获取属性。考虑到这一点,就会抛出一个错误。

当对象为null/undefined时,它将抛出错误,因为它将尝试访问一个不存在的对象的属性

在其他情况下,它将尝试访问现有对象的属性并返回undefined,因为没有找到该属性。

请注意,js中的几乎所有东西都是对象,正如你在这里看到的。

我们先从

开始

why undefined on:

 var s='s';

您将s赋值给string,它是基本类型。从某种意义上说,Javascript在这里很棘手。虽然是基本类型,但当您尝试通过以下方式访问该属性时:

    s.p

首先在内部完成:

    String(s)

创建对象然后试着看它是否有那个属性当然它没有定义,所以你得到了undefined。几乎类似的事情也发生在数值赋值和NAN中。

For n=null:

如果你这样做:

 var n=null;
 typeof n;//"object"
 n.p// throws typeerror

实际上,null可以被认为是一种特殊类型的对象,没有任何属性或方法来表示不存在值,因此,当您试图访问null的任何属性时,您会得到类型错误。

a.p
o.p

可以很容易地看到,您正在尝试访问一个对象的属性,而不是未定义或非内置的,因此它应该显示为未定义。你应该感到惊讶的是,除了看到:D。

对于这里的其他答案,有一种简单的方法可以检查属性访问是否会抛出异常。简单地将您不确定的值与null进行比较,如下所示:

if(x != null) { // note the LOOSE equality, rather than !==
    // do something with x.prop
}

这样做的原因是只有nullundefined *在属性访问时抛出错误,并且它们只是松散地相等。参见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_when_to_use_them。

*还有一种情况是,一些JS对象显然可以"模拟"未定义,在这种情况下,它们也松散地等于nullundefined

相关文章: