Web/04-JavaScript基础/03-变量的数据类型.md
2019-12-11 19:59:12 +08:00

466 lines
9.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 变量的数据类型
### 为什么需要数据类型
在计算机中,不同的数据所需占用的存储空间不同,为了充分利用存储空间,于是定义了不同的数据类型。而且,不同的数据类型,寓意也不同。
我们都知道,无论这个变量是字符串类型,还是数字类型,我们都可以直接用 `var` 去定义它。比如:
```javascript
var a = 'hello word';
var b = 123;
```
为什么可以这样做呢这是因为JavaScript 是一种「弱类型语言」,或者说是一种「动态语言」,这意味着不需要提前声明变量的类型,在程序运行过程中,类型会自动被确定。
**JS 的变量数据类型,是在程序运行的过程中,根据等号右边的值来确定的**。而且,变量的数据类型是可以变化的。比如说:
```javascript
var name = 'qianguyihao';
name = 123; // 强制将变量 name 修改为 数字类型
```
### JS中一共有六种数据类型
- **基本数据类型(值类型)**String 字符串、Number 数值、Boolean 布尔值、Null 空值、Undefined 未定义。
- **引用数据类型(引用类型)**Object 对象。
注意内置对象function、Array、Date、RegExp、Error等都是属于Object类型。也就是说除了那五种基本数据类型之外其他的都称之为 Object类型。
> 面试问:引用数据类型有几种?
> 面试答:只有一种,即 Object 类型。
**数据类型之间最大的区别**
- 基本数据类型:参数赋值的时候,传数值。
- 引用数据类型:参数赋值的时候,传地址(修改的同一片内存空间)。
今天这篇文章,我们详细讲一下基本数据类型。
## String 字符串
来看个示例。现有如下代码:
```javascript
var a = "abcde";
var b = "生命壹号";
var c = "123123";
var d = "哈哈哈哈哈";
var e = ""; //空字符串
console.log(typeof a);
console.log(typeof b);
console.log(typeof c);
console.log(typeof d);
console.log(typeof e);
```
控制台输出如下:
```
string
string
string
string
string
```
注意事项:
1在JS中字符串需要使用引号引起来。使用双引号或单引号都可以但是不要混着用。比如下面这样写是不可以的
```javascript
var str = 'hello";
```
2引号不能嵌套双引号里不能再放双引号单引号里不能再放单引号。但是单引号里可以嵌套双引号。
3**转义字符**:在字符串中我们可以使用`\`作为转义字符,当表示一些特殊符号时可以使用`\`进行转义。
- `\"` 表示 `"`
- `\'` 表示 `'`
- `\n` 表示换行
- `\r` 表示回车
- `\t` 表示制表符
- `\b` 表示空格
- `\\` 表示`\`
举例:
```javascript
var str1 = "我说:\"今天\t天气真不错\"";
var str2 = "\\\\\\";
console.log(str1);
console.log(str2);
```
上方代码的打印结果:
```
我说:"今天 天气真不错!"
\\\
```
将其他数值转换为字符串有三种方式:
- 拼串
- toString()
- String()
### 补充知识typeof 运算符
`typeof()`表示“**获取变量的类型**”,返回的是小写,语法为:
```
typeof 变量
```
**返回结果**
- `typeof 数值`的返回结果number
- `typeof 字符串`的返回结果string
- `typeof 布尔型`的返回结果boolean
- `typeof undefined`的返回结果undefined
- `typeof null`的返回结果object
在JavaScript中只要是数就是 number 数值型的。无论整浮、浮点数(即小数)、无论大小、无论正负,都是 number 类型的。
## 数值型Number
在JS中所有的数值都是Number类型包括整数和浮点数小数
```javascript
var a = 100; //定义了一个变量a并且赋值100
console.log(typeof a); //输出a变量的类型
```
上方代码的输出结果为:
```
number
```
**数值范围:**
由于内存的限制ECMAScript 并不能保存世界上所有的数值。
- 最大值:`Number.MAX_VALUE`,这个值为: 1.7976931348623157e+308
- 最小值:`Number.MIN_VALUE`,这个值为: 5e-324
如果使用Number表示的变量超过了最大值则会返回Infinity。
- 无穷大正无穷Infinity
- 无穷小(负无穷):-Infinity
注意:`typeof Infinity`的返回结果是number。
**NaN和isNaN()函数:**
1NaN是一个特殊的数字表示Not a Number非数值。比如
```javascript
console.log("abc" / 18); //结果是NaN
console.log("abc" * "abcd"); //按理说字符串相乘是没有结果的但如果你非要让JS去算它就一定会给你一个结果。结果是NaN
```
注意:`typeof NaN`的返回结果是number。
Undefined和任何数值计算的结果为NaN。NaN 与任何值都不相等,包括 NaN 本身。
2isNaN() :任何不能被转换为数值的值,都会让这个函数返回 true。
```javascript
isNaN(NaN);// true
isNaN("blue"); // true
isNaN(123); // false
```
**浮点数的运算**
在JS中整数的运算**基本**可以保证精确;但是**小数的运算,可能会得到一个不精确的结果**。所以千万不要使用JS进行对精确度要求比较高的运算。
如下:
```javascript
var a = 0.1 + 0.2;
console.log(a); //打印结果0.30000000000000004
```
上方代码中打印结果并不是0.3而是0.30000000000000004。
我们知道所有的运算都要转换成二进制去计算然而二进制是无法精确表示1/10的。因此存在小数的计算不精确的问题。
### 连字符和加号的区别
键盘上的`+`可能是连字符,也可能是数字的加号。如下:
```
console.log("我" + "爱" + "你"); //连字符,把三个独立的汉字,连接在一起了
console.log("我+爱+你"); //原样输出
console.log(1+2+3); //输出6
```
输出:
```
我爱你
我+爱+你
6
```
**总结**:如果加号两边**都是**数值,此时是加。否则,就是连字符(用来连接字符串)。
举例1
```javascript
var a = "1";
var b = 2;
console.log(a + b);
```
控制台输出:
```
12
```
举例2
```
var a = 1;
var b = 2;
console.log("a" + b); //"a"就不是变量了!所以就是"a"+2 输出a2
```
控制台输出:
```
a2
```
于是我们明白了,在变量中加入字符串进行拼接,可以被同化为字符串。【重要】
### 隐式转换
我们知道,`"2"+1`得到的结果其实是字符串,但是`"2"-1`得到的结果却是数值1这是因为计算机自动帮我们进行了“**隐式转换**”。
也就是说,`-`、`*`、`/`、`%``这几个符号会自动进行隐式转换。例如:
```javascript
var a = "4" + 3 - 6;
console.log(a);
```
输出结果:
```javascript
37
```
虽然程序可以对`-`、`*`、`/`、`%``这几个符号自动进行“隐式转换”;但作为程序员,我们最好自己完成转换,方便程序的可读性。
## 布尔值Boolean
true 和 false。主要用来做逻辑判断。
布尔值直接使用就可以了,千万不要加上引号。
代码:
```javascript
var a = true;
console.log(typeof a);
```
控制台输出结果:
```
boolean
```
## null和undefined
### `null`:空值
专门用来表示一个为空的**对象**(例如:`var a = null`)。注意,专门用来表示**空对象**。
- Null类型的值只有一个就是null。比如`var a = null`。
- 使用 typeof 检查一个null值时会返回object。
### `undefined`:未定义
**声明**了一个变量,但是没有**赋值**(例如:`var a;`此时它的值就是undefined。
- Undefined类型的值只有一个就是undefind
- 使用 type of 检查一个undefined时会返回undefined。
null和undefined有最大的相似性。看看null == undefined的结果(true)也就更加能说明这点。
但是null === undefined的结果(false)。它们虽然相似但还是有区别的其中一个区别是和数字运算时10 + null结果为1010 + undefined结果为NaN。
- 任何数据类型和undefined运算都是NaN;
- 任何值和null运算null可看做0运算。
## 变量值的传递(赋值)
语句:
```
a = b;
```
把b的值赋给ab不变。
将等号右边的值,赋给左边的变量;等号右边的变量,值不变。
来做几个题目。
举例1
```
//a b c
var a = 1; //1
var b = 2; //1 2
var c = 3; //1 2 3
a = b + c; //5 2 3
b = c - a; //5 -2 3
c = a * b; //5 -2 -10
console.log(a);
console.log(b);
console.log(c);
```
输出:
```
5
-2
-10
```
举例2
```
//a b c
var a = 1;
var b = 2;
var c = 3; //1 2 3
a = a + b; //3 2 3
b = b + a; //3 5 3
c = c + b; //3 5 8
console.log(a); //3
console.log(b); //5
console.log(c); //8
```
输出:
```
3
5
8
```
举例3
```
//a b
var a = "1";
var b = 2; //"1" 2
a = a + b; //"12" 2
b = b + a; //"12" "212"
console.log(a); //输出12
console.log(b); //输出212
```
输出:
```
12
212
```
举例4
```
//a b
var a = "1";
var b = 2;
a = b + a; //"21" 2
b = b + a; //"21" "221"
console.log(a); //21
console.log(b) //221
```
效果:
```
21
221
```
举例5这个例子比较特殊字符串减去数字
```
var a = "3";
var b = 2;
console.log(a-b);
```
效果:(注意,字符串 - 数值 = 数值)
```
1
```
## 我的公众号
想学习**代码之外的技能**?不妨关注我的微信公众号:**千古壹号**id`qianguyihao`)。
扫一扫,你将发现另一个全新的世界,而这将是一场美丽的意外:
![](http://img.smyhvae.com/20200101.png)