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。