JavaScript高级程序设计第四版学习--第三章--第一部分


title: JavaScript高级程序设计第四版学习–第三章–第一部分
date: 2021-5-15 16:21:04
author: Xilong88
tags: JavaScript

本章内容
本章内容
语法
数据类型
流控制语句
理解函数
这一章的内容非常多,同时也非常重要,涉及很多基础内容,仔细学习,理解,吃透
可能出现的面试题:
1.给出一些标识符,看看是否符合语法(要注意关键字和保留字)
2.谈一谈严格模式
3.谈谈var,let,const
4.谈谈 “暂时性死区”
5.var,let,const作用域的题,如异步循环

第一部分语法:

1.ECMAscript区分大小写,无论是变量,函数,还是操作符,都区分大小写.

2.标识符就是变量,函数,属性,参数的名称,开头必须字母或者_或者 ; 其 他 地 方 只 能 字 母 , , ;其他地方只能字母,_, ;,,或者数字.

3.字母可以是ASCII中的,也开始Unicode中的,如À和Æ(但不推荐使用.

4.ECMAScript标识符使用驼峰大小写形式,即第一个单词的首字母小写,后面每个单词的首字母大写.
5.//单行注释,/* 多行注释*/

6.严格模式,是一种不同的代码执行模式,涉及很多方面,但总体都是为了减少出错.使用方法是在要用严格模式的块的头部加上"use strict",这样语法会有更多限制如:

不允许使用未声明的变量
不允许删除变量或对象
不允许删除函数
不允许变量重名
不允许使用八进制
不允许使用转义字符
不允许对只读属性赋值
不允许对一个使用getter方法读取的属性进行赋值
不允许删除一个不允许删除的属性
变量名不能使用 “eval” 字符串
变量名不能使用 “arguments” 字符串
不允许使用with操作符
由于一些安全原因,在作用域 eval() 创建的变量不能被调用
禁止this关键字指向全局对象 ,因此,使用构造函数时,如果忘了加new,this不再指向全局对象,而是报错

保留关键字
为了向将来Javascript的新版本过渡,严格模式新增了一些保留关键字:

implements
interface
let
package
private
protected
public
static
yield

以上关于严格模式的内容大概留意一下就行了,不用完全背下来.

7.语句以;结尾,不加不一定报错,但是为了代码压缩以及性能(解释器不用判断哪里需要加分号),一个语句块放在{…}里面,这也算小性能优化吧.

8.关键字,保留字,不能用来做标识符,ES6中如下:

break       do          in            typeof
case        else        instanceof    var
catch       export      new           void
class       extends     return        while
const       finally     super         with
continue    for         switch        yield
debugger    function    this
default     if          throw
delete      import      try

始终保留:
enum
严格模式下保留:
implements  package     public
interface   protected   static
let         private
模块代码中保留:
await

留意一下,以免报错.

9.ECMAScript变量是松散类型的,意思是变量可以用于保存任何类型的
数据。每个变量只不过是一个用于保存任意值的命名占位符。有3个关
键字可以声明变量:var 、const 和let 。

10.为了规范,尽量不要同一个变量存不同类型字面量.

11.,使用var 在一个函数内部定义一个变量就意味着该变量将在函数退出时被销毁,

function test() {
  var message = "hi"; // 局部变量
}
test();
console.log(message); // 出错!

不过,在函数内定义
变量时省略var 操作符,可以创建一个全局变量

function test() {
  message = "hi";     // 全局变量
}
test();
console.log(message); // "hi"

12.规范:虽然可以通过省略var 操作符定义全局变量,但不推荐
这么做。在局部作用域中定义的全局变量很难维护,也会造成
困惑。这是因为不能一下子断定省略var 是不是有意而为之。
在严格模式下,如果像这样给未声明的变量赋值,则会导致抛
出ReferenceError 。

13.如果需要定义多个变量,可以在一条语句中用逗号分隔每个变量
(及可选的初始化):

var message = "hi",
    found = false,
    age = 29;

14.声明提升,hoist,使用var关键字声明
的变量会自动提升到函数作用域顶部:

function foo() {
  console.log(age);
  var age = 26;
}
foo();  // undefined

反复多次使用var 声明同一个变量也没有问
题:

function foo() {
  var age = 16;
  var age = 26;
  var age = 36;
  console.log(age);
}
foo();  // 36

15.let 声明的范围是块作用域,而var 声明的范围是函数作用域。

if (true) {
  var name = 'Matt';

  console.log(name); // Matt
}
console.log(name);   // Matt
if (true) {
  let age = 26;
  console.log(age);   // 26
}
console.log(age);     // ReferenceError: age没有定义

let在{}之外,就销毁了
块作用域是函数作用域的子集,因此适用于var 的作
用域限制同样也适用于let 。

16.let不能重复声明在同一个块内,会报错.和var重名也是重复.

{
			let a = 0;
			{
				let a = 1;//不会报错
			}
			let a = 2;//会报错
		}

就算有嵌套,只要不是同一块,就可以同名.

17.在解析代码时,JavaScript引擎也会注意出现在块后面的let 声明,
只不过在此之前不能以任何方式来引用未声明的变量。
在let 声明
之前的执行瞬间被称为**“暂时性死区”**(temporal dead zone),在此
阶段引用任何后面才声明的变量都会抛出ReferenceError 。

18.使用let 在全局作用域中声明的变量不会成
为window 对象的属性(var 声明的变量则会)。

var name = 'Matt';
console.log(window.name); // 'Matt'
let age = 26;
console.log(window.age);  // undefined

let 声明仍然是在全局作用域中发生的,相应变量会在页面
的生命周期内存续。因此,为了避免SyntaxError ,必须确保页
面不会重复声明同一个变量。

19.不能使用let 进行条件式声明是件好事,因为条件声明是一种反模式,它让程序变得更难理解。也就是说,不要用if xxx let xxx这种形式,因为这是无效的:

<script>
  let name = 'Nicholas';
  let age = 36;
</script>
<script>
  // 假设脚本不确定页面中是否已经声明了同名变量
  // 那它可以假设还没有声明过
  if (typeof name === 'undefined') {

    let name;
  }
  // name被限制在if {} 块的作用域内
  // 因此这个赋值形同全局赋值
  name = 'Matt';
  try (age) {
    // 如果age没有声明过,则会报错
  }
  catch(error) {
    let age;
  }
  // age被限制在catch {}块的作用域内
  // 因此这个赋值形同全局赋值
  age = 26;
</script>

20.let在每次迭代声明一个独立变量实例的行为适用于所有风格的for循环,包括for-in 和for-of 循环.异步迭代如:

for (let i = 0; i < 5; ++i) {
    setTimeout(() => console.log(i), 0)
}
// 会输出0、1、2、3、4

注意写法,没在()里重新声明是不行的

let i = 0;
		for (i = 0; i < 5; ++i) {
			setTimeout(() => console.log(i), 0)
		}
		// 会输出5、5、5、5、5

21.const 的行为与let 基本相同,唯一一个重要的区别是用它声明变量时
必须同时初始化变量,且尝试修改const 声明的变量会导致运行时错
误。
const age = 26;
age = 36; // TypeError: 给常量赋值
// const也不允许重复声明

const name = 'Matt';
const name = 'Nicholas'; // SyntaxError
// const声明的作用域也是块
const name = 'Matt';
if (true) {
  const name = 'Nicholas';
}
console.log(name); // Matt

const 声明的限制只适用于它指向的变量的引用。换句话说,如果
const 变量引用的是一个对象,那么修改这个对象内部的属性并不违反
const 的限制。

const person = {};
person.name = 'Matt';  // ok

但是不能用const 来声明迭代变量
(因为迭代变量会自增):

for (const i = 0; i < 10; ++i) {} 
// TypeError:给常量赋值

如果你只想用const 声明一个不会被修改的for 循环变量,那也
是可以的。也就是说,每次迭代只是创建一个新变量。这对for-of 和
for-in 循环特别有意义:

let i = 0;
for (const j = 7; i < 5; ++i) {
  console.log(j);
}
// 7, 7, 7, 7, 7
for (const key in {a: 1, b: 2}) {
  console.log(key);
}
// a, b
for (const value of [1,2,3,4,5]) {

  console.log(value);
}
// 1, 2, 3, 4, 5

迭代器详情看第七章.

22.ECMAScript 6增加let 和const 从客观上为这门语言更精确地声明作用
域和语义提供了更好的支持。好的风格就是,不使用var,多使用const,let次之,可以提升代码质量.

这是第三章第一部分的内容,第三章有点多,划分成多个部分.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值