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 N
Handle<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也可以