Chromium 如何查找V8 引擎中JavaScript 标准内置对象

JavaScript 标准内置对象 - JavaScript | MDN (mozilla.org)

一、JavaScript 标准内置对象

本章介绍和说明了 JavaScript 中所有的标准内置对象、以及它们的方法和属性。

这里的术语“全局对象”(或标准内置对象)不应与 global 对象混淆。这里的“全局对象”指的是处在全局作用域里的多个对象

global 对象可以在全局作用域里通过使用 this 访问到(但只有在 ECMAScript 5 的非严格模式下才可以,在严格模式下得到的是 undefined)。其实全局作用域包含全局对象中的属性,包括它可能继承来的属性。

全局作用域中的其他对象则可由用户的脚本创建,或由宿主程序提供。浏览器环境中所提供的宿主对象的说明可以在这里找到:API 参考。

要了解关于 DOM 和核心 JavaScript 之间区别的更多信息,可参阅 JavaScript 技术概述。

 更多参考:JavaScript 标准内置对象 - JavaScript | MDN (mozilla.org)

二、JavaScript 标准内置对象在v8中位置如下:

以JSON内置对象为例:

 四个方法

  1. JSON.isRawJSON()
  2. JSON.parse()
  3. JSON.rawJSON()
  4. JSON.stringify()

所有v8内置对象都在此文件内:v8\src\init\bootstrapper.cc

1、 截取JSON对象注册部分

 (v8\src\init\bootstrapper.cc)

  {  // -- J S O NHandle<JSObject> json_object =factory->NewJSObject(isolate_->object_function(), AllocationType::kOld);JSObject::AddProperty(isolate_, global, "JSON", json_object, DONT_ENUM);SimpleInstallFunction(isolate_, json_object, "parse", Builtin::kJsonParse,2, false);SimpleInstallFunction(isolate_, json_object, "stringify",Builtin::kJsonStringify, 3, true);InstallToStringTag(isolate_, json_object, "JSON");native_context()->set_json_object(*json_object);}

2、JSON.parse等调用在

 src\v8\src\builtins\builtins-json.cc

// ES6 section 24.3.1 JSON.parse.
BUILTIN(JsonParse) {HandleScope scope(isolate);Handle<Object> source = args.atOrUndefined(isolate, 1);Handle<Object> reviver = args.atOrUndefined(isolate, 2);Handle<String> string;ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, string,Object::ToString(isolate, source));string = String::Flatten(isolate, string);RETURN_RESULT_OR_FAILURE(isolate, String::IsOneByteRepresentationUnderneath(*string)? JsonParser<uint8_t>::Parse(isolate, string, reviver): JsonParser<uint16_t>::Parse(isolate, string, reviver));
}// ES6 section 24.3.2 JSON.stringify.
BUILTIN(JsonStringify) {HandleScope scope(isolate);Handle<Object> object = args.atOrUndefined(isolate, 1);Handle<Object> replacer = args.atOrUndefined(isolate, 2);Handle<Object> indent = args.atOrUndefined(isolate, 3);RETURN_RESULT_OR_FAILURE(isolate,JsonStringify(isolate, object, replacer, indent));
}// https://tc39.es/proposal-json-parse-with-source/#sec-json.rawjson
BUILTIN(JsonRawJson) {HandleScope scope(isolate);Handle<Object> text = args.atOrUndefined(isolate, 1);RETURN_RESULT_OR_FAILURE(isolate, JSRawJson::Create(isolate, text));
}// https://tc39.es/proposal-json-parse-with-source/#sec-json.israwjson
BUILTIN(JsonIsRawJson) {HandleScope scope(isolate);Handle<Object> text = args.atOrUndefined(isolate, 1);return isolate->heap()->ToBoolean(IsJSRawJson(*text));
}

3、JSON对象实现部分:

v8\src\json\json-parser.h

v8\src\json\json-parser.cc

  V8_WARN_UNUSED_RESULT static MaybeHandle<Object> Parse(Isolate* isolate, Handle<String> source, Handle<Object> reviver) {HighAllocationThroughputScope high_throughput_scope(V8::GetCurrentPlatform());Handle<Object> result;MaybeHandle<Object> val_node;{JsonParser parser(isolate, source);ASSIGN_RETURN_ON_EXCEPTION(isolate, result, parser.ParseJson(reviver),Object);val_node = parser.parsed_val_node_;}if (IsCallable(*reviver)) {return JsonParseInternalizer::Internalize(isolate, result, reviver,source, val_node);}return result;}

