使用JSVM-API接口进行Well-known symbols相关开发
====================================

#### 简介

JSVM-API中Well-known symbols相关接口可以通过不同API直接获取对应的11个Well-known symbols。

#### 基本概念

在JSVM-API中，Well-known symbols相关接口能够给用户提供快速获取对应的11个Well-known symbols的能力。

#### 接口说明

| 接口 | 功能说明 |
| :-- | :-- |
| OH\_JSVM\_GetSymbolToStringTag | 等价于JS中的Symbol.toStringTag。 |
| OH\_JSVM\_GetSymbolToPrimitive | 等价于JS中的Symbol.toPrimitive。 |
| OH\_JSVM\_GetSymbolSplit | 等价于JS中的Symbol.split。 |
| OH\_JSVM\_GetSymbolSearch | 等价于JS中的Symbol.search。 |
| OH\_JSVM\_GetSymbolReplace | 等价于JS中的Symbol.replace。 |
| OH\_JSVM\_GetSymbolMatch | 等价于JS中的Symbol.match。 |
| OH\_JSVM\_GetSymbolIsConcatSpreadable | 等价于JS中的Symbol.isConcatSpreadable。 |
| OH\_JSVM\_GetSymbolHasInstance | 等价于JS中的Symbol.hasInstance。 |
| OH\_JSVM\_GetSymbolUnscopables | 等价于JS中的Symbol.unscopables。 |
| OH\_JSVM\_GetSymbolAsyncIterator | 等价于JS中的Symbol.asyncIterator。 |
| OH\_JSVM\_GetSymbolIterator | 等价于JS中的Symbol.iterator。 |

#### 使用示例

参考[使用JSVM-API实现JS与C/C++语言交互开发流程](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/use-jsvm-process)中的JSVM-API接口开发流程，本文仅展示接口对应的C++代码。

#### \[h2\]使用接口获取Well-known symbols（以OH\_JSVM\_GetSymbolToStringTag为例）

cpp部分代码：

#include <string>

static JSVM\_Value WellKnownSymbols(JSVM\_Env env, JSVM\_CallbackInfo info) {
    JSVM\_VM vm;
    OH\_JSVM\_GetVM(env, &vm);

    JSVM\_HandleScope handleScope;
    OH\_JSVM\_OpenHandleScope(env, &handleScope);
    std::string src = R"JS(Symbol.toStringTag)JS";
    JSVM\_Value jsSrc;
    JSVM\_Script script;
    JSVM\_Value result1;

    OH\_JSVM\_CreateStringUtf8(env, src.c\_str(), JSVM\_AUTO\_LENGTH, &jsSrc);
    OH\_JSVM\_CompileScript(env, jsSrc, nullptr, 0, true, nullptr, &script);
    OH\_JSVM\_RunScript(env, script, &result1);
    JSVM\_Value result2;
    OH\_JSVM\_GetSymbolToStringTag(env, &result2);
    bool is\_equals = false;
    OH\_JSVM\_StrictEquals(env, result1, result2, &is\_equals);
    OH\_LOG\_INFO(LOG\_APP, "JSVM OH\_JSVM\_GetSymbolToStringTag result is correct : %{public}d\\n", is\_equals);
    OH\_JSVM\_CloseHandleScope(env, handleScope);

    return nullptr;
}

static JSVM\_CallbackStruct param\[\] = {
    {.data = nullptr, .callback = WellKnownSymbols},
};

static JSVM\_CallbackStruct \*method = param;

// wellKnownSymbols方法别名，供JS调用
static JSVM\_PropertyDescriptor descriptor\[\] = {
    {"wellKnownSymbols", nullptr, method++, nullptr, nullptr, nullptr, JSVM\_DEFAULT},
};

// 样例测试JS
const char \*srcCallNative = R"JS(wellKnownSymbols();)JS";

预期输出：

JSVM OH\_JSVM\_GetSymbolToStringTag result is correct : 1