angular.isdefined有什么好处?

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)

  • 那么,这有什么好处呢?:) (27认同)

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)

  • 实际上,`myvar = myvar || 如果定义了“ myvar”不是null而是false,则“ some init value”;还将分配字符串值。例如,如果“ myvar”为“ false”,则此处的分配技巧无法正常工作。 (3认同)