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

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




  

相关话题

  如何绕过知乎对 Bookmarklet 跨域添加的 <script> 的限制? 
  做软件开发但是现在公司学不到技术性东西想跳,自己又技不如人怎么办? 
  程序员讨厌面试被问一些基础问题么? 
  如何绕过知乎对 Bookmarklet 跨域添加的 <script> 的限制? 
  如何评价华为新开源的鸿蒙方舟JS运行时(Ark JS Runtime)? 
  TypeScript + Node.js 是否适合开发大型项目? 
  JavaScript里面有什么是不用刻意学的? 
  JavaScript里面有什么是不用刻意学的? 
  如何评价 Ant Design 这个项目(一个设计语言)? 
  为什么 TypeScript 有泛型而 PHP 却没有? 

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





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