JavaScript里面的数据类型、变量
数据类型
JavaScript里面,公有五个基本数据类型:
- 数值类型:包含正数和浮点数
- 布尔类型:只含有true和false
- 字符串类型:字符串变量和其他高级语言一样,必须用引号括起来,但是这里可以上双引号,也可以是单引号
- undefined类型:专门用来确定一个已经创建但是没有初值的变量
- null类型:用于表明某一个变量的值为空
数值类型
不仅包括整形类型,也包括所有的浮点型类型,且数值都是以IEEE754双精度浮点数格式保存
数值类型也支持科学计数法表示
<script type="text/javascript">
// 显式声明变量a , b
var a , b;
// 给a , b使用科学记数法赋值,其值应该为500
a = 5E2;
b = 1.23e-3;
// 使用警告提示框输出变量a的值
alert(a + "\n" + b);
</script>
执行结果:
数值变量不要以0开头,js不仅支持十进制,也支持其他的比如十六进制,八进制,而,八进制又是以 0 开头,十六进制以0x或者0X开头
当数值类型超出范围时,将出现两个特殊值:Infinity和-Infinity,分别代表正无穷和负无穷,且,正负无穷和任意数做运算,都还是正负无穷。但是特殊的Infinity 与-Infinity做算术运算时,结果将等于NaN(Not a Number)
字符串类型
字符串类型必须用引号,可以是双引号,也可以是单引号
var a = 'a'; //这里a是字符串类型,而不是字符类型(JavaScript没有字符类型)
JavaScript与java不同,JavaScript里面的字符串比较不需要equals方法,用“==”就可以比较两个字符串是否相等
下面是一些常用的对字符串操作的方法或属性
方法 | 作用 |
String() | 类似于面对对象语言中的构造器,可以构造一个字符串 |
charAt() | 或许字符串特定索引处的字符 |
length | 返回字符串的长度,且中文算一个字符 |
indexOf() | 返回字符串中特定字符串第一次出现的索引 |
substring() | 返回字符串的某一个子串 |
布尔类型
只有true 和false两个值,通常用于逻辑运算
undefined 和 null
undefined只有一个值undefined,表示某个变量不存在,或者说没有初始化,null 用于表示某一个变量为空,即undefined表示某一个值只是定义了,但是没有初始化,而null 代表某一个值定义了且初始化了,只是初始化的值为null,undefined就相当于高级语言里面的null,而null就相当于高级语言里面,给某一个一个变量一个值了,就拿Java里面String来说:
String a = null ;
String b = "";
undefined在值上的差别就相当于a 和 b 的差别,一个是没有初始化,一个是初始化了,只是生命都没给
上面都只是二则的值上的差别,在类型上,我们可以使用精确等于符(===)比较
<script type="text/javascript">
// 声明变量x , y
var x , y = null;
// 判断x的值是否为空
if (x === undefined)
{
alert('声明变量后默认值为undefined');
}
if (x === null)
{
alert('声明变量后默认值为null');
}
// 判断x(其值为undefined)是否与y(其值为null)相等
if (x == y)
{
alert("x(undefined)==y(null)");
}
// 测试一个并不存在的属性
if(String.xyz === undefined)
{
alert("不存在的属性值默认为undefined");
}
</script>
执行结果:
结论:
当要比较undefined与null两个类型的值是否相同时,一定要使用精确等于符“===”
变量
作为弱类型语言的JavaScript,有两种变量定义方式:
- 隐式定义:直接给变量赋值
- 显示定义:使用 var 关键字定义变量
JavaScript是弱类型语言,变量没有固定的数据类型,所以可以在不同的时候给变量赋不同的值,类型根据值的类型而定
<script type = "text/javascript">
var a; //显示声明变量a,此时可以没有初始值
a = true; //给变量a赋值,由于赋值为true 所以a是布尔类型
a = 1; //此时变量的类型是数值类型
alert(a); //使用过警告框输出a
</script>
JavaScript与html的不同:JavaScript中变量的定义区分大小写,因此变量a与变量A是不同的两个变量
也可以一次性过定义多个变量
var a, b, c; //一次性定义了三个变量a,b,c
var a, b = 1, c = 2; //一次性定义了三个变量a,b,c;且给b赋值1,给c赋值2
类型转换
JavaScript支持类型的制动转换
<script type = "text/javascript">
var a = "3.145"; //定义字符串变量
var b= a - 2; //让字符串变量和数值变量执行加法运算
var c = a + 2;
alert(b + "\n" + c);
</script>
结果:
由结果可以总结出:
- 对于减法运算符:因为字符串不支持减法运算,所以系统自动将字符串转换为数值,然后做减法运算
- 对于加法运算符:因为字符串支持加法运算,系统将自动将数值类型转换为字符串类型,然后将两个字符串连接
各种类型自动相互转换表如下:
值 | 目标类型 | |||
字符串类型 | 数值型 | 布尔型 | 对象 | |
undefine | "undefine" | NaN | false | Error |
null | "null" | 0 | false | Error |
字符串 | 当前值 | 数值或NaN | true | String对象 |
空字符串 | 当前值 | 0 | false | String对象 |
0 | "0" | 0 | false | Number对象 |
NaN | "NaN" | NaN | false | Number对象 |
Infinity | "Infinity" | Infinity | true | Number对象 |
-Infinity | "-Infinity" | Infinity | true | Number对象 |
数值 | 数值字符串 | 当前值 | true | Number对象 |
true | "true" | 1 | true | Boolean对象 |
false | "false" | 0 | false | Boolean对象 |
对象 | toString()的返回值 | valueOf(),toString()或NaN | true | 当前值 |
这些自动转换可读性差,所以我们还可以使用强制类型转换:
- toString():将布尔类型、数值等转换为字符串类型
- parseFloat():将字符串、布尔值等转化为浮点数
- parseInt():将字符串、布尔值等转化为整数
变量作用域
- 全局变量:在全局范围(不在函数内)定义的变量(不管使用var)、不适用var定义的变量都是全局变量
- 局部变量:在函数里定义的变量称为局部变量
变量提升
变量提升:变量声明总是会被解释器“提升”到函数体的顶部
let变量与const变量
let:
var变量定义可能存在的缺点:
- var定义的变量没有快作用域
- var定义的全局变量会自动添加到全局window对象的属性
- var定义的变量会提前装载
<script type="text/javascript">
for (let i = 0; i < 10 ; i++)
{
console.log(i);
}
// 报错:Uncaught ReferenceError: i is not defined
console.log("循环之外:" + i);
</script>
我们可以看到在for之外,let变量就不能在使用了,这个作用域,就相当于高级语言的局部变量的意思
const:
该关键字用于定义常量,且该常量只能在定义时指定初始值(且必须指定初始值,且之后不允许改变