oporator-overloading-in-javascript-292f

原始地址:https://dev.to/adam_cyclones/oporator-overloading-in-javascript-292f

'''在JavaScript中利用TextEncoder制作字节字符串形式的ByteString是一个很好的主意,但是不需要新开辟一块内存,也不需要进行一些繁琐的操作来创建一个无法像字符串一样处理的东西,用户只需这样:
b`hello world`;
以下基于此想法,Rust的字节字符串:
b"hello rustations";
JavaScript版本将采用作为模板字符串的标记函数的形式,这本身就很酷,我从未想到我们可以创建这样的原始类型。好,那么字节字符串应该返回什么呢?理论上它应该返回一个Unicode UTF8编码字节的Uint8Array,到目前为止这都是可行的。但是如果我想要连接它们呢?
JavaScript并没有正式提供改变+号的功能,但是有些语言可以,这称为运算符重载,即在拥有自己类型的类型上改变运算符的行为。因此,如果我想这样做:
b`hello` + b`world` // TypedArray + TypedArray 😵
不幸的是,虽然这是可能的,但这意味着我必须以API的形式提供返回值,记住这个字符串表示的结果不是一个字符串,它是一个Uint8Array,你不能将两个TypedArray相加,所以API版本可能会有点有用,一些我类型的方法将使它看起来更本地化。
下面是具体的实现方式:
function b(str) {
  const _value = str[0];
  return {
    _value,
    toUtf8Bytes() {
      return new TextEncoder().encode(_value);
    },
    valueOf() {
      // 当解释器请求此对象的值时,我们会返回原始字符串。
      return _value;
    }
  }
}
valueOf重写了解释器在控制台中计算和显示值时使用的方法,就JavaScript而言,这是一个普通字符串,这意味着无论我使用什么运算符,都会调用valueOf,就像使用setter getter一样。实际上,我的例子中就像是将两个对象相加,但是却欺骗了解释器,让它认为是一个字符串。不用担心安全性问题,JavaScript中的所有东西都是对象,这并不奇怪。更好的做法是将ByteString作为String的扩展使用ES6类实例,无论如何我发现这绝对是一种令人着迷的技巧,希望你也学到了一些东西。

但是为什么?
附注:您可以使用插值语法将这些字节字符串(稍作修改以将它们重新组合),并将其轻松传递给webgl或Wasm。如果字节字符串对您来说不合适,那么一个可以直接相加的Vector类实例或CSSOM单位的抽象可能会很棒,我可以想到很多很酷的用途。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值