JavaScript中有没有用于未定义数据类型的内置方法



问这个问题,我想评估以下陈述的正确性或错误性:"JavaScript中的每种数据类型都有内置的方法;在JavaScript中的数据类型中未定义。我试图为一个";未定义的";但它似乎是唯一一个没有的基元类型。或者有一些?

let undef = void 0; 
console.log(undef.anyPotentialBuildInMethod());

是否有任何";anyPotentialBuildInMethod((";是否存在?

方法是作为对象属性的函数。

尝试读取undefined任何属性会引发异常。

undefined没有内置方法,因此不能分配任何方法。

const foo = undefined;
console.log(foo.sampleMethod);

虽然看起来是这样,但并不是Javascript中的所有东西都是对象。基元值(如"foo"12.34undefined等(不是对象,不能具有方法或属性。然而,当您访问对象的属性时,Javascript通过将基元值动态装箱(或"强制"(到对象中来隐藏这一事实。所以当你做时

x = "foo".length

实际发生的是

1. temp = new String("foo")  // dynamically coerce a primitive value into an object
2. x = temp.length           // get a property of that object
3. destroy temp              // delete a temporary object

(当然,Javascript引擎实际上并没有分配然后丢弃这些临时对象,这只是标准定义的算法,请参见下面的(1((。

两个基元值:nullundefined是该规则的例外:任何强制它们的尝试都会导致TypeError。所以当你做时

x = undefined.something

Javascript试图创建一个临时对象,就像上面的步骤1一样,但失败了。

底线是:nullundefined不能有属性,因为它们是基元值,不能转换为对象。

参考文献:

  1. https://262.ecma-international.org/11.0/#sec-获取值
  2. https://262.ecma-international.org/11.0/#sec-使用标识符密钥评估属性访问
  3. https://262.ecma-international.org/11.0/#sec-可强制的

否,未定义的属性访问总是在符合标准的引擎中抛出TypeError

来自ECMA-262,第11版,§12.3.2.1:

MemberExpression

[…]

  1. 是否返回?EvaluatePropertyAccessWithExpressionKey(baseValueExpressionstrict(

[…]

MemberExpression成员表达式标识符名称

[…]

  1. 是否返回?EvaluatePropertyAccessWithIdentifierKey(baseValueIdentifierNamestrict(

在§12.3.3和§12.3.4中都有:

bv是?RequireObjectCoercible(baseValue(。

在§7.2.1中,我们有:

如果参数是无法使用ToObject转换为Object的值,则抽象操作RequireObjectCoercible将引发错误。由表15定义:

表15:RequireObject强制结果

参数类型未定义引发类型错误异常Null引发TypeError异常

我不确定你问这个问题的原因,但是,为了让你更好地理解,你试图做的事情就像试图(但不一样(找到一个'x'值,这样(0*x(!=0;0是0,无论你用什么作为"x",你都得到0。javascript中的"undefined"var不算什么。这是因为"var"没有类型,它可以是字符串、整数、对象、函数ecc-

你可以做

var test = "test";
console.log(test);
test = 1;
console.log(test);

等等,你就不会出错。var在执行时被省略,而未定义的var只是一个指向任何东西的指针,所以在中不能有函数或属性

最新更新