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内置对象为例:
四个方法
- JSON.isRawJSON()
- JSON.parse()
- JSON.rawJSON()
- 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也可以