我读过很多关于JavaScript中字符串相等的文章,并认为它在TypeScript中也是一样的,但我对这个问题感到困惑。我有两个完全相同的字符串,但在==
和===
操作符中却有不相等的结果。
这是密码:
this.cl_applied_filts.forEach (
filt => {
console.log (`[cl-filts]`);
store.getState()._cl_filters.forEach(
f => {
const af : string = filt.name;
const lf : string = f.name;
let sa : String = new String(af);
let sf : String = new String(lf);
console.log (`[cl-filts] String '${af}' and '${lf}'
equal (af == lf) ${(af == lf)} not equal (af != lf) ${(af != lf)}
buffers:
applied af ${JSON.stringify(filt)}
lengths ${filt.name.length} length ${af.length}.
db lf ${JSON.stringify(f)}
lengths ${f.name.length} length ${lf.length}.
normalized af '${sa.normalize()}'
lf '${sf.normalize()}'
`);
let equal : boolean = true;
for (let i = 0; i < af.length; ++i) {
let afc = sa.charCodeAt(i);
let lfc = sf.charCodeAt(i);
if (afc != lfc) {
console.log (`!!! both nums aren't equal !!!`);
equal = false;
}
console.log (`${i} ${sa.charCodeAt(i)} ${sf.charCodeAt(i)}`);
}
if (equal) {
console.log (`** both strings are equal **`);
}
if (store.string_eq(filt.name, f.name)) {
f.checked = true;
console.log (`[cl-filts] checked ${f.checked}`);
}
}
);
});
这是Firefox控制台的输出:
[cl-filts] String 'BURNLEY' and 'BURNLEY'
equal (af == lf) false not equal (af != lf) true
buffers:
applied af {"checked":true,"name":{"type":"Buffer","data":[66,85,82,78,76,69,89]}}
lengths 7 length 7.
db lf {"checked":0,"name":{"type":"Buffer","data":[66,85,82,78,76,69,89]}}
lengths 7 length 7.
normalized af 'BURNLEY'
lf 'BURNLEY'
control-lines.component.ts:56:56
0 66 66 control-lines.component.ts:74:60
1 85 85 control-lines.component.ts:74:60
2 82 82 control-lines.component.ts:74:60
3 78 78 control-lines.component.ts:74:60
4 76 76 control-lines.component.ts:74:60
5 69 69 control-lines.component.ts:74:60
6 89 89 control-lines.component.ts:74:60
** both strings are equal ** control-lines.component.ts:77:60
[cl-filts] checked true control-lines.component.ts:81:60
对象声明:
export class Filter
{
checked : boolean = false;
name : string = '';
}
我们可以看到两个字符串是相同的,甚至是字节,但是它们给出了不相等的结果,为什么呢?,我创建了一个函数,用来比较两个字符串,和charCodeAt
函数,以避免浪费更多的时间,但是我想知道这里发生了什么。
编辑:我已经按照评论修改,以显示没有区别。
1条答案
按热度按时间ujv3wf0j1#
好了,我已经弄清了问题所在,而且不仅仅是弦的问题。
f
对象是从一个bencode
对象创建的,我不记得是从Github库创建的。bencode
对象给出了一个如下形式的对象:{"checked":true,"name":{"type":"Buffer","data":[66,85,82,78,76,69,89]}
当访问
name
属性以进行显示时,它被转换为string
。filt
(类型Filter
)是从数据库中获得的,并且name
的类型为string
。当比较两个对象中的
name
作为string
* 理论上 * 时,它们不相等。问题是
bencode
对象属性没有真正转换为string
。因此,即使
"name":{"type":"Buffer","data":[...]}
在显示时被视为string
,并且在转换为String
对象时,它在比较时也不会被转换,所以我们比较的是:{"type":"Buffer","data":[...]} == 'BURNLEY'
显然,给
"name":{"type"...
赋值,并不能把它转换成string
,或者它使用了一种不同的缓冲区,它有一些东西使得它们不相等,即使它们有相同的文本并且是string
。