JavaScript语法学习日记(二)
今天的学习内容包括原始值和引用值的异同,上下文,作用域,变量的声明方式和两种基本引用类型(日期Date和原始值包装类型)。这涉及到红宝书的第四章和第五章的1,3两节。正则表达式类型和单例内置对象放在明天学习
作用域和内存
原始值和引用值
简单的数据结构,如数值、布尔值和字符串就是原始值;比较复杂的对象就是引用值。引用值具有动态属性,可以在初始化之后添加属性;原始值则不可以添加属性(添加属性被视为声明了一个新变量)。
- 原始值的包装类型:对简单数据类型来说,如果用类型的“构造函数”
new一个出来,typeof类型检测仍然为该数据的简单类型(并非object)。具有引用类型的特点。
原始值和引用值的区别:
- 存储空间:原始值大小固定,保存在栈空间;引用值是对象,存储在堆空间。
- 拷贝方式:原始值的拷贝是创建一个副本;引用值的拷贝是复制一个指针
上下文和作用域链
上下文包括一个变量对象,包含了上下文中所有的函数和数据。
变量的执行上下文用于确定什么时候释放内存。
作用域链:决定 了各级上下文中的代码在访问变量和函数时的顺序。代码正在执行的上下文的变量对象始终位于作用域 链的最前端。如果上下文是函数,则其活动对象(activation object)用作变量对象。当前上下文的变量对象位于链的首端,全局上下文总是位于末端
- 上下文之间的连接是线性的、有序的。每个上下文都可以 到上一级上下文中去搜索变量和函数,但任何上下文都不能到下一级上下文中去搜索,比如全局上下文的函数就不能查找使用函数上下文中的数据。
- 一般情况下有两层上下文,全局上下文和函数上下文。如果有
try/catch语句或with语句,会在作用域链首端临时添加一个上下文
作用域链涉及一个标识符查找。全局变量位于全局上下文,在作用域链的末端;局部变量函数上下文,在作用域链的前部:所以局部变量的查找速度要优于全局变量
变量的作用域声明
-
var的函数作用域声明:在使用var声明变量时,变量会被自动添加到最接近的上下文。在函数中,最接近的上下文就是函数的局部上下文。
var声明的重要特性为提升,通俗来说就是可以先使用后声明。
-
let的块作用域声明:一个块作用域用花括号
{}来表示,let声明的变量只在这个块中有效,代码执行流经过这个块后变量就会销毁(类似局部变量)。因此,let声明适合声明循环迭代的变量,var声明的变量因为会导致变量溢出而应当被避免。
-
const常量声明:使用const 声明的变量必须同时初始化为某个值。 一经声明,在其生命周期的任何时候都不能再重新赋予新值。
基本引用类型
与Java等面向对象语言不同的是,JavaScript没有类和接口,而是用引用类型描述一个结构的属性和功能。
引用值是引用类型的实例。虽然引用类型不是类,但是引用值是对象。创建引用值的方法与面向对象语言相同,new一个引用类型的构造函数。
Date日期类型
初始化方式:有两种初始化方法,一种是不传参数,另一种是传参数。注意要创建别的日期对象,必须传入日期时间的毫秒表示。
-
不传参数:默认保存当前的日期和时间
-
传参数:使用两个辅助方法
Date.parse()和Date.UTC()-
Date.parse()支持将以下格式的字符串转换为表示该日期的毫秒数。不符合以下格式就会返回一个NaN。这个方法不需要显式调用,如果直接把表示日期的字 符串传给Date构造函数,那么Date会在后台调用Date.parse()。-
“月/日/年”,如"5/23/2019";
-
“月名 日, 年”,如"May 23, 2019";
-
“周几 月名 日 年 时:分:秒 时区”,如"Tue May 23 2019 00:00:00 GMT-0700";
-
ISO 8601扩展格式
YYYY-MM-DDTHH:mm:ss.sssZ,如 2019-05-23T00:00:00(只适用于 兼容ES5的实现)。
-
-
Date.UTC():传给Date.UTC()的参数是年、零起点月数(1月是0,2月是1,以此类推)、日(131)、时(023)、 分、秒和毫秒。这些参数中,只有前两个(年和月)是必需的。如果不提供日,那么默认为1日。其他 参数的默认值都是0。
-
该引用类型的方法:
- 返回当前时间:
Date.now() - 重写object中的方法
- 日期格式化
- 组件方法,设置或者取得日期的特定部分
原始值包装类型
原始值包装类型包含String,Boolean,Number三种类型
每当用到某个原始值的方法或属性时,后台都会创建一个相应原始包装类型的对象,从而暴露出操作原始值的各种方法。可以把这个过程考虑为先用包装类型创建了一个对象,然后再执行相应的方法。
与其他引用类型不同点在于生命周期。在通过new实例化引用类型后,得到 的实例会在离开作用域时被销毁,而自动创建的原始值包装对象则只存在于访问它的那行代码执行期间。这意味着不能在运行时给原始值添加属性和方法。
 202543&spm=1001.2101.3001.5002&articleId=146976600&d=1&t=3&u=d643388e047941f7a547d35ffb5b7586)
642

被折叠的 条评论
为什么被折叠?



