使用JavaScript比较整数和字符串时的隐式数据类型转换==
守则:使用JavaScript比较整数和字符串时的隐式数据类型转换==,javascript,implicit-conversion,comparison-operators,Javascript,Implicit Conversion,Comparison Operators,守则: var num = 20; if(num == "20") { alert("It works"); } else { alert("Not working"); } var values = ["123", undefined, "not a number", "123.45", "1234 error", "", " ",
var num = 20;
if(num == "20")
{
alert("It works");
}
else
{
alert("Not working");
}
var values = ["123",
undefined,
"not a number",
"123.45",
"1234 error",
"",
" ",
null,
undefined,
true,
false,
"true",
"false"
];
for (var i = 0; i < values.length; i++){
var x = values[i];
console.log("Start");
console.log(x);
console.log(" Number(x) = " + Number(x));
console.log(" parseInt(x, 10) = " + parseInt(x, 10));
console.log(" parseFloat(x) = " + parseFloat(x));
console.log(" +x = " + +x);
console.log(" !!x = " + !!x);
console.log("End");
}
问题是:
“It works”
的警报框,如果测试条件评估为真,则显示
num
变量值从整数值转换为字符串值,反之亦然在JavaScript中,有两个运算符可用于比较两个值:
=
和==
运算符
引用JavaScript第六版权威指南:
相等运算符=
类似于严格相等运算符(==
),但它
没有那么严格。如果两个操作数的值的类型不同,
它尝试一些类型转换,然后再次尝试比较
及
严格相等运算符计算其操作数,然后比较
两个值如下,不执行类型转换
因此,我建议您始终使用==
,以避免出现以下问题:
null == undefined // These two values are treated as equal.
"0" == 0 // String converts to a number before comparing.
0 == false // Boolean converts to number before comparing.
"0" == false // Both operands convert to numbers before comparing.
另外,我可以像书中写的那样发布整个“比较指南”,但太长了;)请告诉我,我将为您编辑我的帖子。是的,equals运算符应用的所有类型转换规则都在ECMA-262规范中进行了描述 该算法可能看起来相当复杂,但可以概括为以下几种情况:
- 对于基本体(字符串、数字、布尔值、Null、未定义)
- 如果值完全相同,则返回true
- 对于对象类型
- 如果两个引用指向同一对象,则返回true
- 如果一个操作数的类型为Null或未定义
- 仅当另一个操作数值为
或null
undefined
- 仅当另一个操作数值为
- 如果其中一个操作数的类型为布尔或数字
- (经过一些步骤后)将另一个操作数转换为数字并进行比较
- 对对象执行对象到基本体的转换,然后再次比较
valueOf
和toString
方法,并将获取第一个返回原语值的值
如果这两个方法不返回原语,或者它们不可调用,则会抛出TypeError
,例如:
1 == { toString:null } // TypeError!
上面的语句将产生一个TypeError
,因为默认的Object.prototype.valueOf
方法只执行相同的对象实例(this
,而不是原语值),我们正在设置一个自己的toString
属性,它不是函数
您可能会感兴趣的一个朋友制作的小工具,它显示了在类型之间进行的所有步骤和递归比较:
- 避免JavaScript中的隐式类型转换。在比较单个值之前,请始终采取步骤测试和/或转换单个值,以确保您是在逐个比较。始终显式测试undefined以确定某个值或属性是否有值,使用null表示对象变量或属性未引用任何对象,并转换和比较所有其他值,以确保针对相同类型的值执行操作。我知道问题已得到回答。下面我给出的是一个很少转换的例子。它对于JavaScript新手来说非常有用。为了便于理解,可以将以下输出与通用算法进行比较
守则:
var num = 20;
if(num == "20")
{
alert("It works");
}
else
{
alert("Not working");
}
var values = ["123",
undefined,
"not a number",
"123.45",
"1234 error",
"",
" ",
null,
undefined,
true,
false,
"true",
"false"
];
for (var i = 0; i < values.length; i++){
var x = values[i];
console.log("Start");
console.log(x);
console.log(" Number(x) = " + Number(x));
console.log(" parseInt(x, 10) = " + parseInt(x, 10));
console.log(" parseFloat(x) = " + parseFloat(x));
console.log(" +x = " + +x);
console.log(" !!x = " + !!x);
console.log("End");
}
更好地使用下面的代码来理解隐式转换
var值=[0,123,“0”,“123”,-0,+0,NaN,+NaN,-NaN,false,true,“false”,“true”,null,未定义,“null”,“未定义”,“GoodString”,未定义];
对于(变量i=0;i>”);
对于(var j=0;j }
我很难从C编程切换回javascript或php编程,因为某些规则存在差异,就像我的大脑习惯了C中的规则一样,当我尝试用javascript编程时,我的大脑会一直思考C规则第1点,在javascript中所有数字都是浮点数,因此,不需要从int
到float
促销。道格拉斯·克罗克福德同意你的观点:“我的建议是永远不要使用邪恶的双胞胎。相反,要始终使用==
和!=
”(请参阅)。我喜欢这种方法,但是如果我希望“1”
和1
在代码中的某个地方被认为是相等的,例如在JSON导入之后,我该怎么办<代码>解析int?