JavaScript松散比较对象和字符串
JavaScript loose comparison between an object and a string
下面的代码,
var someObject = {"attr":1}; // line:1
alert(someObject == "someString"); //line:2
失败,除了第2行中的unexpected call to method or property access
。
当我将比较更改为strict
等于时,它工作得很好。
alert(someObject === "someString");
我理解做strict
比较不做type conversion
,但我无法确定在什么时候确切是这个错误抛出时类型转换发生。
注意:确切的对象大约有十个属性,每个属性都有一个有效长度的字符串值。
我能够重现这个错误的最小输入:
someObject = {
"a":"RESOLVED",
"b":"A-1444779652190",
"c":"{s=Hello, id=A-1444779652190}"
}
(c
是一个string
,不认为这里真的很重要)
当您执行someObject == "someString"
时,抽象相等比较算法会这样做:
- 如果Type(x)是Object, Type(y)是String或Number,返回topprimitive (x) ==的比较结果。
当使用对象调用topprimitive时,
返回对象的默认值。对象的默认值的内部方法[[DefaultValue]]检索对象,传递可选提示PreferredType。的行为[[DefaultValue]]内部方法由本规范定义8.12.8中所有原生ECMAScript对象。
总结一下,当[[DefaultValue]]在一个非date原生对象上被调用而没有提示时,它会这样做:
- 如果对象有一个返回原语的
toString
方法,默认值是原语 - 如果对象有一个返回原语的
valueOf
方法,默认值是原语 - 扔TypeError
我的猜测是一些代码修改了Object.prototype.toString
或Object.prototype.valueOf
,现在它们在被topprimitive调用时可能会抛出
相关文章:
- 字符串对象类型或基元类型也是如此
- Javascript-如何从字符串/对象引用回调
- JavaScript,字符串/对象操作的例外
- 如何在require中传递字符串/对象
- 字符串对象比较总是返回false
- 对字符串对象调用 .localeCompare 与构造特制的 Intl.Collator 对象之间的性能差异
- 将变量打印到控制台时出现意外字符串:[对象窗口]
- 如何使用javascript在字符串对象中添加原型
- 如何在 JavaScript 中设置/更新字符串对象的值
- jQuery:在 $.each 中从字符串类型转换为字符串对象
- 将属性添加到字符串对象时出现问题
- 从字符串对象中删除第一个出现的字母
- 如何正确地将JQuery函数从表单的输入标记中检索到的这些字符串对象转换为数字
- 转换“;字符串对象“;到对象
- Javascript中字符串对象到字符串原语的转换
- JavaScript符号类型:(非字符串对象键)
- 正在重新定义字符串对象中的长度属性
- 带有字符串对象的jQuery选择器不起作用
- 如何在javascript中将JSON字符串对象打印为下拉列表
- 将日期字符串对象转换为其他格式