JS 的类型和变量
变量
声明一个变量
变量在使用前需要声明,使用关键字var
或者let
就可以声明一个变量。例如:
let value = 0;
这句就声明了一个叫value的变量,并给这个一个变量赋值为0;当然也可以不赋初值,直接let value;
也是可以的。在声明之后,就可以使用这个变量了。
注意,如果要使用
let
的话,必须使用 node 而不是浏览器的控制台,并且不能重复声明。
var 和 let 的区别
var 和 let 这俩关键字都可以用来声明变量,但是 var 声明的变量是会无视作用域的。举个例子,新建一个叫 test.js 的文件,输入以下代码,然后在控制台里输入node test
"use strict"
// 在一个代码块中声明变量
{
var varValue = 123;
let letValue = 123;
}
// 打印两个变量的类型
console.log(typeof varValue); // 输出 number
console.log(typeof letValue); // 输出 undefined
JS 是弱类型语言
弱类型就是说,变量的类型在声明时是不需要显示指明的,并且可以在之后运行的时候随时改变变量的类型。
举个C++的例子:
int value = 0;
value = "hello world";
第一句里定义了一个int
类型的变量 value ,第二句给这个变量赋一个字符串,这时编译就通不过了。
但是在 JS 中,你完全可以这么写:
let value = 0; // 这时value的类型为
value = 'hello world';
value = 1.3;
相比强类型的语言,JS 就自由和方便了许多,但同时也带来了一些坑,需要在使用的时候注意。
常量
使用关键字 const
可以声明一个不能改变的常量,声明时应该给它应该初值:const value = 1;
。
类型
虽然说 JS 是弱类型,但实际上变量还是有类型区分的。使用typeof [变量名]
就知道得到一个变量的类型。例如
let value = 123;
typeof value; // 输出"number"
常用的类型有这么几种:
- undefined
- boolean
- number
- function
- object
- array
- string
- null
接下来就慢慢讲他们的区别。
undefined
undefined
类型的意思,就是字面意思:未定义。
当一个变量没有声明就使用,或者声明的时候没有赋值的话,这个变量就是个 undefined 类型的。
typeof value // 输出"undefine"
let value;
typeof value; // 输出"undefined"
boolean
这个类型的值就是一个 true 和一个 false。好像没什么能说的。
使用 !
运算符,就可以取相反结果。
!true === false; // true
number
JS 的数字是浮点数,意思就是能用整数能用小数,同时还能用科学记数法:
var i = 0; // 0
i = 1.23; // 1.23
i = 1e2; // 100 (1 * 10^2)
i = 2e-1 // 0.2 (2 * 10^-1)
注意:e后面的只能是整数
NaN
是一个特殊的数字值,用来表示这个值不是数字。
Infinity
也是一个特殊值,可以用来当作无穷大。
数字有一些特殊的运算符,例如++
和 --
,还有 +=
-=
*=
/=
%=
这些乱七八糟的。
function
函数也是一种类型,在之后讲函数的部分会解释。
object
JS 中是有类的,每个类都是一个object
类型的。包括数组、字符串等,实际上都是一个object类型。object 可以有自己的内部变量,自己的函数等等。
数组
声明一个数组很简单:
let arr = [];
let arrObj = new Array();
arr 和 arrObj 是一样的,都是一个空数组,通常我们都会使用第一种写法(因为简单),但是第二种方法可以让你知道为什么数组会是一个object——它是Array类的一个实例。
数组里可以放任何类型的数据,不需要每个元素都有相同的类型。使用下标可以访问数组中的内容,数组的下标也是从0开始计数,但你可以手动给任意下标的元素赋值:
let arr = [1, '123', true];
arr[4] = 'abc';
console.log(arr); // 输出 [ 1, '123', true, , 'abc']
数组提供了一些方法,例如使用 arr.length
就能获取 arr 的长度,使用 arr.pop()
就能将最后一个元素从 arr 中删除。
字符串
在大部分语言中字符串都是特殊的数组,和数组十分类似。包括单个的字符都是一个string。使用单引号和双引号没区别。不过注意,这两种方式声明的字符串类型是不一样的。
let str = '123'; // 类型是 string
let strObj = new String('123'); // 类型是 object
数组能使用的函数,字符串通用可以使用,还可以使用 +
和 +=
之类的运算符来实现字符串的拼接。
null
null 就是空的意思。当你想把一个对象弄死,就可以把这个对象赋值为null。