【问题标题】:How JS engine distinguish null from undefined [duplicate]JS引擎如何区分null和undefined
【发布时间】:2019-05-09 11:55:15
【问题描述】:

在下面的代码中 sn-p a==b 返回 true,即它们指向相同的内存位置,因此它们将具有相同的值。 我想知道,JS引擎如何知道a===b是假的。 当两种不同的类型指向同一个内存位置时,类型信息如何确定?

编辑 1: 从 cmets 看来我的问题可能不清楚。我完全理解 == 和 === 在 JS 语言使用方面的区别。我更感兴趣的是了解 JS 引擎如何为 null 和 undefined 保存类型信息。根据我的理解,变量 a 和 b 指向相同的内存位置,这就是我得到 a==b 的原因,如果这种理解有误,请纠正我。

编辑 2: 好的,我将以另一种方式提出我的问题。 typeof 运算符如何知道 a 是对象而 b 是未定义的,尽管有 a==b。

var a = null;
var b = undefined;

console.log(a==b);

console.log(a===b);

console.log(typeof a);
console.log(typeof b);

【问题讨论】:

  • 从什么时候严格相等=== 与内存位置有关?
  • == 运算符执行类型强制,所以不,它们不必指向同一个内存。
  • @Mohit == 返回 true 的事实确实 NOT 意味着它们在同一内存上。 == 返回 true 的原因是因为规范是这样说的。 “If x is null and y is undefined, return true.”。它与内存无关。
  • "根据我的理解,运行时的 1 和 "1" 类型仅由 JS 中 string 和 int 的内存分配大小的差异决定" @Mohit 我是不知道是什么给了你这样的印象。引擎如何实现它取决于特定的引擎。 (不是每个浏览器都使用相同的。)我相当有信心在内部类型只是存储在变量的值旁边。对于1 和"1",再次说明它们对于== 应该是正确的:“如果 Type(x) 是 Number 并且 Type(y) 是 String,则返回比较结果 x == !ToNumber(y)"

标签: javascript


【解决方案1】:
a = null, b= undefined;
a == b /* only check their values */
a === b /* also check their types + values */
typeof a == typeof b // false

typeof "variable" 给出变量的类型。

【讨论】:

    【解决方案2】:

    在问题中添加的代码sn-p中:

    var a = null; var b = undefined; console.log(a==b); console.log(a===b);

    console.log(a==b) 返回true 因为== 使用类型强制来检查两个变量的相等性。因此,null 和 undefined 被认为是平等的。

    console.log(a===b) 返回 false,因为 === 不使用类型强制。对于===,null 和undefined 不是同一类型,当操作数不是同一类型时,它不关心检查深度相等。

    这与内存位置无关。

    【讨论】:

    • JS 是动态类型语言,因此当从内存中加载值时,它可以根据内存分配确定其类型。这就是 JS 引擎如何知道 1 是数字,而“1”是带有 typeof 运算符的字符串。我的问题是,如果 null 和 undefined 都具有相同的值,那么在运行时如何确定类型信息。
    • @Mohit null 和 undefined 是两个不同的东西。 undefined 本身就是一种类型。这是当变量没有被分配任何值时。另一方面,null 是一个赋值和一个对象。它们根本没有相同的值。
    猜你喜欢
    • 1970-01-01
    • 2022-11-29
    • 2023-03-18
    • 2019-02-15
    • 1970-01-01
    • 2018-03-19
    • 2020-08-21
    • 1970-01-01
    • 2012-09-01
    相关资源
    最近更新 更多