angular.isdefined有什么好处?

时间:2015-01-07 11:21:33

标签: javascript angularjs

angular.isdefined超过foo === undefined会有什么好处?

我无法立即想到一个好处。

4 个答案:

答案 0 :(得分:45)

在Javascript中以任何方式访问真正未定义的变量,但typeof会抛出错误。您只能将Angular.isDefined与属性一起使用。例如,这样可以正常工作:

angular.isDefined(window.obj);

因为obj是一个未定义的窗口属性。

预期行为的示例:

var foo;
var bar = 42;

typeof foo !== 'undefined'; // false
typeof bar !== 'undefined'; // true
typeof baz !== 'undefined'; // false

angular.isDefined(foo); // false
angular.isDefined(bar); // true
angular.isDefined(baz); // ReferenceError

答案 1 :(得分:25)

以下是来源:

function isDefined(value) {return typeof value !== 'undefined';}

显然,第一个原因是较低的详细程度,但它也是未来的证明角度,特别是如果函数在内部使用。

答案 2 :(得分:13)

像卡姆鲁尔所说,角度确实如此:

function isDefined(value) { return typeof value !== 'undefined'; }

这意味着“此var的类型未定义”...在您举例中,您比较变量的内容等于undefined,而angular正在检查变量的类型。

在js中,类型是动态的,所以在你没有赋值之前,变量没有类型......所以isDefined会告诉你两者,如果存在变量声明,并且这个变量是否有任何内容。

但是,要小心,因为变量可能为null,在这种情况下,变量的类型将是对象。

您可以尝试以下代码:

var a;
var b = 'asd';
var c = null;

console.log('a: ' + typeof a);
console.log('b: ' + typeof b);
console.log('c: ' + typeof c);
console.log('d: ' + typeof d);

你会在控制台中看到下一个:

a: undefined
b: string 
c: object 
d: undefined

所以,

a)var存在但没有值,因此未定义

b)var存在并且有值..这个值是一个字符串,所以这是它的类型

c)var存在但是为null,类型不能被干扰,因此它的类型是对象

d)var尚未声明...它是未定义的

重点是“a”和“d”之间的差异......所以试试下一个:

console.log('a is undefined? ' + a === undefined);
console.log('d is undefined? ' + d === undefined);

您将在控制台中看到下一个:

false
Uncaught ReferenceError: d is not defined

哪个......是个大问题,因为:

a)告诉你,当那不是真的时,这是不确定的

d)提出异常......你的代码将失败

结论

当您想要检查变量是否存在并且已使用值初始化时定义了使用,但要注意空值,因为null是一个对象(定义的var也是如此)。

如果要验证变量是否存在且具有任何有效值(因此不为空),您可以简单地执行以下操作:

if (myvar) {
  console.log('myvar is defined and is not null');
} else {
    console.log('myvar is undefined or null');
}

另一个好方法是,如果未使用||

定义var,则初始化某个值
myvar = myvar || 'some init value';

上面的代码获取了myvar的值,如果已定义且不为null,如果不是,则使用某个值初始化它。

  

如果myvar被评估为假,@ TonyBrasunas发表评论,将分配'some init value'。在使用这个技巧之前要考虑这一点。

这在功能上很好,例如:

function split(input, charToSplit) {
  charToSplit = charToSplit || ' ';
  return input.split(charToSplit);
}

然后默认情况下您可以使用空格分割:     var input ='asd asd';     var splited = split(input);     // - > splited = ['asd','asd']

或者...与另一个char:

var input = 'asd|asd';
var splited = split(input, '|');
// --> splited= ['asd', 'asd']

答案 3 :(得分:0)

我只能猜测,但我认为我的猜测非常好。

这两个表达式在功能上是等价的:

typeof foo !== 'undefined'

angular.isDefined(foo)

后者的好处包括:

1)问及是否被定义而不是询问某些事物是否未定义,这可能是一种精神压力。

2)angular.isDefined(foo)可以说少了很多"嘈杂"比typeof foo !== 'undefined'更快,因此可以更快地掌握发生的事情。

注意:对于angular.isDefined的优越性,这些 我的参数。我想要传达的是我猜测Angular团队为什么要创建angular.isDefined以及为什么他们认为它比普通的JavaScript替代品更好。