导读
5种基本数据类型:Undefined、Null、Boolean、Number、String
1种复杂数据类型:Object
typeof操作符
检测给定变量的数据类型
var message = "abc"
var msg2;
alert(typeof (msg)); //undefined,未声明
alert(typeof (msg2)); //undefined,未初始化
alert(typeof (true)); //boolean
alert(typeof (12)); //number
alert(typeof (message)); //string
alert(typeof (null)); //object
数据类型
Undefined
只有一个值,“undefined”
看栗子:
var msg;
// var str;
alert(msg);//undefined
alert(str);//报错
对于未声明的变量,只能用typeof检测其数据类型
var msg;//msg声明后默认值是undefined
// var str;
alert(typeof (msg));//undefined
alert(typeof (str));//undefined
上述例子说明:未初始化的变量和未声明的变量用typeof检测其数据类型,都是undefined。
所以最好初始化变量,这样当typeof返回“undefined”时,就知道该变量还没有声明。
Null
只有一个值,“null”
从逻辑角度看,null值表示一个空对象指针,typeof检测null值返回”object”。
alert(typeof (null));//object
如果定义的变量将来用作保存对象,那么最好初始化为null,这样只要检查null值就能知道相应的变量是否已经保存了一个对象的引用
alert(null == undefined);//true
undefined值是派生自null值的,ECMA-262规定对他们的相等性测试要返回true。虽然这里的相等操作符(==)总是返回true,但这个操作符处于比较的目的会转换其操作数。
undefined和null用途完全不同:无论什么情况下都没必要把一个变量的值显式地设置为undefined;但意在保存对象的变量还没有真正保存对象,就明确让变量保存null值。体现null作为空对象指针的惯例,进一步区分null和undefined。
undefined 和null 常被用来表示“空的”值或“不是值”的值。二者之间有一些细微的差别:
null 指空值(empty value)
undefined 指没有值(missing value)
null 是一个特殊关键字,不是标识符,我们不能将其当作变量来使用和赋值。然而undefined 却是一个标识符,可以被当作变量来使用和赋值。
Boolean
两个字面值:true false
ES中所有类型的值都有与这两个Boolean值等价的值,转型函数Boolean()
看栗子:
var msg = "hello!"
var msgBoolean = Boolean(msg);
alert(msgBoolean);//true
Boolean()转换规则:
数据类型 | 转为true的值 | 转为false的值 |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | **(空字符串) |
Number | 任何非零数字值(包括无穷大) | 0和NaN |
Object | 任何对象 | null |
Undefined | n/a | undefined |
这些转换规则对理解流控制语句自动执行相应的Boolean转换很重要,因此确切地知道流控制语句中使用的是什么变量至关重要。错误地使用一个对象而不是Boolean值,就有可能彻底改变应用程序的流程。
看栗子,应用在流控制语句中:
var msg = "hello!";
if(msg){
alert(msg);
}
拓展:
var a = null;
var b = {};
var c = {name:'xx'};
if(!b){ console.log(1);}
else if(b == a) { console.log(2);}
else { console.log(3);}
//打印出3
if({name:'xx'})console.log("true"); // true
在此,想要说明的是null是空对象指针,里面没有东西的;而b的变量值存放了一个地址引用(也叫做地址指针),从打印的结果来看,{}能找到它的原型,证明它里面是有东西的,这个以后也能接触到,在这里就不长篇大论啦。
Number
用IEEE754格式来表示整数和浮点数值。
在进行算术计算时,所有以八进制和十六进制表示的数值最终都被转换成十进制数值(八进制字面量在严格模式下是无效的,导致支持的javascript引擎抛出错误)。
javascript可以保存正零(+0)和负零(-0),被认为相等。
浮点数值计算会产生舍入误差,是使用基于IEEE754数值的浮点计算的通病。看栗子:
var a=0.1,b=0.2;
sum=a+b;
console.log(sum); //0.30000000000000004
如果某次计算的结果得到一个超出js数值范围的值,这个数值就被自动转换成特殊的Infinity值。如果某次计算返回了正/负的Infinity值,那么该值无法继续参与下一次的计算,这个值不是能够参与计算的数值。要想确定一个数值是不是有穷的(是不是位于最大和最小值之间),可以用isFinite()函数,这个函数在参数位于最大与最小值间返回true。
NaN:表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)。eg:其他编程语言中,任何数除以0都会导致错误。从而停止代码执行,但在ES中,任何数除以0都会返回NaN,不会影响其他代码的执行。特点:①任何涉及NaN的操作,都会返回NaN,这个在多步计算中可能导致问题;②NaN与任何值都不想等,包括NaN本身。
alert( NaN == NaN );//false
有关解析字符串的两个函数:
parseInt()
parseFloat()
String
由零或多个16位的Unicode字符组成的字符序列,即字符串。
5.1 字符字面量
字面量 | 含义 |
---|---|
\n | 换行 |
\t | 制表 |
\b | 空格 |
\r | 回车 |
\\ | 斜杠 |
\’ | 单引号(’),在用单引号表示的字符串中使用 |
\” | 双引号(”),在用双引号表示的字符串中使用 |
\xnn | 以十六进制代码nn表示的一个字符(n为0~F) |
\unnnn | 以十六进制代码nnnn表示的一个Unicode字符(n为0~F) |
字符串特点
ES中的字符串是不可变,要改变的话只能销毁原本的字符串。
看栗子:
var lang = 'Java'
lang = lang + 'Script'
实际操作:先创建一个容纳10个字符的新字符串,字符串拼接成JavaScript之后,会销毁Java和Script两个字符串(部分旧浏览器拼接字符串慢)。
转换字符串
toString():把一个逻辑值转换为字符串,并返回结果
var num = 10;
alert (num.toString()); //除了null和undefined,其他数据类型都能用这个方法
alert(num.toString(8)); //数值可传参数,参数指定输出的值的基数(进制)
转型函数String():在不确定值是否为null和undefined时
var value1=10,value2=null,value3;
console.log(String(value1));//如果值有toString()方法,调用toString(),返回10
console.log(String(value2));//返回null
console.log(String(value3));//返回undefined
Object
JavaScript 中的所有事物都是对象:字符串、数值、数组、函数…
此外,JavaScript 允许自定义对象。对象只是带有属性和方法的特殊数据类型。
ES中的对象的行为不一定适用于js中的其他对象。浏览器环境中的对象,eg:BOM对象和DOM对象,属于宿主对象,可能会也可能不会继承Object。
参考文献:
〔1〕Nicholas C. Zakas .
Professional JavaScript for Web Developers,3rd Edition[M] . Wrox . 2012
〔2〕Kyle Simpson . You Don’t Know JS[M] . O’Reilly Media . 2014