Ben*_*Ben 71 javascript angularjs
angular.isdefined超过以上的好处是什么foo === undefined?
我不能马上想到一个好处.
Bha*_*ina 46
在Javascript中以任何方式访问真正未定义的变量,但typeof会抛出错误.您只能使用Angular.isDefined属性.例如,这样可以正常工作:
angular.isDefined(window.obj);
Run Code Online (Sandbox Code Playgroud)
因为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
Run Code Online (Sandbox Code Playgroud)
Mat*_*Way 25
这是来源:
function isDefined(value) {return typeof value !== 'undefined';}
Run Code Online (Sandbox Code Playgroud)
显然,第一个原因是较低的详细程度,但它也是未来的证明角度,特别是如果函数在内部使用.
Car*_*des 16
像Kamrul说角度确实:
function isDefined(value) { return typeof value !== 'undefined'; }
Run Code Online (Sandbox Code Playgroud)
这意味着"此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);
Run Code Online (Sandbox Code Playgroud)
你将在控制台中看到下一个:
a: undefined
b: string
c: object
d: undefined
Run Code Online (Sandbox Code Playgroud)
所以,
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);
Run Code Online (Sandbox Code Playgroud)
您将在控制台中看到下一个:
false
Uncaught ReferenceError: d is not defined
Run Code Online (Sandbox Code Playgroud)
哪个......是个大问题,因为:
a)告诉你,当那不是真的时,这不是未定义的
d)提出异常......你的代码会失败
如果要检查变量是否存在并且已使用值初始化,则定义使用,但要注意空值,因为null是一个对象(定义的var也是如此).
如果要验证变量是否存在且具有任何有效值(因此不为null),您可以简单地执行以下操作:
if (myvar) {
console.log('myvar is defined and is not null');
} else {
console.log('myvar is undefined or null');
}
Run Code Online (Sandbox Code Playgroud)
另一个好方法是,如果未使用||定义var,则初始化为某个值
myvar = myvar || 'some init value';
Run Code Online (Sandbox Code Playgroud)
上面的代码获取myvar的值,如果已定义,则不为null,如果不是,则使用某个值初始化它.
正如@TonyBrasunas在评论myvar被评估为false时发表他的评论,将分配'some init value'.在使用此技巧之前,请考虑这一点.
这在功能方面很好,例如:
function split(input, charToSplit) {
charToSplit = charToSplit || ' ';
return input.split(charToSplit);
}
Run Code Online (Sandbox Code Playgroud)
然后默认情况下你可以用空格分割:var input ='asd asd'; var splited = split(input); // - > splited = ['asd','asd']
或者...与另一个char:
var input = 'asd|asd';
var splited = split(input, '|');
// --> splited= ['asd', 'asd']
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
37366 次 |
| 最近记录: |