
类型判断 typeof
Javascript是弱类型语言,定义变量时不需要显示的指定数据类型
不初始化变量时,默认会被初始化为Undefined类型
var a; //相当于var a = undefined;
有初始化情况下,变量的类型则会根据初始化的值改变而改变
var a = 1; //此时a为数值类型
a = '1'; //此时a为字符串类型
a = false; //此时a为布尔类型
typeof
操作符可以用于判断这些变量的类型
var a = 1;
typeof a; //number
var b = 'a';
var c = "a";
typeof b; //string
typeof c; //string;
var d = true;
var e = false;
typeof d; //boolean
typeof e; //boolean
var f = null;
typeof f; //object
var h = function() {};
typeof h; //function
var a;
typeof a; //unfined
基本数据类型
Undefined类型
该类型的值只有一个值,即undefined。
在变量被定义时未初始化的时候,默认情况下,该变量被赋予了Undefined类型,即undefined。
var a;
a == undefined //true
typeof a; // undefined
需要注意的是,对于未定义的变量,使用typeof
操作符也同样返回undefined,但是访问未定义的变量会报语法错误
typeof b; //假设b是未定义的变量,使用typeof依然返回undefined
alert(b); //这样使用b,则会产生语法错误
Null类型
该类型的值只有一个值,即null。
它是一个空指针对象,是一个对象类型,因此使用typeof检测返回的是object。
一般情况下,需要将变量初始化或者赋值为null,该变量的类型才算是null。
var b = null;
typeof b; //object
var a = 1;
typeof a; //number
a = null; //重新赋值
typeof a; //object
与Undefined类型的区别:
- undefined是从null类型派生出来的,使用
==
做比较总是返回true
Boolean类型
该类型的变量只有两种值:true
和 false
var isA = true;
var isB = false;
需要注意的是:Boolean类型的变量赋值是区分大小写的,即初始化为True
和False
是不合法的定义。
这时候True 和 False 会被作为变量名解析,这样使用会产生语法错误
var isA = True; //错误
var isB = False; //错误
Number类型
定义
通常情况下,Number类型用于表示数字,即整型(整数)和浮点型(带小数点)
实际上,Javascript还可以使用Number类型来表示八进制和十六进制的数值,八进制和十六进制在进行数值运算时会自动转换成十进制数。
八进制数
- 第一位数字必须为0
- 紧跟第一位数字的是0~7
- 如果设置的数值超出了八进制的范围,第一位的0则被忽略,后面的数值自动转换为十进制数
var octalNum1 = 070; //有效的八进制数,对应十进制的56
var octalNum2 = 079; //无效的八进制,解析为79
var octalNum3 = 08; //无效的八进制,解析为8
*需要注意的是:在严格模式下,八进制的数值是不允许的,Javascript引擎会抛出异常
十六进制数
- 必须以0x开头
- 后面紧跟十六进制数值,即0~9、a-z、A-Z
var hexNum1 = 0xA; //十六进制数的10
var hexNum2 = 0x1f; //十六进制数的31
浮点数值
即带小数点的数字,需要包含一个小数点,且小数点后面至少有一位数字
var a = 1.0;
var b = 1.1;
var c = .1;
如果小数点后面没有数字或者只有一个0,则会被解析成整数
var a = 1. //解析成1
var b = 1.0 //解析成1
对于那些较大或者较小的数字,采用科学计数法来表示数字,即e表示法。
var a = 3.14e10; //3.14乘以10的10次方
var a = 2*e-2; //2乘以10的负2次方,即2/100
浮点数进行计算时,由于精度较高(最多17位小数点),因此会产生误差
例如0.1 + 0.2 = 0.3,实际结果是0.30000000000000004,
因此在做比较判断时会得到意想不到的结果
0.1+0.2 === 0.3 //返回false,因为0.3实际的值是0.30000000000000004
数值范围
由于内存的限制,Number类型并不能保存所有的数值,因此定义了最大值和最小值来限制取值的访问
- 最大值,使用
Number.MAX_VALUE
表示,其值为1.7976931348623157e308 - 最小值,使用
Number.MIN_VALUE
表示,其值为5e-234;
如果计算的数值已超出了取值范围,自动转换为Infinity(无穷)类型
- 小于Number.MIN_VALUE,转换为-Infinity,即负无穷
- 大于Number.MAX_VALUE,转换为Infinity,即正无穷
被转换为Infinity类型的数值,是不能进行数值计算的。可以通过isFinite()函数来判断一个数值是否为Infinity类型
var largeNum = Number.MAX_VALUE + Number.MAX_VALUE;
isFinity(largeNum); //true,超出了最大值范围,返回Infinity类型
NaN,非数值
用于表示一个本来返回数值的变量未返回数值(这样就不会返回错误)。
在其他编程语言中,进行数值计算时,除以0都会报错,而Javascript则返回NaN
NaN有两个特点:
- 任何与NaN操作相关的都会返回NaN
- NaN不等于任何的值(包含它自己)
NaN == NaN //false
isNaN()函数可以用于判断一个值是否不能返回一个数值,如果不能返回true,如果可以返回false
isNaN('123abc'); //true,不能转换为数字,所以非数值
isNaN('blue'); //true,不能转换为数字,所以非数值
isNaN('123'); //false,能转换为数字,所以为数值
isNaN(123); //false,能转换为数字,所以为数值
isNaN(true); //false,能转换为数字(false可以转换为0),所以为数值
String类型
定义
string类型是有零个或者多个16位Unicode字符组成的字符序列(即字符串)。
字符串由一对单引号('
)或双引号("
)包含起来
var a = 'ken';
var b = "hello";
需要注意的是,以单引号开头的字符串必须以单引号结束,以双引号开头的字符串必须以双引号结束
以下的写法都是错误的
var a = 'hello";
var b = "hello';
不可变性
Javascript中的字符串是不可变的,需要改变字符串的内容,首先消耗掉原来的字符串,然后在创建一个新的字符串
var a = 'Hello';
a += ' World'; //output:Hello World
操作流程
- 创建一个包含’Hello’的字符串a
- 修改a字符串的内容为’Hello World’,先创建一个对应字符串长度的新字符串(这里是11,包含空格)
- 然后再讲新的内容(即’Hello World’)填充到新的字符串中
- 原来的字符串(即’Hello’)就会被丢弃掉
因此,像这类型的字符串连接在一些旧的浏览器(版本较低的浏览器,如IE6)中执行起来较慢,大部分的浏览器已进行了优化。
转义序列
字符串中的特殊字符,有些特殊字符串,虽然在代码书写中占用2个或两个以上的字符,最终还是被解析成一个字符串,比较常见的有:
字符 | 含义 |
---|---|
\n | 换行 |
\t | 制表符,对应键盘上的tab |
\b | 空格,对应键盘上的空格 |
\r | 回车,对应键盘上的回车 |
\\ | 斜杠 |
\‘ | 单引号,用于单引号字符串中的转义,如:’\‘fasdaf\‘’ |
\“ | 双引号,用于双引号字符串中的转义,如:”\“fasdfasf\“” |
以上的这些字符,在字符串中都被当成一个字符解析,如:
let a = 'Hello\r';
a.length //返回6,\r被当成一个字符解析
Object类型
复合类型,多用于定义一组数据和功能的集合
创建方式
1、使用new关键,创建一个Object空对象,并动态地设置属性和方法
var obj = new Object();
obj.name = 'Lilei';
obj.age = 10;
obj.say = function() {
console.log('Hello');
}
上述的代码中:
- 创建一个名为obj的空对象
- 设置一个名为name的字符串类型的属性,值为’Lilei’
- 设置一个名为age的数值类型的属性,值为10
- 设置一个名为say的方法,在控制台中打印一段文字’Hello’
2、使用一对花括号( {
和 }
),将属性和功能包含起来,采用这个方式修改上述代码
var obj = {
name:'Lilei',
age:10,
say:function() {
console.log('Hello');
}
};
这些属性和方法都属于obj对象的成员变量,必须使用英文字符的逗号(,
)隔开,否则Javascript解析报错
关键属性
- hasOwnProperty(propertyName),判断当前对象实例中是否存在某个属性。
- isPrototypeof(object),检查传入的对象是否是另外一个对象的原型
- propertyIsEnumerable(propertyName),检查属性是否可以通过(for-in)枚举的方式访问
- toLocaleString(),返回当前地区对应的执行环境下的对象字符串
- toString(),返回对象字符串的表示
- valueOf(),返回对象的字符串、数值、布尔值的返回值
参考资料
《Javascript高级程序设计(第3版)》第三章数据类型