第三章 语言基础(一)

81 阅读4分钟

本章的主要内容:语法、数据类型、流控制语句

一、基本语法

1、ECMAscript中一切都区分大小写

2、标识符的组成:字母、数字、下划线、美元符,其中数字不能作为第一个字符。不能用关键字与保留字作标识符。

3、关键字与保留字:有特殊用途,比如用作声明的let、var,用作流程控制的if、else、return等等。

4、注释:单行// 多行/* */

二、变量与变量的声明

varletconst
声明类型变量变量常量
作用域函数级块级块级
声明提升××
重复声明××

1、什么是声明提升

即把所有变量的声明(不包括赋值)都放到作用域的顶部。由function关键字声明的函数会整体提升。let、const没有提升,声明前的瞬间称为暂时性死区。

2块级作用域

JavaScript根据{}来判断块级作用域,如果省略了{},则JavaScript引擎认为没有块级作用域。

3、全局声明

用var声明的全局变量会成为window对象的属性,let不会。

4、const声明

const声明与赋值必须同时进行。但常量并非完全不能改变,改变内部属性是可以的。

5、循环中的let声明

用var定义的迭代变量会溢出到循环体外:

for (var i = 1; i < 3; i++) { }
console.log(i) //3
​
for (var i = 1; i < 3; i++) {
    setTimeout(() => {
        console.log(i) //3 3
    })
}

使用let之后,循环外无法再访问到迭代变量:

for (let i = 1; i < 3; i++) { }
console.log(i) //ReferenceError: i is not defined
​
for (let i = 1; i < 3; i++) {
    setTimeout(() => {
        console.log(i) //1 2
    })
}

为了更直观的理解,我们可以画两张图,每一个方块代表一次循环:

从下图可以看出,当使用的是var声明时,由于var是函数级作用域,因此执行超时逻辑时,程序会顺着作用域链找到同一个i,而i此时早已变成了3,因此会打印出两个3。而当使用let声明时,JavaScript引擎会为每次循环声明一个新的i,由于let是块级作用域,因此每个i之间都互不关联,所以执行超时逻辑时,会找到各自的i,因此会分别打印出1、2。

image.png

image.png

三、数据类型

JavaScript中一共有7种数据类型:

  • Number
  • String
  • Boolean
  • Null
  • Undefined
  • Symbol
  • Object

但比较让人困惑的是,typeof操作符返回的类型并不能跟以上7种一一对应。typeof操作符一共也可以返回7种类型:

  • number
  • string
  • boolean
  • undefined
  • symbol
  • function
  • object

可以注意到,null不见了,因为它被归到了object里面,因为它可以被看成一个空对象。而原本作为对象的函数被单独分了出来。

下面对每一种类型简单介绍一下:

1、Undefined

此类型只有一个值,就是undefined。由null派生而来。null == undefined

2、Null

此类型也只有一个值,就是null。若知道变量将来要存放对象,则推荐用null来初始化。

3、Number

JS中数值的范围是Number.MIN_VALUE ~ Number.MAX_VALUE。超出这个范围的值以±Infinity表示。

由于内存的原因,JS会想方设法将数字转为整数处理。小数点后至少包含6个0的数值会转为科学计数法。比如:

console.log(10.0) //10
console.log(0.00000003) //3e-8

另外,由于精度原因,最好不要测试某个特定的浮点值:0.1 + 0.2 = 0.30000000000000004。

NaN是一个特殊数值、用于表示本该返回数值但失败了。它的两个特性是:

  • 任何涉及NaN的数值操作始终返回NaN
  • NaN不等于任何值,包括它自己

Number类型涉及到的方法:

方法作用
isFinite()判断值是否有限大
isNaN()判断值是否为NaN

由于转型函数多且复杂,我将它们放在下一篇文章中统一介绍。

4、String

① 字符字面量

一些有特殊用途的字符,比如 ",当不能直接出现在字符串中时,则需要用它们的字面量来表示。

\ n \ ' \ " \ \

当他们出现在字符串中,只算作一个字符。

② 模板字符串

可换行,可插值,${}中可以是任何表达式。

5、Boolean

只有两个值: true和false。

6、Object

每个object实例都有以下属性或方法:

方法作用
constructor
hasOwnProperty()判断对象本身上是否有某个属性
isPrototypeOf()判断对象是不是另一个对象的原型
propertyIsEnumerable()判断某个属性能否被for-in枚举
toString()返回对象的字符串表示
valueOf()返回对象的字符串、数值、布尔值表示