angular.isdefined
超越的好处是什么foo === undefined
?
我不能马上想到好处。
angular.isdefined
超越的好处是什么foo === undefined
?
我不能马上想到好处。
typeof foo === "undefined"
无论如何,您都想使用未定义的变量。
foo === undefined
足够?Windows,框架?
undefined
可能会重新定义
Answers:
用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
angular.isDefined(window.obj);
使用大写形式导致参考错误
truthy
或falsey
结果从评价that thing that may or may not be
-所以它的好处是its easy to not break things by leaning on this construct
就像卡姆鲁(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']
myvar = myvar || 'some init value';
如果myvar
定义的值不是null而是false ,也会分配字符串值。例如,如果myvar
is false
,则您的分配技巧在这里无法正常工作。
我只能猜测,但我认为我的猜测是相当不错的。
这两个表达式在功能上等效:
typeof foo !== 'undefined'
angular.isDefined(foo)
后者的好处包括:
1)可以说,问某事是否定义比问某事是否未定义少了精神压力。
2)的angular.isDefined(foo)
“噪音”可以说比少很多typeof foo !== 'undefined'
,因此可以更快地掌握正在发生的事情。
注意:这些不是我的优势angular.isDefined
。我要传达的是我对Angular团队angular.isDefined
为什么要创建以及为什么他们认为它比普通JavaScript替代方案更好的猜测。
foo
可以是当前作用域中未定义的名称,而在第二种情况下,它将引发ReferenceError。