已修复于 75.0.3770.142。
您发现了一个有趣的错误:
由于某种原因,这两个测试都是正确的,这取决于不相关的字符范围:
> /[\u0178-\u017F]/i.test('s')
true
> /[\u0178-\u017F]/i.test('S')
true
介绍者https://chromium-review.googlesource.com/c/v8/v8/+/1478710 https://chromium-review.googlesource.com/c/v8/v8/+/1478710(四月)。
修复在https://chromium-review.googlesource.com/c/v8/v8/+/1648098 https://chromium-review.googlesource.com/c/v8/v8/+/1648098似乎相关,但带有 v8 7.7.27 的 Canary 77.0.3818.0 仍然表现出这种行为。这是一个单独的错误:https://crbug.com/971636 https://crbug.com/971636
引入该问题的错误(https://bugs.chromium.org/p/v8/issues/detail?id=8348 https://bugs.chromium.org/p/v8/issues/detail?id=8348)讨论 ECMAScript 如何处理i
and u
不同的是:
-
i
独自打电话toUpperCase
,它使用案例mapping
-
iu
调用 Unicode 大小写folding
它们略有不同(尽管存在此错误)。
我还发现了一个似乎不同的错误:
这是一个小测试用例,尽管 v8 中的修复涉及土耳其语大小写折叠:
> text='ſ';
"ſ"
> new RegExp(text, 'i').test(text.toUpperCase())
true
> new RegExp(text, 'i').test('S')
false
它是在同一版本中引入的,但它并不是完全相同的错误 - 它是specific到 ſ 字符,其大写版本位于 ASCII 范围内,因此会在 V8 的正则表达式编译器中触发不同的代码路径。分别固定在https://chromium-review.googlesource.com/c/v8/v8/+/1827683 https://chromium-review.googlesource.com/c/v8/v8/+/1827683