Javascript 如何检查是否存在敲除观察值?

Javascript 如何检查是否存在敲除观察值?,javascript,knockout.js,Javascript,Knockout.js,假设我有一个可观察的json: self.name = ko.observable('Arnab'); self.surname= ko.observale('Bhagabati') var person = { name:ko.observable('Arnab'), lastName= ko.observale('Bhagabati') } 我可以通过console.log(person.name())访问人名 我如何检查我的人是否有一个名为薪水的可忽略的可观察属性 if (ty

假设我有一个可观察的json:

self.name = ko.observable('Arnab');
self.surname= ko.observale('Bhagabati')

var person = {
  name:ko.observable('Arnab'),
  lastName= ko.observale('Bhagabati')
}
我可以通过
console.log(person.name())访问人名


我如何检查我的
是否有一个名为
薪水
的可忽略的可观察属性

if (typeof person.salary() !== 'undefined')

给出
参数。工资不是以下代码中的函数,
=检查
null
未定义的

if (person.salary != null) {
    // ...
}

在下面的代码中,
=检查
null
未定义的

if (person.salary != null) {
    // ...
}

可观测的是函数。如果没有
salary
属性,
person.salary()
将抛出异常

因此,您可以使用:

if (typeof ko.unwrap(person.salary) !== 'undefined')
{

}
unwrap
返回属性的值,无论其是否可见


有关更多信息,请参阅。

观测值是函数。如果没有
salary
属性,
person.salary()
将抛出异常

var val = ko.unwrap(person.salary);
因此,您可以使用:

if (typeof ko.unwrap(person.salary) !== 'undefined')
{

}
unwrap
返回属性的值,无论其是否可见

有关更多信息,请参阅

var val = ko.unwrap(person.salary);

无论<代码>人员。工资是否可见,都将工作

无论<代码>人员。工资是否可见,都将工作

我如何检查我的人是否有一个可忽略的可观察属性,比如工资

(强调矿山)

如果像其他答案所建议的那样,按照
If(ko.unwrap(person.salary))
行进行检查,那么基本上就是检查是否存在已定义的
salary
属性

即:

对于
typeof ko.unwrap(person.salary)==“undefined”

如果我照字面理解你写的,这并不能回答“person”对象是否有一个称为
salary
的可观察属性

要回答此问题,您需要
ko.isObservable

var个人=[
[{ }, "{ }"],
[{salary:undefined},“{salary:undefined}”,
[{salary:ko.observable()},“{salary:ko.observable()”]
]
var check1=人员=>ko.unwrap的类型(人员工资)==“未定义”;
var check2=个人=>ko.isObservable(个人工资);
log(check1.toString());
persons.forEach(([p,c])=>console.log(c,“->”,check1(p));
log(check2.toString());
persons.forEach(([p,c])=>console.log(c,“->”,check2(p));
我如何检查我的人是否有一个可忽略的可观察属性,比如工资

(强调矿山)

如果像其他答案所建议的那样,按照
If(ko.unwrap(person.salary))
行进行检查,那么基本上就是检查是否存在已定义的
salary
属性

即:

对于
typeof ko.unwrap(person.salary)==“undefined”

如果我照字面理解你写的,这并不能回答“person”对象是否有一个称为
salary
的可观察属性

要回答此问题,您需要
ko.isObservable

var个人=[
[{ }, "{ }"],
[{salary:undefined},“{salary:undefined}”,
[{salary:ko.observable()},“{salary:ko.observable()”]
]
var check1=人员=>ko.unwrap的类型(人员工资)==“未定义”;
var check2=个人=>ko.isObservable(个人工资);
log(check1.toString());
persons.forEach(([p,c])=>console.log(c,“->”,check1(p));
log(check2.toString());
persons.forEach(([p,c])=>console.log(c,“->”,check2(p));

如果您想要快速解决方案,只需查看对象类型是否为函数,然后添加一些检查,以确定其中是否存在敲除特定的函数。这对于在ko.computed中使用非常方便,当您非常确定可观察对象将在那里,但还没有

var isKoObservable = function(obs) {
  var retVal = false;
  if (typeof obs === "function") {
    if (typeof obs.subscribe === "function" && typeof obs.notifySubscribers === "function") {
      // its HIGHLY likely to be an observable or observableArray
      retVal = true; 
    }
  }

  return retVal;
}
有关详细信息,请参见此答案:

如果您想要快速解决方案,只需查看对象类型是否为函数,然后添加一些检查,以确定其中是否存在敲除特定的函数。这对于在ko.computed中使用非常方便,因为您非常确定可观察对象将在那里,但还没有

var isKoObservable = function(obs) {
  var retVal = false;
  if (typeof obs === "function") {
    if (typeof obs.subscribe === "function" && typeof obs.notifySubscribers === "function") {
      // its HIGHLY likely to be an observable or observableArray
      retVal = true; 
    }
  }

  return retVal;
}
有关详细信息,请参见此答案: