Angular.isdefined的好处是什么



angular.isdefinedfoo === undefined有什么好处?

我不能立即想到一个好处。

在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

这是来源:

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

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

就像Kamrul说的angular:

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

这意味着"此变量的类型未定义"...在您的示例中,您比较变量的内容等于未定义,角度正在检查变量的类型。

在 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) 变量存在并具有价值。此值是一个字符串,因此这是其类型

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

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) 提出异常,以便...你的代码会失败

结论

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

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

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

另一个好技巧是,如果变量没有用 || 定义,则初始化为某个值

myvar = myvar || 'some init value';

上面的代码采用 myvar 的值,如果已定义而不是 null,如果没有用某个值初始化它。

正如@TonyBrasunas在他的评论中所说,如果myvar被评估为false,将分配"一些init值"。在使用此技巧之前,请考虑这一点。

这在函数中很好,例如:

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

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

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

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

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

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

typeof foo !== 'undefined'
angular.isDefined(foo)

后者的好处包括:

1)可以说,问某事是否定义比问某物是否没有未定义要小得多。

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

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

最新更新