我对javascript很陌生,由于某种原因,我的程序无法正常工作。我有一本字典,使用的键设置为字符串,而值euqal设置为充满布尔值的数组,即IE:
if (dict[x] == [true, false]) {do something }
但是由于某种原因,当我通过if语句(例如
)运行字典时{{1}}
它无法触发。我想知道我在做什么错
答案 0 :(得分:0)
您不能比较复杂的结构,例如数组和对象,因为相等性检查实际上是在查看特定的内存位置。每次创建新对象或数组时,该变量都指向内存中一个新的唯一位置。您将不得不遍历包含原始值的键/索引,并检查每个键/索引是否与您的其他结构相等。
额外的功劳:方括号和花括号分别称为数组文字和对象文字。它们本质上是new Array
或new Object
的语法糖。
另外,可以检查字符串,布尔值和数字是否相等的原因是,每种类型(true, false, 7, 'hello world', 'blue', 42
)的每个值实际上都指向内存中的唯一位置。例如:当您写
var str = 'yellow'
变量str
现在指向内存中与“ yellow”一词组成的六个字符相关联的位置。这是可以进行相等检查的实际原因。
var str2 = 'yel' + 'low'
使用相同的字符组合,从而导致对与str
的valueOf函数所指向的内存地址的引用。因此:
str === str2 // true
我希望能有所帮助。这个兔子洞还有很多东西,但这应该可以帮助您入门。
答案 1 :(得分:-1)
数组和对象不是基本类型,而是JavaScript中的引用类型。
这意味着在比较数组和对象时,实际上是在将引用与这些实体而不是它们的内容进行比较。当您将此数组分配给另一个变量时,您只是在使该变量引用相同的内容,而没有复制此内容:
const a = [1, 2, 3];
const b = [1, 2, 3];
console.log(a !== b);
const c = a;
console.log(a === c);
c[0] = 10;
console.log(a);
在您的情况下,如果要确保数组包含true
后跟false
,则可以使用Array.every()
或更简单的方法是使用数组索引来检查元素,因为数组很短:
const a = [true, false];
if (a.every((x, i) => x === [true, false][i])) {
console.log('same content');
}
if (a[0] === true && a[1] === false) {
console.log('same content');
}
答案 2 :(得分:-1)
Array.every
Array.every
检查数组中的所有项目是否均符合特定条件arrayOne
中的所有项目是否都与{{1}}中索引i
的项目相等这是一个例子
arrayTwo
JSON.stringify
与您的示例配合使用的另一种方法是将对象(“ dicts”)转换为 strings ,然后比较这些 strings 。看起来像这样
const isEqualArrays = (a, b) => a.length === b.length && a.every((x, i) => x === b[i]);
const isEqualDicts = (a, b) => isEqualArrays(a.x, b.x);
const first = { x: [true, false, true] };
const second = { x: [true, false, true] };
const unequal = { x: [true, true, true] };
console.log(isEqualDicts(first, second));
console.log(isEqualDicts(first, unequal));