百科问答小站 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"     

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




  

相关话题

  用 // 代替 http:// 有什么好处? 
  对于一般程序员来说,怎么防止为了潮流技术 疲于奔命? 
  请问一下各位大佬,js的静态方法有啥作用呀,写工具类吗,小菜鸡想不出来静态方法有啥作用? 
  如何评价华为新开源的鸿蒙方舟JS运行时(Ark JS Runtime)? 
  为什么尤大说react的性能不如vue? 
  TypeScript + Node.js 是否适合开发大型项目? 
  为什么JavaScript不能成为自己的标准,非得冒出ES6成为JavaScript的标准呢? 
  网上常能见到的一段 JS 随机数生成算法如下,为什么用 9301, 49297, 233280 这三个数字做基数? 
  如何衡量一个人的 JavaScript 水平? 
  前端框架Stimulus的使用体验如何? 

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





© 2025-04-16 - tinynew.org. All Rights Reserved.
© 2025-04-16 - tinynew.org. 保留所有权利