++++++++++++++++++++++++++++++
typeof运算符
typeof运算符确定变量的类型,可以是以下值之一:‘boolean’, ‘number’, ‘string’, ‘symbol’, ‘object’,‘function’和’undefined’。
- undefined 和 null
JavaScript数据类型,它只定义了6种基本数据类型。
null:空、无。表示不存在,当为对象的属性赋值为null,表示删除该属性。
undefined:未定义。当声明变量却没有赋值时会显示该值。可以为变量赋值为undefined。
number:数值。
string:字符串。
boolean:布尔值。
object:对象。
alert(typeof 1); // 返回字符串"number"
alert(typeof "1"); // 返回字符串"string"
alert(typeof true); // 返回字符串"boolean"
alert(typeof {}); // 返回字符串"object"
alert(typeof []); // 返回字符串"object "
alert(typeof function(){}); // 返回字符串"function"
alert(typeof null); // 返回字符串"object"
alert(typeof undefined); // 返回字符串"undefined"
- 当访问一个未定义的变量时,JavaScript 会抛出一个引用错误:
a; // 未定义 , 抛出 "ReferenceError: a is not defined"
typeof a; // 当变量未定义时,typeof === undefined 判断有效 true,a的类型为undefined
var b; // 定义未初始化
typeof b; // 变量已定义但未初始化时,typeof === undefined 判断有效,b的类型为undefined
var c;
c = 1;
c = null; // c对象附空值
typeof c; // typeof === object
- 使用typeof(document.f1) === “undefined” 判断变量是否存在
if (typeof a === 'undefined') {
// a (未定义) 或 (已定义但未初始化)
} else {
// a (已定义和已初始化)
}
if (typeof b !== 'undefined') {
// b (已定义和已初始化)
} else {
// b (未定义) 或 (已定义但未初始化)
}
- 使用try/catch,只捕获未定义错误,不管是否初始化
当访问一个未定义的变量时,JavaScript 会抛出一个引用错误:
尝试捕获引用错误
// a 未定义
try {
a;
console.log('a 未定义')
} catch(e) {
e; // => ReferenceError
console.log('a 未定义');
}
// logs 'a 未定义'
// b 已定义,未初始化
let b;
try {
b;
console.log('b 已定义')
} catch(e) {
console.log('b 未定义');
}
// logs 'b 已定义'
与typeof方法相比,try/catch更精确,因为它仅确定变量是否未定义,不管已初始化或未初始化。
- 使用window.hasOwnProperty()
要检查全局变量是否存在,可以采用更简单的方法。
每个全局变量都存储为全局对象的一个属性(window在浏览器环境中,global在 NodeJS 中)。可以使用这个想法来确定是否定义了全局变量myGlobalVar:只需检查全局对象是否存在相应的属性:window.hasOwnProperty(‘myGlobalVar’):
if (window.hasOwnProperty('IntersectionObserver')) {
// 浏览器提供了IntersectionObserver
} else {
// 浏览器不支持IntersectionObserver
}
var变量和function声明,当在最外层范围(也称为全局范围)中使用时,会在全局对象上创建属性:
// 外部范围
var num = 19;
function greet() {
return 'Hello!';
}
window.hasOwnProperty('num'); // => true
window.hasOwnProperty('greet'); // => true
但是,请注意,const和let变量,以及class声明不会在全局对象上创建属性:
// 外部范围
const pi = 3.14;
let message = 'Hi!';
class MyClass {}
window.hasOwnProperty('pi'); // => false
window.hasOwnProperty('message'); // => false
window.hasOwnProperty('MyClass'); // => false
参考:http://www.webkaka.com/tutorial/js/