Javascript 语言环境字符串与 String.prototype.valueOf 的比较

Posted

技术标签:

【中文标题】Javascript 语言环境字符串与 String.prototype.valueOf 的比较【英文标题】:Javascript locale string comparison with String.prototype.valueOf 【发布时间】:2021-05-06 22:26:40 【问题描述】:

我有以下例子:

class MyClass 
  constructor(name) 
    this.name = name;
  

  toString() 
    return this.name;
  

  valueOf() 
    return this.name;
  


const list = [new MyClass("b"), new MyClass("ä")];

list.sort();
console.log(list.join());

list.sort(new Intl.Collator('de').compare);
console.log(list.join());

这里,Collator 是获得正确排序顺序所必需的,但我想摆脱它,我希望能够将MyClass 的实例与简单的myClass1 < myClass2 进行比较。这在理论上应该可以通过更改valueOf 函数来实现。

我现在的问题是,是否有任何 javascript 内置方法来获取字符串的“区域设置”值(类似于 Intl.CollatorlocaleCompare),我可以在我的 valueOf 函数中返回以获取订购对吗?

【问题讨论】:

这将是一个真正的魔法值,因为您需要列出ä,同时ä 的行为应该像a 理论上它可能是可能的,但没有什么像“字符串的“区域设置”值” - 排序规则确实改变了比较算法,不会产生两个新的可以与普通算法进行比较的字符串。 我真的没想到,但我认为浏览器中的某个位置必须为每个语言环境存储一个查找表或一个顺序。所以这可以被访问(例如string.localeCharValueAt("de") 【参考方案1】:

不,没有这样的信息。基本上,除非您直接(如Intl.Collator)或间接(如localeCompare)使用具有指定语言环境的Intl,否则您将根据字符串的浏览器实现来比较代码点,这很可能是UTF-16代码点。

【讨论】:

以上是关于Javascript 语言环境字符串与 String.prototype.valueOf 的比较的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 对象

类的封装,继承与多态。

Foundation框架系列-NSString

javascript概要

初识JavaScript

ECMAscript v.s. Javascript