百科问答小站 logo
百科问答小站 font logo



为何以下javascript代码在chrome88和firefox85中执行结果为false? 第1页

  

user avatar   tapir 网友的相关建议: 
      

路过

挺有意思的,如果是个基础知识面试题,大概有这几个层次的问题要回答。

  1. name 是什么?
  2. name 的数据类型是啥?
  3. DOMString 赋值 null 为什么会是值 "null" 而不是 null 或者是 ""?
  4. [LegacyNullToEmptyString] 是什么?
  5. DOM 值中,有哪些 DOMString 类型是标记了 [LegacyNullToEmptyString] 的?

首先,浏览器环境中,name 是 window 对象的属性,在没有 let 同名变量声明时,会get window.name 属性值。

window.name 的 idl 定义中它是个 DOMString

因此,存在设置值 V converted to DOMString 的过程

这个过程中,如果没有 idl 中特征值 [LegacyNullToEmptyString] 的情况下,会执行 ES 的 ToString(V) 方法将设置值将 V 转为 String

name 的 idl 声明中没有 [LegacyNullToEmptyString] ,因此执行 ToString(V) 后为字符串 "null",而非空或 null

具有 [LegacyNullToEmptyString] idl 定义的 DOMString 定义,则会将 null 直接转为空字符,而非执行 ToString(V)

这些特殊的 DOMString 可以看 whatwg 的 HTML5 规范中相关 idl 定义梳理,或者直接搜浏览器源码获得,比如 chromium 的

看起来也不是特别多,毕竟椒 Legacy …… 太多会交税的……


user avatar   wang-xiao-9-14 网友的相关建议: 
      

因为 name 是预设变量


       var name = fun();     

会把 name 挂载到 Window 下,所以实际上是 Window.name。而 Window.name 是一个预设的变量,这个变量返回浏览器上下文的名字( Browser context name),现代浏览器会默认返回一个空字符串。但任何给 name 新赋予的值,都会被自动 toString(),这是浏览器行为。

所以你的 console.log 里,其实是 "null" === null,当然返回就是 false 了。


举例子

       name = 123; console.log(name);   // "123"  name = /abc/; console.log(name);   // "/abc/";  name = { foo: 'bar' }; console.log(name);   // [object Object]  name = null; console.log(null);   // "null"     

所以解决方法很简单,换个变量名就行了




  

相关话题

  为什么都说富文本编辑器是天坑? 
  前端框架Stimulus的使用体验如何? 
  Promise 不能被取消,真的算是它的缺点吗? 
  如何用通俗易懂的语言解释脚本(script)是什么? 
  如何保证用户登录时提交密码已经加密? 
  程序员讨厌面试被问一些基础问题么? 
  网上常能见到的一段 JS 随机数生成算法如下,为什么用 9301, 49297, 233280 这三个数字做基数? 
  有哪些短小却令人惊叹的 JavaScript 代码? 
  Golang、Kotlin、C#、JS、Python等都有协程,市面上的协程有什么本质上的区别? 
  用 Canvas 实现虚拟列表的难点在哪里? 

前一个讨论
为什么各大互联网公司都开始造车了?在必要的技术储备等方面,互联网公司造车有哪些优势?
下一个讨论
Thinkpad上的红点会不会很鸡肋?





© 2024-09-19 - tinynew.org. All Rights Reserved.
© 2024-09-19 - tinynew.org. 保留所有权利