规范中的JavaScript的内置属性和操作方法

前置

  • 引用是已解析的名称绑定。引用由三个组件组成,即基值、引用名称和布尔值严格引用标志。基值是未定义的、Object、Boolean、String、Number或环境记录。未定义的基值表示引用无法解析为绑定。引用的名称是一个字符串。
  • 本规范中使用了两种环境记录值:声明性环境记录和对象环境记录。声明性环境记录用于定义ECMAScript语言语法元素(如FunctionDeclarations、VariableDeclaration和Catch子句)的效果,这些语法元素直接将标识符绑定与ECMAScript语言值相关联。对象环境记录用于定义ECMAScript元素(如Program和WithStatement)的效果,这些元素将标识符绑定与某些对象的属性相关联。

一些对象的内部通用属性

  1. \[prototype],可以通过Object.getPrototypeOf()方法拿到值
  2. \[class],一个字符串值,指示由规范定义的对象分类。
  3. \[call],执行与对象关联的代码。通过函数调用表达式调用。
  4. \[code],函数的ECMAScript代码。在标准的内置ECMAScript对象中,只有Function对象实现。
  5. \[ParameterMap],提供arguments对象的属性和关联函数的形式参数之间的映射。只有作为参数对象的ECMAScript对象才具有。
  6. \[scope],一种词法环境,用于定义执行Function对象的环境。在标准的内置ECMAScript对象中,只有Function对象实现
  7. \[Get],返回其值
  8. \[Put],设置其值
  9. \[Delete],从对象中删除指定的命名自身特性
  10. \[getProperty],返回此对象的命名属性的完全填充的属性描述符,如果不存在,则返回未定义的属性描述符。

getValue(v)

  1. 如果v不是一个引用则直接返回v本身
  2. let base = v的基值,如果基值是未定义的则抛出 ReferenceError 异常
  3. 如果基值是属性引用
    • 如果是对象,let get = 对象的\[GET]方法
    • 如果不是对象,则让get为下方定义的get方法
  4. 否则v一定是环境变量的基本值
    • 返回环境记录中已存在的绑定的值。如果严格布尔值为true,并且绑定不存在或未初始化,则引发ReferenceError异常。
  • 当V是具有基元基值的属性引用时,GetValue将使用以下\[Get]内部方法。它被称为使用基作为它的这个值,并使用属性P作为它的参数。采取以下步骤:
  1. let O = toObject(base)
  2. let desc = getProperty(O.p)
  3. if desc == undefined, return undefined
  4. 如果是value/writeable类型的,则返回desc.value
  5. 如果是setter/getter类型的
    • 如果getter不是函数,返回undefined
    • 如果返回getter的执行结果

putValue(v, w)

  1. 如果v不是引用,则抛出 ReferenceError 错误
  2. let base = v的基值
  3. 如果v是未定义的
    • 如果v的严格布尔值为true则抛出 ReferenceError 错误
    • 否则,将v作为全局对象的属性,并被赋值为w
  4. 如果v是属性引用
    • 是对象则调用内置的put方法,否则调用下面定义的put(同getValue操作,不过是赋值操作且异常是抛出TypeError)
  5. 到这里必然是环境变量的引用
    • 设置环境记录中已存在的可变绑定的值。name是绑定名称的文本。base是绑定的值,可以是任何ECMAScript语言类型的值。S是严格的模式引用布尔标志。如果S为true并且无法设置绑定,则引发TypeError异常

\[Delete]操作

  1. let desc = 当前属性的描述符
  2. if desc == undefined, return true
  3. if desc.Configurable == true, remove property and return true
  4. 否则 严格模式下抛出 TypeError
  5. 返回 false
相关推荐
lichenyang4538 分钟前
从 has.echo 到异步 API 注册表:一次 ASCF API 回调不触发的排查复盘
前端
林瞅瞅15 分钟前
Nuxt3 项目部署 Nginx 防盗链后特定 JS 文件 403 问题修复方案
前端
kyriewen41 分钟前
别再每次都 Google 了:我整理了前端日常最常踩的 10 个 Git 坑,附速查表
前端·javascript·git
一颗奇趣蛋1 小时前
Web 视频开发完全指南:从入门到精通
前端
非洲农业不发达1 小时前
windows终端体验大升级,让你拥有macos级别的美化
前端·后端
妙码生花1 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(十七):登录接口完善,登录页接口整合,解决跨域
前端·后端·ai编程
唐诗2 小时前
改 3 行配置,我的 Tauri dev 冷启动从 100 秒干到 4 秒
前端·客户端
SmartBoyW2 小时前
深入ECMAScript规范:彻底搞懂JS隐式类型转换与底层ToPrimitive机制
前端·javascript
牧艺2 小时前
Cursor Rules / Skills 分层设计:让 Agent 像「团队新同事」
前端·人工智能·cursor
光影少年2 小时前
react navite 跨端核心原理
前端·react native·react.js