如果不涉及浏览器,ECMA-262定义了语言的基础部分 a. 语法 b. 类型 c. 语句 d. 关键字 e. 保留字 f. 操作符 g. 全局对象
第二个
<script>
元素的代码必须在第一个<script>
元素的代码解释完毕才能开始解释,第三个则必须等第二个解释完,以此类推。页面在浏览器解析到
<body>
的起始标签时开始渲染。也可以单独指定一个函数在严格模式下执行,只要把这个预处理指令放到函数体开头即可。
使用 var 操作符定义的变量会成为包含它的函数的局部变量。
在函数内定义变量时省略 var 操作符,可以创建一个全局变量。
let 声明的范围是块作用域,而 var 声明的范围是函数作用域。
块作用域是函数作用域的子集,因此适用于 var 的作用域限制同样也适用于 let。
与 var 关键字不同,使用 let 在全局作用域中声明的变量不会成为
window
对象的属性( var 声 明的变量则会)。const 的行为与 let 基本相同,唯一一个重要的区别是用它声明变量时必须同时初始化变量,且 尝试修改 const 声明的变量会导致运行时错误。
const 声明的作用域也是块。
typeOf 返回值为object,表示值为对象(而不是函数)或null。
Undefined 类型只有一个值,就是特殊值 undefined。
无论是声明还是未声明, typeof 返回的都是字符串"undefined"。
逻辑上讲, null 值表示一个空对象指针。
任何时候,只要变量要保存对象,而当时又没有那个对象可保存,就要用 null 来填充该变量。这样就可以保持 null 是空对象指针的语义,并进一步将其与 undefined 区分开来。
任何涉及NaN的操作始终返回NaN,NaN不等于包括NaN在内的任何值。
有 3 个函数可以将非数值转换为数值: Number()、 parseInt()和 parseFloat()。
Number(null) => 0; Number('') => 0; Number(true) => 0
如果第一个字符不是数值字符、加号或减号, parseInt()立即返回 NaN。这意味着空字符串也会返回 NaN(这一点跟 Number()不一样,它返回 0)。
Symbol.for()对每个字符串键都执行幂等操作。
symbol一节从第五小节开始跳过了。
ECMAScript 中的对象其实就是一组数据和功能的集合。
每个Object实例都有如下属性和方法 a. constructor,用于创建当前对象的参数 b. hasOwnProperty,用于判断当前对象实例上是否存在给定的属性。 c. isPrototypeOf,用于判断当前对象是否为另一个对象的原型。 d. propertyIsEnumerable,用于判断给定的属性是否可以使用for-in语句枚举。与hasOwnProperty一样,属性名必须是字符串。 e. toLocalString,返回对象的字符串表示 f. toString,返回对象的字符串表示 g. valueOf,返回对象对应的字符串、数值或布尔值表示。
无论使用前缀递增还是前缀递减操作符,变量的值 都会在语句被求值之前改变。
按位非~的最终效果是对数值取反并减 1。
本质上,按位与&就是将两个数的每一个位对齐, 然后基于真值表中的规则,对每一位执行相应的与操作。
按位与操作在两个位都是 1 时返回 1,在任何一位是 0 时返回 0。
按位或 | 操作在至少一位是 1 时返回 1,两位都是 0 时返回 0。
按位异或 ^ 与按位或的区别是,它只在一位上是 1 的时候返回 1(两位都是 1 或 0,则返回 0)。
左移操作符用两个小于号( <<)表示,会按照指定的位数将数值的所有位向左移动。
有符号右移由两个大于号( >>)表示,会将数值的所有 32 位都向右移,同时保留符号(正或负)。
无符号右移用 3 个大于号表示( >>>),会将数值的所有 32 位都向右移。
逻辑非有一个叹号表示,可应用给ECMAScript中的任何值。逻辑非操作符首先将操作数转换为布尔值,然后再对其取反。
任何关系操作符在涉及比较 NaN 时都返回 false。
Null ==undefined // true
NaN != NaN // true
NaN == NaN // false
ECMAScript 中对象的属性是无序的,因此 for-in 语句不能保证返回对象属性的顺序。
第三章完结
ECMAScript变量可以包含两种不同类型的数据:原始值和引用值。
保存原始值的变量是按值访问的,因为我们操作的就是存储在变量中的实际值。
在操作对象时,实际上操作的是对该对象的引用而非实际的对象本身。
只有引用值可以动态地添加后面可以使用的属性。 function setName(obj) { obj.name = 'sam' console.log(obj) obj = new Object() console.log(obj) obj.name = 'amy' console.log(obj) } let person = new Object() setName(person) console.log(person.name) 第四行中,obj获得了一个新的引用地址,跟传进来的obj无关。
块级作用域由最近的一对包含花括号{}界定。换句话说, if 块、 while 块、 function 块,甚至连单独 的块也是 let 声明变量的作用域。
JavaScript 是使用垃圾回收的语言,也就是说执行环境负责在代码执行时管理内存。
垃圾回收的两种标记策略:标记清理和引用计数。
typeof 操作符可以确定值的原始类型,而 instanceof 操作符用于确保值的引用类型。
任何变量(不管包含的是原始值还是引用值)都存在于某个执行上下文中(也称为作用域)。这个 上下文(作用域)决定了变量的生命周期,以及它们可以访问代码的哪些部分。执行上下文可以总结 如下。
执行上下文分全局上下文、函数上下文和块级上下文。
变量的执行上下文用于确定什么时候释放内存。
引用值(或者对象)是某个特定引用类型的实例。
构造函数就是用来创建新对象的函数。
Date.parse()方法接受一个表示日期的字符串参数,会尝试将这个字符串转换为表示该日期的毫秒数。
Date.UTC()方法也返回日期的毫秒表示。
无论正则表达式是怎么创建的,继承的方法 toLocaleString()和 toString()都返回正则表达 式的字面量表示。
原始值包装类型:String() Number() Boolean()
ECMA-262 对内置对象的定义是“任何由 ECMAScript 实现提供、与宿主环境无关,并在 ECMAScript程序开始执行时就存在的对象”。
当一个函数在没有明确(通过成为某个对象的方法,或者通过 call()/apply())指定 this 值的情况下执行时, this 值等于 Global 对象。因此,调用一个简单返回 this 的函数是在任何执行上下文中获取 Global 对象的通用 方式。
New Map().set()是什么东西
New Set().add()又是什么东西
可以用Array.from实现数组的浅复制
与 Object 只能使用数值、字符串或符号作为键不同, Map 可以使用任何 JavaScript 数据类型作为 键。
keys()和 values()分别返回以插入顺序生成键和值的迭代器
与 Object 类型的一个主要差异是, Map 实例会维护键值对的插入顺序,因此可以根据插入顺序执 行迭代操作。
WeakMap 中的“weak”(弱),描述的是 JavaScript 垃圾回收程序对待“弱映射”中键的方式。
弱映射中的键只能是 Object 或者继承自 Object 的类型,尝试使用非对象设置键会抛出 TypeError。值的类型没有限制。
看到212页
看完附录JavaScript工具一遍
可维护性看到851
// 从函数开始看的 68. 在使用默认参数时, arguments 对象的值不反映参数的默认值,只反映传给函数的参数。 69. 10.6.1看完 70. 函数执行时,每个执行上下文中都会有一个包含其中变量的对象。全局上下文中的叫变量对象, 它会在代码执行期间始终存在。而函数局部上下文中的叫活动对象,只在函数执行期间存在。 71. 看到10.14.2
← 防抖和节流 阮一峰typescript教程 →