javascript - 难以获得平等
问题描述
我写了一个原型方法,我想用它来扩展 Array 对象:
Array.prototype.indicesOf = function(val) {
var res = [];
for (var a=0;a<this.length;a++) {
if (this[a] === val) {
res.push(a);
}
}
return res;
}
当我去测试它时,我期望得到严格的平等,但我不是。
这是那个测试:
var res1 = document.getElementById('result_1');
var res2 = document.getElementById('result_2');
Array.prototype.indicesOf = function(val) {
var res = [];
for (var a=0;a<this.length;a++) {
if (this[a] === val) {
res.push(a);
}
}
return res;
}
var a = ["a", "c", "e", "a", "b", "d", "a", "f"];
res1.innerHTML = a.indicesOf("a").toString();
var b = [{name : "test1"}, {name : "test2"}];
res2.innerHTML = b.indicesOf({name : "test1"});
<div id="result_1"></div>
<div id="result_2"></div>
我不确定我做错了什么,我希望有人能提供一个答案,解释为什么我的案例var a
按预期工作,但我的案例var b
不被认为是平等的。
有人可以帮助我了解在比较不同数据类型之间(而不是之间)的相等性时发生了什么吗?
这已经被标记为重复,我非常不同意,但让我解释一下原因,并尝试以合乎逻辑的方式进行。我不想冒犯任何人(这根本不是我的意图),我真的很想知道答案。
推理:提供的链接证明标记为重复,它们本身链接到其他链接,这些链接链接到更多链接,这些链接并不能真正帮助我理解为什么似乎无法使用相等比较不同数据类型的问题运营商===
。
他们告诉您,在将 Object 与 Object 或 Array 与 Array 进行比较时,它将等于 false,但并没有真正解释为什么。
当我遇到问题时:
让我们称它为'Problem A' 1 + 9
和
让我们称它为'Problem B' 8 + 2
我可以检查这两个单独的问题是否相等,答案是肯定的,因为它们等同于相同的答案。
然而,当使用相同的基本逻辑查看具有相同属性的对象时,在我看来,它们应该在逻辑上等同于它们的部分(在这种情况下为属性)的总和。
暗示这一点:
var additionProblem = function(a1, a2) {
this.addend1 = a1;
this.addend2 = a2;
this.answer = this.addend1 + this.addend2;
}
var problem1 = new additionProblem(1, 9);
var problem2 = new additionProblem(8, 2);
//When compared via ===
//(problem1 === problem2) returns false (understandable)
//(problem1.answer === problem2.answer) returns true (understandable)
//BUT
//(9+1 === 8+2) returns true (also understandable)
//({name : "problem1"} === {name : "problem1"}) returns false (not understandable using this logic)
//
如果我可以将一个PROBLEM与其(不同)部分之和的另一个 PROBLEM 进行比较并让它返回true
,但同时比较两个对象/数组,它们比两个明显不同的PROBLEMS具有更严格的相等性,那么我会真的很想知道如何为我的目的正确使用===
&/OR ==
。
所谓的答案和链接理由的评论中给出的原因严重缺乏其他人已经解决的答案,甚至没有接近于问我所要求的。
我可以从这些答案中收集到的最好的只是解决Javascript 的根本问题的解决方案,该问题没有内置的处理Object-to-Object
相等比较的方法,而不是内存指针比较。
我想知道,为什么根据语言规范的设计,没有内置运算符来彻底检查对象的一个实例的内容(键/值对),并将其与另一个实例的内容进行比较目的。
任何人都可以阐明这一点吗?
未来有没有计划将这种类型的功能整合到语言中,或者会像 Promises 一样,每个人都将它的不同实现构建到库中,然后最终让它成为语言标准的一部分,一旦它在开源社区中被淘汰?
解决方案
问题是由于数据应该超出范围,即功能结束。
var res = [] // 函数的全局作用域
var res1 = document.getElementById('result_1');
var res2 = document.getElementById('result_2');
var res = [];
Array.prototype.indicesOf = function(val) {
for (var a=0;a<this.length;a++) {
if (this[a] === val) {
res.push(a);
}
}
return res;
}
var a = ["a", "c", "e", "a", "b", "d", "a", "f"];
res1.innerHTML = a.indicesOf("a").toString();
var b = [{name : "test1"}, {name : "test2"}];
res2.innerHTML = b.indicesOf({name : "test1"});
<div id="result_1"></div>
<div id="result_2"></div>
enter code here
推荐阅读
- kotlin-coroutines - 超时后如何取消协程作业
- hibernate-search - Hibernate Search 中 BigDecimal 的范围查询
- python-3.x - 当我们附加数据框时指定行的来源
- api - GET请求返回单个ID信息
- php - 从 JSON 到 PHP Foreach 循环的日期/时间对象
- angular - 如何合并使用 FROM 创建的 observables 数组的所有映射
- java - 使用 asList() 方法时出现编译器错误
- python - 从 groupby 对象中过滤所有行
- rust - 通过本地生命周期来满足特征
- r - 如何让 org-mode 导出宽或长表以便在 PDF 中可读?