一些编程语言有 == 、 ===之类的比较运算符,== 与 === 的区别主要体现在 值的比较逻辑 上,具体行为取决于编程语言的设计。
当你想要比较两个值等于,但不考虑它们的类型,== 就很适合。
例如:
var x = 10;
var y = '10';
console.log(x == y)  // true
console.log(x === y) // false
示例对比表(JavaScript):
| 表达式 | == 结果 | 
=== 结果 | 
原因 | 
|---|---|---|---|
5 == "5" | 
true | 
false | 
字符串转数字后比较 | 
0 == false | 
true | 
false | 
false 转 0 | 
null == undefined | 
true | 
false | 
特殊规则(仅 == 时相等) | 
NaN == NaN | 
false | 
false | 
NaN 不等于任何值(包括自身) | 
双等和三等区别
定义:
== 只比较两个变量的值;
=== 比较两个变量的值、还有类型;
记忆 :
弱类型语言的=== 有可能是借鉴了数学符号全等 ≌ 、≡ 。
在java(强类型)中 == 就是全等了,因为用==比较不同类型的值时,直接报错了,并且无法执行!
风险:
在某些场景下, 由于双等判断只比较值,那么判断的变量有替换成别的类型也能true, 就会有绕过的风险。
编写代码时需要的考虑:
代码的表达式里如果使用了==比较操作符,表达式里某个变量如果来自外部输入,需要根据代码上下文判断是否有安全风险、绕过风险。
Example 1 —— int 和 string 类型
<?php
	header("Content-type: text/html; charset=utf-8"); 
	$密码 = 000000;
	$input = "000000";  # 外部输入的密码
	if($密码==$input){
		echo "密码正确!";
	}else{
		echo "密码错误!";
	};
?>
out: 密码正确!
Example 2 —— md5绕过
md5('240610708') == md5('QNKCDZO'); //True
md5('240610708') = = = md5('QNKCDZO'); //False
                    
                
                
            
        
浙公网安备 33010602011771号