看起来像下面的代码应该返回一个true,但它返回false.
var a = {};
var b = {};
console.log(a==b); //returns false
console.log(a===b); //returns false
Run Code Online (Sandbox Code Playgroud)
这有什么意义?
不保证非数组对象的属性按任何特定顺序进行字符串化.不要依赖于字符串化内同一对象内的属性排序.
我曾希望通过缓存对象的字符串化版本来确定对象是否已更改,然后将其与随后的字符串化对象版本进行比较.这似乎比递归迭代对象并进行比较要简单得多.问题是因为JSON.stringify函数不是确定性的,所以当我对同一个对象进行字符串化时,我可以在技术上得到一个不同的字符串.
我还有其他选择吗?或者我是否必须编写令人讨厌的比较函数来确定对象相等性?
我有这个代码:
var object1 = {same:'test'}
var object2 = {same:'test'};
console.log(object1 === object2)
Run Code Online (Sandbox Code Playgroud)
它在控制台中返回false.
我也有这个代码:
var object1 = {same:'test'}
var object2 = object1;
console.log(object1 === object2)
Run Code Online (Sandbox Code Playgroud)
它在控制台中返回true.
我知道'==='是一个相等运算符,但我不知道它是如何在对象上运行的.
为什么第一个示例返回false?
数组只是伪装成对象吗?为什么/为什么不呢?他们以什么方式(这样/不是)?
我一直认为JS中的数组和对象基本相同,主要是因为访问它们是相同的.
var obj = {'I': 'me'};
var arr = new Array();
arr['you'] = 'them';
console.log(obj.I);
console.log(arr.you);
console.log(obj['I']);
console.log(arr['you']);
Run Code Online (Sandbox Code Playgroud)
我误导/错误/错误吗?关于JS文字,基元和字符串/对象/数组/等,我需要了解什么?
数组/对象是伪装的字符串吗?为什么/为什么不呢?他们以什么方式(这样/不是)?
如果我有两个数组或对象并想要比较它们,例如
object1 = [
{ shoes:
[ 'loafer', 'penny' ]
},
{ beers:
[ 'budweiser', 'busch' ]
}
]
object2 = [
{ shoes:
[ 'loafer', 'penny' ]
},
{ beers:
[ 'budweiser', 'busch' ]
}
]
object1 == object2 // false
Run Code Online (Sandbox Code Playgroud)
如果您从服务器获得响应并尝试查看它是否已更改,这可能会很烦人
我正在研究角度1项目到角度2的迁移.在angular 1项目中,我使用angular.equals进行对象比较angular.equals($ctrl.obj1, $ctrl.newObj);,我在线搜索了角度2中的等效方法,但找不到任何匹配的结果.
我试图比较这两个JSON对象:
<input type="hidden" id="remoteJSON" name="remoteJSON" value='{"allowExternalMembers": "false", "whoCanJoin": "CAN_REQUEST_TO_JOIN"}' /><br />
<input type="hidden" id="localJSON" name="localJSON" value='{"whoCanJoin": "CAN_REQUEST_TO_JOIN", "allowExternalMembers": "false"}' /><br />
Run Code Online (Sandbox Code Playgroud)
我用javascript得到了值,我试着用它来比较:JSON.stringify(remoteJSON) == JSON.stringify(localJSON)但是这返回false:看起来属性的顺序很重要.
我甚至尝试与这个解决方案进行深入比较,总是得到错误的回报.
是否有一种快速的方法来解决jQuery的问题(即用于比较JSON的库)?
我正在使用react useEffect挂钩并检查对象是否已更改,然后才再次运行挂钩。
我的代码如下所示。
const useExample = (apiOptions) => {
const [data, updateData] = useState([]);
useEffect(() => {
const [data, updateData] = useState<any>([]);
doSomethingCool(apiOptions).then(res => {
updateData(response.data);
})
}, [apiOptions]);
return {
data
};
};
Run Code Online (Sandbox Code Playgroud)
不幸的是,由于对象未被识别为相同对象,因此它一直在运行。
我相信以下是一个示例。
const useExample = (apiOptions) => {
const [data, updateData] = useState([]);
useEffect(() => {
const [data, updateData] = useState<any>([]);
doSomethingCool(apiOptions).then(res => {
updateData(response.data);
})
}, [apiOptions]);
return {
data
};
};
Run Code Online (Sandbox Code Playgroud)
也许运行的JSON.stringify(apiOptions)作品?
我试图比较json_str1和json_str2,这里它应该返回true,因为json_str1中的所有元素都存在于json_str2中.
就目前而言,我这样做很长
json_str1 = '{"0":"a","1":"b","2":"c"}';
json_str2 = '{"0":"c","1":"b","2":"a"}';
json_obj1 = $.parseJSON(json_str1);
json_obj2 = $.parseJSON(json_str2);
arr1 = $.map(json_obj1, function(el) { return el });
arr2 = $.map(json_obj2, function(el) { return el });
if($(arr1).not(arr2).length === 0 && $(arr2).not(arr1).length === 0)
alert("equal");
else
alert("not equal");
Run Code Online (Sandbox Code Playgroud)
如何在不将对象转换为数组的情况下使其简洁明了?
我正在编写代码的一部分,我有一个看起来像的数组[[data]].将data通过Django的模板引擎渲染在服务器端.所以我的代码看起来像这样:
var data = {{ series|safe }};
// data will be [[]] if no data is present
if (data ==[[]])
console.log('no data');
Run Code Online (Sandbox Code Playgroud)
将if始终返回false.这意味着在[[]] == [[]],false而我的测试表明[]==[]也是false如此.
任何描述将不胜感激.
javascript ×9
arrays ×3
json ×3
object ×2
angular ×1
angularjs ×1
comparison ×1
jquery ×1
operators ×1
react-hooks ×1
reactjs ×1
typescript ×1