Angular.is 的好处是什么?

超过 foo === undefinedangular.isdefined有什么好处?

我想不出有什么好处。

43763 次浏览

在 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

资料来源如下:

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

显然,第一个原因是较低的冗长度,但它也将证明角度,特别是如果函数是内部使用。

就像 Kamrul 说的,有棱有角:

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

这意味着“这个变量的类型是未定义的”... ... 在你的例子中,你比较变量的内容是等于未定义的,角度是检查变量的类型。

在 js 中,类型是动态的,所以除非你没有赋值,否则变量没有类型... ... 所以 isDefinition 会告诉你变量声明是否存在,以及这个变量是否有内容。

但是,要小心,因为变量可能是 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) var 存在但没有值,所以没有定义

B) var 存在且具有 value. . this value 是一个字符串,所以这是它的类型

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 也是如此)。

如果你想验证一个变量是否存在并且有任何有效值(所以不是 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 的值(如果定义了 myvar 而不是 null) ,如果没有使用某个值初始化 myvar。

正如@TonyBrasunas 在他的评论中所说,如果 myvar 被赋值为 false,那么“一些 init 值”将被赋值。在使用这个技巧之前要考虑到这一点。

这在函数方面很好,例如:

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

然后默认情况下,你可以用空格分割: Var input = ‘ asd asd’; 分裂 = 分裂(输入) ; [‘ 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 团队想要创建 angular.isDefined,为什么他们认为它比普通的 JavaScript 更好。