3、运行测试用例看下调用堆栈:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body><h2>为 JSON 字符串创建对象</h2>
<p id="demo"></p>
<script>
var text = '{ "sites" : [' +'{ "name":"Runoob" , "url":"www.runoob.com" },' +'{ "name":"Google" , "url":"www.google.com" },' +'{ "name":"Taobao" , "url":"www.taobao.com" } ]}';obj = JSON.parse(text);
document.getElementById("demo").innerHTML = obj.sites[1].name + " " + obj.sites[1].url;
</script></body>
</html>

三、总结:

 1、所有JavaScript内置对象都在v8\src\init\bootstrapper.cc里面注册,直接在此文件搜前端对象字符串即可。eg:“JSON”

2、注册的对象会在src\v8\src\builtins目录下生成对应文件:

 src\v8\src\builtins目录下的文件对应该对象的源码实现关系:

例如:

BUILTIN(JsonParse) {JSON.parse} 调用 JsonParser<uint8_t>::Parse 就可以找到最终解析json源码

v8\src\json\json-parser.h

v8\src\json\json-parser.cc

// ES6 section 24.3.1 JSON.parse.
BUILTIN(JsonParse) {HandleScope scope(isolate);Handle<Object> source = args.atOrUndefined(isolate, 1);Handle<Object> reviver = args.atOrUndefined(isolate, 2);Handle<String> string;ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, string,Object::ToString(isolate, source));string = String::Flatten(isolate, string);RETURN_RESULT_OR_FAILURE(isolate, String::IsOneByteRepresentationUnderneath(*string)? JsonParser<uint8_t>::Parse(isolate, string, reviver): JsonParser<uint16_t>::Parse(isolate, string, reviver));
}

3、附上v8介绍官网CodeStubAssembler 内置 ·V8 系列

    此链接是在v8添加一个内置函数例子。或者直接搜索SimpleInstallFunction也可以

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/56252.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenStack服务Swift重启失效(已解决)

案例分析Swift重启失效 1. 报错详情 在重新启动 VMware 虚拟机后&#xff0c;我们发现 OpenStack 的 Swift 服务出现了 503 Service Unavailable 错误。经过排查&#xff0c;问题根源在于 Swift 服务所使用的存储挂载是临时挂载&#xff0c;而非永久挂载。 Swift 服务依赖于…

985研一学习日记 - 2024.10.11

偶尔一碗热鸡汤&#xff1a;一个人内耗&#xff0c;说明他活在过去&#xff1b;一个人焦虑&#xff0c;说明他活在未来。只有当一个人平静时&#xff0c;他才活在现在。 日常 1、6&#xff1a;00起床 √ 2、健身1h 今天练了肩部以及背&#xff0c;然后跑步半小时 3、LeetC…

Python环境搭建

Python环境搭建 1 安装Python 双击安装包 2 安装Pycharm 双击安装包,然后下一步 安装完成后重启电脑 3 破解Pycharm 启动Pycharm 破解 4 pycharm的基本配置 1.主题颜色 2. 文件语言编码 滚动鼠标滑轮ctrl&#xff0c;可以快速缩放文本字体大小。 控制台编码的格式&#x…

Qt - QMenu

QMenu 1、menu转string输出 //GlobalEnum.h #include <QObject> #include <QMetaEnum> class GlobalEnum : public QObject {Q_OBJECT public:EnumTest();enum Enum_Test{ZhangSan 0,WangWu,};Q_ENUM(Enum_Test) };#define EnumToString(e) \ QMetaEnum::fromTy…

Python异步编程:使用`asyncio.Semaphore`控制并发

Python异步编程&#xff1a;使用asyncio.Semaphore控制并发 1. 什么是asyncio.Semaphore&#xff1f;2. 为什么需要asyncio.Semaphore&#xff1f;3. 如何使用asyncio.Semaphore&#xff1f;3.1 基本用法3.2 信号量的工作原理3.3 动态调整信号量 4. 适用场景5. 总结 在Python的…

Qt初识_通过代码创建hello world

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Qt初识_通过代码创建hello world 收录于专栏【Qt开发】 本专栏旨在分享学习Qt的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1.通过按…

c语言库文件

c语言库文件 动态库动态库制作首先生成动态库文件名使用动态库编译动态库运行删除动态库1.sudo su 静态库静态库制作需要将源文件.c转换成二进制文件.o&#xff08;重定向文件&#xff09;将重定向文件打包成静态库文件使用静态库文件 静态库和动态库的区别 库文件的概念 我们将…

python-读写Excel:openpyxl-(1)基础操作之读写数据

目录 工作薄 创建/打开工作薄对象 获得默认sheet 工作表 创建工作表 删除工作表 获取表名 复制表 获取表对象 单元格 列号数字与字母转换 获取有效数据行和列 单元格对象获取 获取有效数据区域 获取指定行对象 value获取单元格数据值 修改及写入数据 插入或删…

