Javascript 相同字符串值的两个实例不相等

Javascript 相同字符串值的两个实例不相等,javascript,typescript,jasmine,Javascript,Typescript,Jasmine,格式化为货币样式字符串的数字返回的值与预期值不相等 const expected = `12,09 €`; const formatted = new Intl.NumberFormat(`de-De`, { style: `currency`, currency: `EUR` }).format(12.09); expect(formatted).toEqual(expected); // Fail expected === formatted; // false // Log

格式化为货币样式字符串的数字返回的值与预期值不相等

const expected = `12,09 €`;
const formatted = 
    new Intl.NumberFormat(`de-De`, { style: `currency`, currency: `EUR` }).format(12.09);

expect(formatted).toEqual(expected); // Fail

expected === formatted; // false

// Logged values
console.log(`FORMATTED: type = ${typeof formatted}, value = '${actual}';`);
console.log(`EXPECTED: type = ${typeof expected}, value = '${expected}';`);
// FORMATTED: type = string, value = '12,09 €'; 
// EXPECTED: type = string, value = '12,09 €';
但是


问题:为什么两个相似的字符串不相等?

格式化的
中的空格字符是
0xC2A0
预期的
0x20
格式化的
中的空格字符是
0xC2A0
预期的
中的空格字符是
0x20
Intl.NumberFormat
返回一个字符字符串具有非中断空格(160字符代码),而
预期的
字符串具有正常空格(32字符代码)

应为[5]==格式化的[5]
//错误

看看这条线:

我认为您只需使用
replace
函数即可解决此问题。例如:

const expected=`12,09€`.replace(/\s/,String.fromCharCode(160));
常量格式=
新的Intl.NumberFormat(`de`{
样式:`currency`,
货币:欧元`
}).格式(12.09);

console.log(预期==格式化)
Intl.NumberFormat
返回一个带有不间断空格(160字符代码)的字符串,而您的
预期的
字符串具有正常空格(32字符代码)

应为[5]==格式化的[5]
//错误

看看这条线:

我认为您只需使用
replace
函数即可解决此问题。例如:

const expected=`12,09€`.replace(/\s/,String.fromCharCode(160));
常量格式=
新的Intl.NumberFormat(`de`{
样式:`currency`,
货币:欧元`
}).格式(12.09);

console.log(预期==格式化),因为如果您检查转义字符串的预期值为
%20
,该值为空格且已格式化,则该值为$A0,该值为空

您可以检查编码:

const expected=`12,09€`;
常量格式=
新的Intl.NumberFormat(`de`{
样式:`currency`,
货币:欧元`
}).格式(12.09);
控制台日志(转义(预期))

log(转义(格式化))
因为如果您检查转义字符串,则预期的是
%20
,它是空格,格式化后的是$A0,它是空的

您可以检查编码:

const expected=`12,09€`;
常量格式=
新的Intl.NumberFormat(`de`{
样式:`currency`,
货币:欧元`
}).格式(12.09);
控制台日志(转义(预期))

log(escape(formatted))
在第一种情况下,尝试执行格式化变量和预期变量的typeof。可能它们不同,条件为false。@KaushaShah在问题中添加了记录值,
typeof
返回相同的类型(
string
)对于这两个值。正如您自己所说的那样,
new Intl.NumberFormat
retruns
12.09
,那么如何才能与
12.09€
@ShadabAhmed-typo相同呢,fixed@NakulGawande他应该替换预期字符串,而不是格式化字符串。有一个不间断的空格是有原因的。在第一种情况下,尝试使用格式化的和预期的变量类型。可能它们不同,条件为false。@KaushaShah在问题中添加了记录值,
typeof
返回相同的类型(
string
)对于这两个值。正如您自己所说的那样,
new Intl.NumberFormat
retruns
12.09
,那么如何才能与
12.09€
@ShadabAhmed-typo相同呢,fixed@NakulGawande他应该替换预期字符串,而不是格式化字符串。不间断空格的存在是有原因的。另一个想法,而不是替换,只需将字符串更改为->
12,09\xa0€
另一个想法,而不是替换,只需将字符串更改为->
12,09\xa0€
new Intl.NumberFormat(`de-De`, { style: `currency`, currency: `EUR` }).format(12.09); 
// returns "12,09 €"

`12,09 €` === `12,09 €`; // true

typeof formatted; // "string"