当前位置: 首页 > news >正文

【js引擎】如何使用 quickjs 把一个 js 值转换成 c 字符串

开发 js 运行时时,最重要的模块莫过于 console.log 了。有了它,才可以在 js 代码中打印日志。那么如何用 quickjs 引擎实现该模块呢?

实际上 quickjs 已经实现了一个 console 的模块

js_print 实现

其中使用了接口

 str = JS_ToCStringLen(ctx, &len, argv[i]);

但该接口有一定的缺陷。它使用了 ECMAscript 中的标准
在这里插入图片描述
如果打印的是一个 Symbol ,那么将返回异常。quickjs 内部的处理是返回空串。也就是说,Symbol 类型的值是打印不出来的。

样例如下:样例如下

s = Symbol("dxx");
console.log(s);

输出如下

❯ ./qjs print_symbol.js
TypeError: cannot convert symbol to stringat log (native)at <eval> (print_symbol.js:3)

为了将 Symbol 转换成 string,需要调用 Symbol 的 toString 函数。这里有两种办法
方法一:
直接获取 toString 接口

if (JS_IsSymbol(js_value)) {JSValue toString = JS_GetPropertyStr(ctx, js_value, "toString");JSValue symbol_str = JS_Call(ctx, toString, js_value, 0, NULL);str = JS_ToCStringLen(ctx, &len, symbol_str);JS_FreeValue(ctx, toString);JS_FreeValue(ctx, symbol_str);
}

方法二: 研究后发现不可行,原因如下
另一种是先把 Symbol 转换成 Symbol Object。标准中规定 Object 会自动调用 toString 函数。这种方案不可行。

  1. 因为 quickjs 中把 JS_ToObject 接口定义在 c 文件中,并没有开放给使用者,如果强行使用需要改源码
  2. 标准规定Object在执行到string的类型转换时,需要先调用 toPrimitive 函数,见上面的截图。那么 symbol 仍然还是打印不出来

http://www.mrgr.cn/news/1221.html

相关文章:

  • Java实现Excel导入(从oss中导入到数据库)
  • Spark-SparkSubmit详细过程
  • HarmonyOS 端云一体化 -- 项目初始化
  • 网络编程(TCP/UDP)
  • JVM对象在堆、栈、TLAP上的分配
  • 使用Python实现深度学习模型:智能娱乐与虚拟现实技术
  • SQL— DML语句学习【后端 10】
  • 10结构型设计模式——桥接模式
  • 嵌入式系统:全面解读与关键要点
  • HTML 基础要素解析
  • 零基础STM32单片机编程入门(三十九) 多传感器模块之NFC刷卡开门实战源码
  • C语言刷题日记(附详解)(1)
  • Go语言中的值类型与引用类型
  • Android笔试面试题AI答之Kotlin(14)
  • 如何量化管理研发团队的技术债务?
  • Node.js推荐的项目
  • Centos7 系统下安装go语言开发环境
  • 以太网、usb网卡 无法使用,Windows仍在设置此设备的类配置(代码:56)
  • 【LeetCode热题100】滑动窗口
  • 后端开发刷题 | 排序算法--冒泡排序