就像 Kamrul 所说的那样:
function isDefined(value) { return typeof value !== 'undefined'; }
这意味着“这个变量的类型是未定义的”......在你的例子中你比较变量的内容等于未定义并且角度正在检查变量的类型。
在 js 中,类型是动态的,所以在你不赋值之前,变量没有类型......所以 isDefined 会告诉你是否存在变量声明以及该变量是否有任何内容。
但是,要小心,因为变量可能为空,在这种情况下,变量的类型将是对象。
你可以试试这个代码:
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,类型不受干扰,所以它的类型是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) 引发异常,所以...您的代码将失败
结论
当你想检查一个变量是否存在并且已经用一个值初始化时定义了使用,但要小心 null 值,因为 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 发表的评论,如果 myvar 被评估为 false,则将分配“一些初始值”。在使用这个技巧之前要考虑到这一点。
这在功能上很好,例如:
function split(input, charToSplit) {
charToSplit = charToSplit || ' ';
return input.split(charToSplit);
}
那么默认情况下你可以用空格分割:
var 输入 = 'asd asd';
var splited = split(输入);
// --> splited = ['asd', 'asd']
或者...与另一个字符:
var input = 'asd|asd';
var splited = split(input, '|');
// --> splited= ['asd', 'asd']