angular.isdefined有什么好处?


72

angular.isdefined超越的好处是什么foo === undefined

我不能马上想到好处。


3
编写方便,一致
devqon 2015年

2
typeof foo === "undefined"无论如何,您都想使用未定义的变量。
theonlygusti 2015年

1
@theonlygusti为什么不foo === undefined足够?Windows,框架?
本·阿斯顿

2
@Ben有时会出现错误,请参见此问题以及此处的答案。
theonlygusti 2015年

别忘了,在旧版代码中undefined可能会重新定义
danwellman

Answers:


47

用Javascript以任何方式访问真正未定义的变量,除了typeof会引发错误。您只能Angular.isDefined与属性一起使用。例如,这可以正常工作:

angular.isDefined(window.obj);

因为obj是window的未定义属性。

预期行为的示例:

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
它应该angular.isDefined(window.obj);使用大写形式导致参考错误
技巧

1
因此,在您的示例中,由于foo被声明但未赋值,因此foo是“未定义的”,而由于甚至没有声明,所以baz是“真正的未定义”的?...有趣。
Niko Bellic 2015年

28
那么,这有什么好处呢?:)
Petr Peller

1
也许所谓的好处是,询问某事物是否已定义而不是询问它是否未定义,可能减轻了精神压力。
杰森·斯威特

@PetrPeller -它不一定是一个好处,但允许一个truthyfalsey结果从评价that thing that may or may not be-所以它的好处是its easy to not break things by leaning on this construct
勃兰特Solovij

27

来源如下:

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

显然,第一个原因是较低的冗长性,但它也将来会证明是有角度的,尤其是在内部使用该功能时。


17

就像卡姆鲁(Kamlul)所说,棱角分明确实做到了:

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

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

在js中,类型是动态的,因此在您不分配值之前,变量没有类型...因此isDefined会告诉您,变量声明是否存在以及此变量是否包含内容。

但是,请小心,因为变量可以为null,在这种情况下,变量的类型将是object。

您可以尝试以下代码:

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)变量存在但没有值,因此未定义

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

c)var存在但为null,不能干扰类型,因此其类型为object

d)变量尚未声明,所以...未定义

要点是“ 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)引发异常,因此...您的代码将失败

结论

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

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

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,如果未定义,则使用某个值对其进行初始化。

正如@TonyBrasunas在myvar评估为false时发表的评论一样,将分配“一些初始值”。使用此技巧之前,请考虑到这一点。

这在功能上很好,例如:

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

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

或者...与另一个字符:

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

3
实际上,myvar = myvar || 'some init value';如果myvar定义的值不是null而是false ,也会分配字符串值。例如,如果myvaris false,则您的分配技巧在这里无法正常工作。
托尼·布拉索纳斯

0

我只能猜测,但我认为我的猜测是相当不错的。

这两个表达式在功能上等效:

typeof foo !== 'undefined'

angular.isDefined(foo)

后者的好处包括:

1)可以说,问某事是否定义比问某事是否未定义少了精神压力

2)的angular.isDefined(foo)“噪音”可以说比少很多typeof foo !== 'undefined',因此可以更快地掌握正在发生的事情。

注意:这些不是的优势angular.isDefined。我要传达的是我对Angular团队angular.isDefined为什么要创建以及为什么他们认为它比普通JavaScript替代方案更好的猜测。


2
恐怕它们在功能上并不相同。在大写情况下,foo可以是当前作用域中未定义的名称,而在第二种情况下,它将引发ReferenceError。
Gunchars '18年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.