JS自学_判断undefined 和 null

++++++++++++++++++++++++++++++
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 
  1. 使用typeof(document.f1) === “undefined” 判断变量是否存在
if (typeof a === 'undefined') {
  // a (未定义) 或 (已定义但未初始化)
} else {
  // a (已定义和已初始化)
}

if (typeof b !== 'undefined') {
  // b (已定义和已初始化)
} else {
  // b (未定义) 或 (已定义但未初始化)
}
  1. 使用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更精确,因为它仅确定变量是否未定义,不管已初始化或未初始化。

  1. 使用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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值