angular.isdefined
超过foo === undefined
会有什么好处?
我无法立即想到一个好处。
答案 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替代品更好。