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

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




  

相关话题

  为什么某些人说 JavaScript 是不成熟的语言? 
  如何看待鸿蒙应用开发框架采用JavaScript作为开发语言? 
  2022 年,学完 JS 高级后的学习路线怎样规划? 
  如果说 Rust/WASM 会逐渐蚕食 JavaScript 生态,那将以怎样的路径进行? 
  设计闭包(Closure)的初衷是为了解决什么问题? 
  网上都说操作真实 DOM 慢,但测试结果却比 React 更快,为什么? 
  设计闭包(Closure)的初衷是为了解决什么问题? 
  如何绕过知乎对 Bookmarklet 跨域添加的 <script> 的限制? 
  为什么JavaScript不能成为自己的标准,非得冒出ES6成为JavaScript的标准呢? 
  Golang、Kotlin、C#、JS、Python等都有协程,市面上的协程有什么本质上的区别? 

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





© 2024-11-05 - tinynew.org. All Rights Reserved.
© 2024-11-05 - tinynew.org. 保留所有权利