实现JavaScript函数是不同的(oldValue、newValue),以比较类人风格的空白

实现JavaScript函数是不同的(oldValue、newValue),以比较类人风格的空白,javascript,angularjs,compare,coercion,Javascript,Angularjs,Compare,Coercion,我从后端获取一些属性和对象,并使用AngularJS将它们放入输入字段(输入、文本区域、复选框、下拉列表) 这些属性在某些情况下是文本值,在某些情况下是数字值,但也可以是null、未定义的、false或” 我克隆了这个对象,然后通过比较旧的(存储的)值和新的(当前的)值来检查用户是否对这些值进行了任何修改 我不想使用ng dirty类来检测更改,因为在先前的修改后(例如,使用Ctrl+Z)返回到以前的值时,它不会消失 我原以为这项任务很简单,但由于价值观的原因,我遇到了麻烦 当然,我会处理这些问

我从后端获取一些属性和对象,并使用AngularJS将它们放入输入字段(输入、文本区域、复选框、下拉列表)

这些属性在某些情况下是文本值,在某些情况下是数字值,但也可以是
null
未定义的
false

我克隆了这个对象,然后通过比较旧的(存储的)值和新的(当前的)值来检查用户是否对这些值进行了任何修改

我不想使用
ng dirty
类来检测更改,因为在先前的修改后(例如,使用Ctrl+Z)返回到以前的值时,它不会消失

我原以为这项任务很简单,但由于价值观的原因,我遇到了麻烦

当然,我会处理这些问题:

  • null
  • 未定义
  • false
“空值”,因为对于用户来说,“空字段就是空字段”,而不管模型在下面存储什么。因此,例如,从
未定义的
更改为
实际上并不是一个更改

到目前为止,我得到了这个:

$scope.areDifferent = function (oldValue, newValue) {

    var a = true, b = true;

    if (oldValue === null ||
       oldValue === undefined ||
       oldValue === false ||
       oldValue === "") {
        a = false; 
    }

    if (newValue === null ||
       newValue === undefined ||
       newValue === false ||
       newValue === "") {
        b = false; 
    }

    if (!a && !b) {
        return false; // both values are "empty"
    }
    else if (a != b) {
        return true; // one of the values is "non-empty"
    }
    else {
        return oldValue != newValue; // compare the value of "non-empty" properties
    }
}
但我很好奇这是否正确(是否有任何未覆盖的边缘情况?)以及它是否可以简化,因为我知道在JS中有一些有用的方法,如:

  • a | |'
  • if(a)
  • if(a.length)
  • if(a==null)
我曾尝试在这里使用它们,但它只会导致挫折,因为总是有一个边缘的情况下,这是没有涵盖。非常感谢您的帮助。

您可以使用

if (!oldValue && newValue || oldValue && !newValue) {
    // update
}
这意味着,如果
oldValue
为真,且
newValue
为假,或者
oldValue
为假,且
newValue
为真,则更新数据

对相同类型和更改的扩展检查

if (!oldValue && newValue || oldValue && !newValue || typeof oldValue === typeof newValue && oldValue !== newValue) {
    // update
}

是否确实要将
false
视为空值?那么
0
NaN
呢?它们是一种东西吗?在文本输入中,
'0'
是真实的。@Thomas是的,因为当属性以
null
未定义的形式到达时,用户将其打开,然后再次关闭,新值将是
false
,对于用户来说,它仍然是“原始值”复选框的值。看起来您的答案是正确的,但我只需要在我的HTML中为AngularJS添加
ng false value=“'false'”ng true value=“'true'”
,因为看起来像
false
值作为
“false”
到达模型。哦,请修正最后一个变量名的输入错误(我想应该是
newValue
而不是
value
)。除此之外,它很棒。