我正在尝试使用JavaScript创建一些功能,但JavaScript不同意逻辑。
在我的控制台中,我检查了我试图操作的元素,并且我有这个代码:
<input type="text" id="address" autocomplete="off" data-lat="" data-lng="">
然后我想检查data-lat
或data-lng
属性是否为空。
在我的JavaScript文件中,我有以下代码:
$addressField.on(
'blur',
function()
{
console.assert($addressField.attr('data-lat') != '', 'Address latitude it is not empty');
if($addressField.val() == '')
{
$addressField.attr('data-lat', '').attr('data-lng', '').val('');
}
else if($addressField.attr('data-lat') == '' || $addressField.attr('data-lng') == '')
{
$addressField.attr('data-lat', '').attr('data-lng', '').val('');
}
}
)
当我加载页面时,我在控制台中收到以下消息:
Assertion failed: Address latitude it is not empty
我做错了吗?或者只是JavaScript得到理智?
更新#1
我很抱歉,但我没有说明我在$addressField
的模糊事件上运行此代码。我修改了代码,以便了解实际的代码。
更新#2
大多数人都在console.assert
上有堆叠,但即使我不使用console.assert
,else if( .... )
语句也会再次变为false,而第二个块不会执行。
console.assert
仅用于帮助我确定问题。
答案 0 :(得分:1)
在Javascript中,比较运算符==和===表示不同的东西。最佳做法是在几乎所有情况下都避免使用==并使用===。
答案 1 :(得分:1)
这是确切的行为。
由于值为空,$addressField.attr('data-lat') != ''
为 false
,因此断言正在执行。这是对的。
这是消息以Chrome格式记录的方式,请查看此docs
如果指定的表达式为false,则将消息与堆栈跟踪一起写入控制台。
答案 2 :(得分:1)
关于UPDATE #2
@Praveen Jeganathan已经断言你的断言失败了,这意味着$addressField.attr('data-lat') != ''
是false
。这意味着$addressField.attr('data-lat')
的值相等(或可以评估)为''(即为空),因此第一个 if 语句为 true ,第一个块被执行:
if($addressField.val() == '') //this expression is true
{
//this code is going to be executed
$addressField.attr('data-lat', '').attr('data-lng', '').val('');
}
else if($addressField.attr('data-lat') == '' || $addressField.attr('data-lng') == '')
{
//this block it's not going to be executed, because the first one
//was, EVEN THOUGH the expression from this if statement
//evaluates to TRUE
$addressField.attr('data-lat', '').attr('data-lng', '').val('');
}
这与写作相同:
var someVar = 5;
if(someVar === 5) { /* Do something here */}
else if(someVar === 5) {
//How am I going to execute this code!?!
//The first one will always get executed
//If the first one will not get executed, I will never be executed too.
}