C#里使用DataGridView来显示500万行数据

如果有500万行数据需要显示,大家肯定感觉很麻烦。 因为一次性地往列表里添加500万行数据,就需要很久的时间, 并且当滚动的时候就会更新比较慢。 有没有更好的方式呢? 其实可以采用虚拟列表的方式,也就是设置下面的方式: dataGridView1.VirtualMode = true; 这样列表…

老人桌面 1.3.5|专为老人设计的便捷实用桌面应用

老人桌面是一款专为老人设计的便捷实用桌面应用&#xff0c;具有超大字体设计&#xff0c;符合老人视力水平&#xff0c;撞色简洁的应用界面&#xff0c;拯救老人视觉体验。此外&#xff0c;还提供了常用的实用小工具&#xff0c;让老人能够轻松使用手机。 大小&#xff1a;5.…

vuefor循环动态展示图片不显示

问题代码如下 <div class"zjjc_list_bottom" v-for"(item, index) in zjjcList" :key"item.id"><img :src"./assets/left_blue_ (index 1) .png" alt""> </div> 理论来说是不会有问题&#xff0c;但…

An.如何在an中截取音频片段

如何在an中截取音频片段 在an动画制作过程中&#xff0c;部分片段需要插入音乐&#xff0c;如果想要插入一首歌曲的其中一小节&#xff0c;打开音频编辑软件操作就很麻烦&#xff0c;不妨直接在an中操作&#xff1a; 以这首节气歌为例&#xff0c;前奏太长需要剪掉前面的部分 …

图片/视频预览页面开发

使用到了vant-ui中的轮播组件、图片组件 数据结构示例&#xff1a; // type: 1图片 2视频 list: [{type: 1,url: adfdsfadsfasdf.png,},{type: 2,url: asdfasdfasdf.mp4,} ],item: {type: 1,url: adfdsfadsfasdf.png, },// utils/index.js/*** 图片/视频预览* param list* …

Spring Boot 整合 RocketMQ 之普通消息

前言&#xff1a; 在消息中间件领域中 RocketMQ 是一种非常常见的消息中间件了&#xff0c;并且是由阿⾥巴巴开源的消息中间件 &#xff0c;本篇简单分享一下 Spring Boot 项目集成 RocketMQ 的过程。 RocketMQ 系列文章传送门 RocketMQ 的介绍及核心概念讲解 Spring Boot …

WPF -- LiveCharts的使用和源码

LiveCharts 是一个开源的 .NET 图表库&#xff0c;特别适用于 WPF、WinForms 和其他 .NET 平台。它提供了丰富的图表类型和功能&#xff0c;使开发者能够轻松地在应用程序中创建动态和交互式图表。下面我将使用WPF平台创建一个测试实例。 一、LiveCharts的安装和使用 1.安装N…

VUE-鼠标移入到目标区域变成小手形状

工作中有个场景&#xff1a;当鼠标移动到某个区域时显示为“小手”状 其实这个东西特别简单&#xff0c;只是用的不多平常。 我们只需要给目标区域的style样式中加入【cursor: pointer;】这个鼠标就好了。 <span class"el-dropdown-link">下载 </span>…

软件测试与软件缺陷的基础知识

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

计算机视觉之可做什么

1、计算机视觉的应用 计算机视觉在我们生活中已经有了很广泛的应用&#xff0c;在我们可见、不可见&#xff1b;可感知、不可感知的地方&#xff0c;深深地影响了我们的生活、生产方式。 日常生活&#xff1a;美颜相机、火车站刷脸进站、线上办理业务的身份认证、自动驾驶等等…

供应链PC实操落地实践|得物技术

目录 一、背景 二、实操模式 三、快捷码设计和使用 1. 快捷码布局 2. 快捷码的准确识别 3. 快捷码的高亮反馈 4. 快捷码打印和黏贴建议 四、问题复盘 1. 基准体验的梳理 五、实操环境检测 1. 实操环境的安装和配置 2. 实操环境检测能力的使用流程 3. 实操检测能力的技术架构 4.…

Vue 3 数组变更详解:哪些操作会修改原数组?| 笔记

Vue 3 使用 Proxy 来侦测响应式对象的变化&#xff0c;数组作为常用数据类型&#xff0c;自然也被 Vue 3 自动侦测和管理。在处理数组时&#xff0c;了解哪些操作会修改原数组&#xff0c;哪些操作不会修改原数组&#xff0c;对高效编写 Vue 应用程序至关重要。 本文将详细介绍…