前言:
新来的同事问我该怎么判断未定义的变量是否存在,第一念头是a != undefined,但是这个显然是不对的
,应该使用typeof检测
typeof是一个运算符,运算数可以是任何类型,返回值是一个字符串。
-
undefined - 如果变量是 Undefined 类型的
-
boolean - 如果变量是 Boolean 类型的
-
number - 如果变量是 Number 类型的
-
string - 如果变量是 String 类型的
-
object - 如果变量是一种引用类型或 Null 类型的
注:这里又涉及javascript5大数据类型,查找资料时,在ECMAScript和javascript的关系上又杠上了......
看了javascript的实现后,我的理解是ECMAScript就是一个标准,制定了各种规范,定义了脚本语言的所有属性、方法和对象。而javascript是由ECMAScript、DOM和BOM组成。
DOM(文档对象模型)是 HTML 和 XML 的应用程序接口(API)。DOM 将把整个页面规划成由节点层级构成的文档。
BOM 主要处理浏览器窗口和框架,不过通常浏览器特定的 JavaScript 扩展都被看做 BOM 的一部分。这些扩展包括:
-
弹出新的浏览器窗口
-
移动、关闭浏览器窗口以及调整窗口大小
-
提供 Web 浏览器详细信息的定位对象
-
提供用户屏幕分辨率详细信息的屏幕对象
-
对 cookie 的支持
IE 扩展了 BOM,加入了 ActiveXObject 类,可以通过 JavaScript 实例化 ActiveX 对象
--------------------------------------------------------------------------------------------华丽丽的分割线------------------------------------------------------------------------------------------------
重新切入到typeof
1.检查变量是否存在,是否有值
typeof undeclaredVariable === 'undefined' // true
var a;
typeof a // 'undefined'
对于已定义的变量,检测时候它的值也可以使用下面的方法
var a;
a === undefined // true
未定义的变量则使用typeof检测,紫云飞的[译]JavaScript:typeof的用途里面说到另一种检测没有声明的全局变量是否存的方法使用if ( window.varabilename ),高招!
2.判断一个值不等于undefined且不等于null
typeof null 返回的是 object,所以此时typeof 判断无效
解决方案(ERROR):
紫云飞译的文章里面说定义一个isDefined函数,但是经过测试在没有声明全局变量的情况下依然会报错。
function isDefined(x) {
return x !== null && x !== undefined;
}
isDefined(a) // ERROR
解决方案(SUCCESS):
先用typeof判断是否存在,再判断是否等于null
typeof a !== undefined && a !== null // false
or
window.a !== undefined && a !== null // false
javascript中的数据类型
ECMAscript中有5中基本数据类型,Undefined、Null、String、Number、Boolean,一种复杂数据类型Object
Undefined
Undefined类型只有一个值,即undefined。使用var变量声明但是未赋值是,变量值即为undefined。
Null
Null类型也只有一个值null。null值表示一个空对象指针,使用typeof null时返回值是‘object’
var obj = null;
typeof obj // 'object'
实际上,undefined值是派生自null值的,因此ECMA-262规定对它们的相等性测试要返回true。
undefined == null // ture
undefined === null // false
Boolean
Boolean类型有两个字面量值,true和false。要将一个值转换为对应的boolea值,可使用类型转换函数Boolean()。
数据类型
|
转换为true值
|
转换为false值
|
Boolean
|
true
|
false
|
String
|
任何非空字符串
|
“”(空字符串)
|
Number
|
任何非0数字值(包括无穷大)
|
0和NAN
|
Object
|
任何对象
|
null
|
Undefined
|
|
undefined
|
Number
这种类型用来表示整数和浮点数,还有一种数据类型NAN(not a number)。这个数值用于本来要返回一个数值的操作数未返回数值的情况(这样就不会抛错了)。
NAN有两个非同寻常的特点。首页,涉及NAN的任何操作都会返回NAN。NAN与任何值都不相等包括它本身。
NAN == NAN // false
isNaN()函数,这个函数接受任何一个参数,该参数可以是任何类型,函数会帮助我们确定这个参数是否“不是数值”。isNaN()在接受一个值之后,会尝试将这个值转换为数值。某些不是数值的值会直接转换为数值,例如字符串“10”或Boolean值,而任何不能被转化为数值的值都会导致这个函数返回true。
isNaN(NaN) // true
isNaN(10) // false
isNaN('10') // false
isNaN('阿树') // true
isNaN(true) // false
String
数值、布尔值、对象和字符串都有toString()方法,但null和undefined没有这个方法。
在不知道要转换的值是不是null或undefined的情况下,可以使用转型函数String(),这个函数能将任何类型的值转为字符串
var value1 = 10;
var value2 = true;
var value3 = null;
var value4;
console.log(String(value1)); // 10
console.log(String(value2)); // true
console.log(String(value3)); // null
console.log(String(value4)); // undefined
Object
To be continued...
参考链接:
[译]JavaScript:typeof的用途
javascript的实现
javascript之数据类型