词法结构

  • 区分大小写, html不区分大小写 onclick=”fn()” 与 onClick=”fn()” 及 ONCLICK 都可以
    • html标签名和属性名可以使用大写也可以使用小写, 而在js中必须是小写,
    • html属性值区分大小写 如class=”Btn” 与 class=”btn”

Unicode转义序列 “café” === “caf\u00e9”

  • 注释
  • 直接量
  • 标识符 必须以字母、下划线、美元符开头 后续可以后续的字符可以是字母、数字、下划线或美元符
  • 保留字、严格模式保留字、全局变量或函数
  • 可选的分号。JavaScript并不是在所有换行处都填补分号:只有在缺少了分号就无法正确解析代码的时候,JavaScript才 会填补分号。通常来讲,如果一条语句以“(“、“[“、 “1” 、“+” 或“-“开始,那么它极有可能和前一条语句合在一起解析。

类型、值和变量

分原始类型和对象类型

  • 原始类型: 字符串、数字、布尔值、null、undefined、Symbol
  • 对象类型 对象 数组 Date Error 正则
  • 可自由的进行类型转换
  • 变量是无类型的
  • 是一种面向对象的语言、有自己的内存管理机制可自动的对内存进行来及回收
  • 数字类型、不区分整数和浮点类型,用浮点数指表示
    • 16进制 以“0x” 或“0X”为前缀 0xff // 15*16+15=255
    • 浮点型直接量 image.pngimage.png
    • 算术运算 移除 上溢 下溢 Infinity NaN(他和任何值都不相等包含它自身 可用 x!=x 判断, isNaN) 0 === -0
    • 浮点不够精准 (.3-.2) !== (.2-.1)
      • null 表示空值 typeof null 得到 “null typeof null 得到 “object” 是关键字
      • undefined 表示值的空缺 预定义的全局变量
  • null == undefined
  • 你或许认为undefined是表示系统级的、出乎意料的或类似错误的值的空缺,而null是表示程序级的、正常的或在意料之中的值的空缺。如果你想将它们赋值给变量或者属性,或将它们作为参数传人函数,最佳选择是使用null。
    • 全局对象 Window 与 window
    • 包装对象 null 和 undefined 没有包装对象
    • 不可变的原始对象和可变的对象引用 引用类型
    • 类型转换

image.png

  • 转换和相等性

JavaScript中的“+” 运算符可以进行数学加法和字符串连接操作。如果它的其中一个操作数是对象,则JavaScript将 使用特殊的方法将对象转换为原始值,而不是使用其他算术运算符的方法执行对象到数字的转换,‘
“==”相等运算符与此类似。如果将对象和-一个原始值比较,则转换将会遵照对象到原始值的转换方式进行。
个人总结:+ 优先字符串连接
对象转字符串 toString() valueOf()
对象到数字 valueOf() toString() 关系运算符

  • 重复声明和遗漏声明
  • 变量作用域 全局作用域 函数作用域
    • js无无块级作用域(当然es6新增了)
    • 函数作用域 和 声明提前
    • 作为属性的变量
    • delete 删除对象属性
  • 作用域链

JavaScript是基于词法作用域的语言:通过阅读包含变量定义在内的数行源码就能知道变量的作用域。全局变量在程序中始终都是有定义的。局部变量在声明它的函数体内以及其所嵌套的函数内始终是有定义的。

表达式和运算符

表达式是短句,原始表达式包含常量或直接量、关键字和变量

  • 对象和数组的初始化表达式
    • var a = [1,,,5]
  • 函数定义表达式
    • var square = function(x) {return x*x} // 函数定义
    • function square(x) {return x*x} // 函数声明
  • 属性定义表达式
    • expression . identifier
    • expression[expression]
  • 调用表达式
    • 方法调用
  • 对象创建表达式
  • 运算符概述
    • 大多数运算符都是标示符 如 “+” 还有一些关键字作为运算符 如 delete
    • 运算符、结合性、操作数类型
    • image.png
    • 位运算符
    • 相等和不相等运算符

    • image.png

语句

  • 表达式语句
  • 复合语句和空语句
  • 声明语句
  • function // 使用函数声明 语句 函数名称 函数体都会提前
  • 条件语句
    • if else else if switch
    • break 跳出switch或循环语句(一层)
  • 循环
    • while
    • do/while
    • for for(initialize ; test; increment)
    • for in 枚举属性
  • 跳转
    • break continue return
  • 标签语句 与break continue结合 示例 http://www.softwhy.com/article-2159-1.html
    • js分号处理,return 后面的表达式不能有换行 同样 break label 也不能有换行
    • try/catch/finally
  • with语句 严格模式禁止
  • debugger语句
  • “use strict”

对象

  • 对象最常见的用法创建、设置、查找、删除、检测、枚举
  • 属性特性 可写、可枚举、可配置
  • 除了包含属性之外,每个对象还拥有三个相关的对象特性(object attribute) :
    1. 对象的原型(prototype) 指向另外一个对象,本对象的属性继承自它的原型对象。
    2. 对象的类(class) 是一个标识对象类型的字符串。
    3. 对象的扩展标记(extensible flag)指明了(在ECMAScript 5中)是否可以向该对象添加新属性。
  • 内置对象、宿主对象、自定义对象、自有属性、继承属性

继承

  1. function inherit(p) {
  2. if (p == null) throw TypeError();
  3. if (Object.create)
  4. return Object.create(p);
  5. var t = typeof p;
  6. if (t !== "object" && t !== "function") throw TypeError();
  7. function f() {};
  8. f.prototype = p;
  9. return new f();
  10. }

创建对象

  • 对象直接量
  • new
  • 原型
  • Object.create // Object.create(null) + ‘s’

    属性的查询和设置

    可以通过 . 或者 [] 运算符来获取属性值
    作为关联数组的对象
    继承
    属性访问错误 1、属性是只读的 2、属性继承的 3对象是不可扩展

    属性的删除

    delete不能删除继承属性、不能删除哪些可配置为false的属性

    属性的检测

  • in

  • hasOwnProperty
  • propertyIsEnumerable

    枚举属性

    for in 遍历可枚举的属性,包含继承的
    Object.keys() 返回自身可枚举的属性

属性的getter和setter

属性的特性

数据属性的四个特性 值、可写性、可枚举性、可配置性
Object.defineProperty()或Object.defineProperties违反规则的使用都会抛出类型错误异常 如果对象是不可扩展的,则可以编辑已有的自有属性,但不能给它添加新属性。 如果属性是不可配置的,则不能修改它的可配置性和可枚举性。 如果在取器属性是不可配置的,则不能修改其getter和setter方法,也不能将它转換为数据属性。 如果数据属性是不可配置的,则不能将它转换为存取器属性。 如果数据属性是不可配置的,则不能将它的可写性从false修改为true,但可以从true修改为false. 如果数据属性是不可配置且不可写的,则不能修改它的值.然而可配置但不可写属性的值是可以修改的(实际上是先将它标记为可写的,然后修改它的值,最后转换为不可写的)

对象的三个属性

原型属性
类属性
可扩展性
Object.preventExtensions Object.seal Object.freeze

序列化

对象的方法

toString
toLocaleString
toJSON
valueOf

数组

  • 数组是无类型的
  • 数组的索引是基于0的32位数值
  • 数组是动态的
  • 数组可能是稀疏的

创建数组

数组元素的读和写

稀疏数组

数组长度

数组两个特殊的行为

  • 如果为一个数组元素赋值,它的索引i大于等于现有的数组的长度时,length属性将设置为i+1
  • 设置length属性为一个小于当前长度的非负整数n时,当前数组中的那些索引值大于或等于n的元素从中删除

    数组元素的添加和删除

    pop push shift unshift splice

    数组遍历

    数组方法

    增删改

  • reverse()

  • splice()
  • push() 返回数组长度 pop()
  • unshift() shift()
  • sort() // 不带参数按字母表顺序排列

// 读方法

  • toString() toLocalString()
  • join()
  • slice()
  • concat()

遍历

  • forEach()
  • map()
  • filter() // 跳过稀疏元素
  • erery()
  • some()
  • reduce() reduceRight()
  • indexOf lastIndexOf

函数

函数定义

函数调用

函数的实参和形参

  • 可选形参
  • 可变长的实参列表:实参对象 arguments
  • callee 和 caller 匿名函数自调用

    作为值的函数

  • 自定义函数属性

  1. // 计算阶乘,并将结果缓存到自身属性中
  2. function factorial(n) {
  3. if (isFinite(n) && n>0 && n===Math.round(n)) {
  4. if(!(n in factorial)) {
  5. factorial[n] = n * factorial(n-1);
  6. }
  7. return factorial[n]
  8. } else {
  9. return NaN
  10. }
  11. }
  12. factorial[1] = 1; // 初始化

闭包

函数的执行依赖变量的作用域,这个作用域是函数定义时决定的函数可以通过作用域链相互关联起来,函数体内部的变量都可以保存在函数作用域内。

函数属性、方法和构造函数

  • length 属性
  • prototype
  • call apply
  • bind
  • toString
  • Function
  • 可调用的对象

    函数式编程

  • 使用函数处理数组

  • 高阶函数
  1. // 这个高阶函数返回一个新的函数,这个新函数将它的实参传人f()
  2. // 并返回f的返回值的逻辑非
  3. function not(f) {
  4. return function() { // 返回一个新的函数
  5. var result = f.apply(this, arguments); // 调用f()
  6. return !result; // 对结果求反
  7. };
  8. var even = function(x) { //判断a是否为偶数的函数
  9. return X%2 === 0;
  10. };
  11. var odd = not (even); // 一个新函数,所做的事情和even()相反
  12. [1, 1, 3, 5, 5].every(odd); // => true:每个元素都是奇数
  • 不完全函数
  • 记忆 阶乘缓存

类和模块

类和原型

类和构造函数

  • 构造函数和类的标识 instandceof
  • constructor 对于任意函数 F.protorype.constructor = F

    java式的类继承

image.png