美文网首页
《JavaScript高级程序设计》__杂记

《JavaScript高级程序设计》__杂记

作者: 洁芬 | 来源:发表于2016-12-03 09:46 被阅读12次
    • 文档对象模型DOM

      提供访问和操作页面内容的方法和接口
    • 浏览器对象模型BOM

      提供与浏览器交互的方法和接口
    • ECMAScript,提供核心语言功能


    <script></script>元素 一般 引用放在<body>元素中页面的内容后面


    javascript语法类似类C语言(java和perl),区分大小写,语句以分号结束
    变量 可以保存任何类型的数据
    var操作符定义,当函数被调用时,就会创建该变量并为其赋值,不用就会被销毁
    省略var,从而创建全局变量


    • 数据类型

    • 基本类型
      字符串(String)
      数字(Number)
      布尔(Boolean)
      数组(Array)
      空(Null)
      未定义(Undefined)

    • 引用类型
      对象(Object)

      typeof操作符(检测变量的数据类型) :
      typeof 37 === 'number';


    • undefined类型

    使用var声明变量但未对其加以初始化时,这个变量的值就是undefined。所以当提示变量undefined时候就是告诉我们这个变量还没有初始化。


    • null类型

    值:null 空对象指针(object)
    如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null。

    typeof null==="object"//true

    if(car!null){
    //对car进行某些操作
    }```
    
      undefined派生自null值,但他们的用途完全不同。
      alert(null==undefined);//true
    ***
    * #####boolean类型
    值:true和false
    true不一定等于1,而false也不一定等于0
    把其他类型中的值(与boolean等价的)转换成boolean: `boolean()`
    ***
    * #####number类型( 整数和浮点数值)
    ##`整数`
     十进制数值是最基本的数值字面量格式,八进制的字面量在严格模式下是无效的
    在进行计算时,八进制和十六进制最终都会转变成十进制数值
    ##`浮点数值`
    该数值中必定包含一个 小数点,并且小数点后面必须有一位数字,浮点数值得保存空间
    是整数值的两倍,es会不失时机地把浮点数值转换成整数值。
    ## `数值范围`
    最小:Number.MIN_VALUE
    最大值:Number.MAX_VALUE
    如果超出数值范围,转化成infinity值(-infinity负无穷),`iFinite()`函数确认一个数值是不是有穷的
    ## `NaN 非数值`
          NaN(Not a number)与任何值不相等,包括他本身
    `isNuN()`函数确认这个参数是否“非数值”
    ##`数值转换`
    把非数值转换成数值:
    `Number()` 任何数据类型
    
      字符串转换成数值:
    `parseIn()`
    `parseFloat() `
    
      对象:
    `valueOf()`  `toString()`
    ***
    * #####String类型
    字符字面量(转义序列),字符串一旦创建,他们的值就不能改变。
    转为字符串:`toString()`
    ***
    * #####对象
    object类型,一组数据和功能的集合
    object类型是所有它的实例的基础。
    ***
    * #####操作符
    运算操作符
    位操作符
    关系操作符
    相等操作符
    
      ## `一元操作符`
    递增`++`和递减操作符` --`
    前置递减和后置递减的差别,操作在包含他们的语句被求值之后才执行的
    
      ## `布尔操作符`
    逻辑非 `!`
    逻辑与` && ` 两者同时
    逻辑或 `|| `
    乘性操作符  乘法` *`  除法 `/` 求模(于)`%` 
    
      ##  `加性操作符`
    加法 `+`
              `操作数是字符串时:
              如果两个两个操作数都是字符串,则拼接
              如果有一个是字符串,则将另一个操作数转换成操作数,然后拼接`
    减法` -`
    
      ## `关系操作符`
    大于 `>`  小于 `<`  大于等于 `>=` 小于等于`<=`
    字符串比较的是字符编码
    数值和字符串相比较的时候,字符串会变转成数值,然后再比较。
     `任何操作数和NaN相比较,结果都是false。`
    
      ## `相等操作符`
    相等和不相等--先转换再比较
    ``` var  result =('22'==22) //true 转换后相等```
    全等和不全等--仅比较而不转换
    ```var result=('22'===22)//false 因为不同的数据类型,所以不全等```
    相等 `==`
    不相等`!=`
    全等`===`
    不全等`!==`
    
      ## `条件操作符`
    ```variale=boolean_experssion?true_value:false_value```
    
      ## `赋值操作符`
    把右侧的值赋给左侧
    var num=10;
    
      ## `逗号操作符`
    var num1=1,num2=2,num3=3;
    逗号操作符还可以用于赋值,逗号操作符总会返回表达式中的最后一项,如下面:
    var num=(1,2,2,3,4,5)//num的值为5
    
    ***
    * #####语句
      ## `if语句`
    推崇用代码块,即使只有一行代码
    ```javascript 
    if (条件)
      {
      当条件为 true 时执行的代码
      }
    else
      {
      当条件不为 true 时执行的代码
      }
    

    while语句

    前测试循环语句

    while (条件)
      {
      需要执行的代码
      }
    

    do-while

    语句后测试循环语句

    do
      {
      需要执行的代码
      }
    while (条件);
    

    在对表达式求值之前,循环体内的代码至少被执行一次

    for语句

    (前测循环语句)具有在执行循环之前初始化变量和定义循环后要执行的代码的能力。

    var count =10 ;
    for(var i=0;i<count;i++){
    alert(i)
    }```
    for循环只是把与循环有关的代码集中在一个位置。
    
      ## `for-in语句`
    for-in语句是一种精准的迭代语句,可以用来枚举对象的属性(遍历对象属性)
    

    var person={fname:"John",lname:"Doe",age:25};
    for (x in person)
    {
    txt=txt + person[x];
    }

    枚举在C/C++/c#中,是一个被命名的整型常数的集合。
    label语句可以在代码中添加标签,以便将来使用。
    ## `break语句`
    break语句立即退出循环,强制继续执行循环后面的语句
    

    for (i=0;i<10;i++)
    {
    if (i==3)
    { break }
    x=x + "The number is " + i + "
    ";
    }

    ## `continue语句`
    continue虽然也是立即退出循环,但是退出循环后会从循环的顶部继续执行
    

    for (i=0;i<=10;i++)
    {
    if (i==3) continue;
    x=x + "The number is " + i + "
    ";
    }```

    with语句

    将代码的作用域设置到一个特定的对象中,严格模式下不允许使用with语句,否则将视为语法错误。
    switch语句,一种流控制语句
    default,相当于一个else语句
    可以在switch语句中使用任何数据类型,每个case的值不一定是常量,也可以是变量、表达式。


      函数可以封装任意多条语句,而且可以在任何地方、任何时候调用执行。
    

    无须指定函数的返回值,因为任何函数都可以在任何时候返回任何值
    return()位于return语句之后的任何代码都永远不会执行,一个函数可以包含多个return语句。
    未指定返回值的函数返回的是一个特殊的undefined值。
    函数没有重载,如果定义两个名字相同的函数,则改名字只属于后定义的函数。


    • 基本类型和引用类型的值

    引用类型的值是保存在内存中的对象
    动态的属性

    person.name(属性)="Nicholas"(字符串值)``
    我们不能给基本属性的值添加属性
    
     ## `复制变量值`
    当一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份到新的变量分配空间中,两个变量实际上将引用同一个对象,因此改变其中一个变量,就会影响另一个变量。
    
     ##`传递参数`
    局部变量和全局变量
    参数按照引用传递
    
     ## `检测类型`
    测试变量是不是基本数据类型 typeof操作符  
    如果变量的值时一个对象或null,检测类型是object
    
     `想知道是什么类型的对象用 instanceof`
    ex:person instanceof Object如果变量是给定引用类型,则返回true,如果检测基本类型的值,则返回false,因为`基本类型不是对象`
    ***
    * ###执行环境及作用域
    `所有变量(包括基本类型和引用类型)都存在于一个执行环境(也称为作用域)当中,
    这个执行  环境决定了变量额声明周期,以及那一部分代码可以访问其中的变量。`
    执行环境定义了变量或函数有权访问的其他数据,决定他们各自的行为。
    ## `变量对象`
    执行环境的类型总共只有两种,全局和局部(函数)
    全局执行环境是最外围的一个执行环境,知道应用程序退出才会被销毁。
    每个函数都有自己的执行环境。当执行流进入一个函数时,函数的环境会被推入到一个环境栈中,执行之后,栈将其环境退出,把控制权返回给之前的执行环境。
    
     ## `延长作用域链`
    catch语句,创建一个新的变量对象
    with语句
    
    ## `没有块级作用域`
    if语句:if语句中的变量声明会将变量添加到当前的执行环境
    for语句:for语句初始化变量的表达式所定义的变量即使在for循环结束后,依旧会存在于循环外部的执行环境中。
         ## `es6有块级作用域`
    
     ## `声明变量`
    使用var声明的变量会自动添加到函数的局部环境中;如果__初始化__没有使用var声明,该变量会自动变添加到全局环境。
    
      ## `查询标识符`
    ***
    * #####垃圾收集`
    执行环境会负责管理代码执行过程中使用的内存。
    局部变量只在函数执行的过程中存在 
    
     `标记清除
    引用计数
    性能问题
    管理内存`
    
     __基本类型值__在内存中占据固定大小,因此被保存在栈内存中;
    从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本。
    
     __引用类型值__是对象,保存在堆内存中。`
    包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针。
    ****
    
    * #####引用类型
    引用类型的值(对象)是引用实例的一个实例。
    引用类型是一种__数据结构__,用于将数据和功能组织在一起,有时候也被称为对象定义,因为他们描述的是一类对象所具有的属性和方法。
    
    新对象是使用new操作符后跟这个一个构造函数来创建的。
    1.  ``` javascript
        var person = new Object();```
    2.对象字面量表示法(key value)
    

    var person={
    "name":"hello"
    "age":20;
    };```
    里面的属性名会自动转换成字符串

    访问对象属性:

    点表示法
    person.name
    括号表示法
    person["name"]


    • Array类型

    数据的有序列表,数据的每一项可以保存任何类型的数据
    var colors = new Array(20);//长度为20的数组
    var colors = new Array("red","blue","green");
    可选择省去new

    • 数组字面量表示方法

    var colors=["red","blue"]

    * 检测数组
    `Array.isArray() `确定某个值到底是不是数组
    *转换方法
    `toLocaleString()` `toString()` `valueOf()`
    
      ## `栈方法`
    栈是一种LIFO(LAST-IN-FIRST-OUT*__后进先出__*)的数据结构,也就是最新添加的项最早被移除。
    而栈中项的插入(推入)和移除(弹出),只发生在栈的顶部。
    `push()`接收任意数量的参数,把他们逐个添加到数组末尾,并返回修改后数组的长度。
    `pop()`从数组的末端移除最后一项,减少数组的length值,然后返回移除项
    
      ##`列队方法`
    列队数据结构的访问规则是FIFO(FIRST-IN-FIRST-OUT*__先进先出__*)列队在列表末端添加项,从列表的前端移除项。
      模拟列队
      `push()`末端添加 
    `shift()`前端删除  取得第一项删除
      `unshift()`前端添加
    `pop()`末端删除
    
      ##`重排序方法`
      `reverse() `反转数组顺序
    `sort()`比较的是字符串
    接收一个比较函数作为参数,以便我们指定那个值位于那个值的前面。
    
      ##`操作方法`
      `contat()`方法可以基于当前数组中的所有项创建一个新数组。
    `slice()`方法slice() 方法可提取字符串的某个部分,并以新的字符串返回被提取的部分,可以基于当前数组中的一或多个项创建一个新的数组。如果只有一个参数的情况下,slice()方法返回从该参数指定位置开始到当前数组末尾的所有项。如果有两个参数,该方法返回起始和结束位置之间的项,但不包括结束位置的项。
    ```javascript
          <script type="text/javascript">
          var str="Hello happy world!"
          document.write(str.slice(6,11));//happy
          </script>
    

    splice()方法主要用途是向数组的中部插入项
    删除、插入、替换

    位置方法

    两个方法都接收两个参数:要查找的项和(可选的)表示查找起点位置的索引
    indexOf()从数组的开头开始向后查找
    lastIndexOf()则相反

    迭代方法

    每一项上运行的函数和运行该函数的作用域对象
    every()filter()forEach()map()some()

    缩小方法

    迭代数组所有项
    缩小数组的方法 接收两个参数:一个在每一项上调用的函数和(可选的)作为缩小基础的初始值,函数接受四个参数:前一个值、当前值、项的索引和数组对象
    reduce()从数组的第一项开始遍历
    reduceRight()从数组的最后一项开始遍历


    • Date类型
    var now = new Date();```
    
    `Date.parse()` 接收一个表示日期的字符串参数,并返回相应的毫秒数
    `Date.UTC()`(一月是0)
    
      ##`继承的方法`
    
    ##`日期格式化`
    ##`日期/时间组件方法`
    ***
    * #####RegExp类型
    用来支持__正则表达式__
    Perl
    ```javascript
    var experssion =/pattern(模式)/flags(标志);```
    3个标志:
    `g`:全局模式
    `i`:不区分大小写的模式
    `m`:多行模式
          `一个正则表达式是一个模式和3个标志的组合体`
    模式中所使用的所有元字符都必须转移
    `([{\^$|)?*+.]}`
    
    ****
    
    * #####Function类型
          `函数实际上是对象。`
    
    * 函数本身就是变量,所以函数也可以作为值来使用,可以像传递参数把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回 
    
      ##`函数内部属性`
    两个特殊的对象:`arguments`和`this`
    
      ##`callee属性,阶乘函数(递归算法)`
    __this__引用的是函数数据以执行的环境对象
    函数名字仅仅是一个包含指针的变量而已
    
      ##`函数属性和方法`
    属性:length(函数希望接受命名参数的个数)
    __prototype__是保存引用类型所有实例方法的真正存在。prototype是不可枚举的,因此使用for-in无法发现
    `apply()` 
     `call()`
     `bind()`
    
      ##`基本包装类型`
    作用域的两个内置对象:  `Global` 和`Math`
    Global--window对象
    Math对象 辅助完成复杂的数学计算法
    
      ##`面向对象`
    修改属性默认的特性:`object.defineProperty()`,如果不指定特性的默认值,都是false
    访问器的属性
    getter setter
    
      定义多个属性
    `Object.defineProperties()`
    
      读取属性的特性
    `Object.getOwnPropertyDescriptor()`
    ***
    * #####创建对象
    
    * 工厂模式 
    用函数来封装以特定接口创建对象的细节,可以无数次的调用这个函数。
    
    * 构造函数模式,创建特定类型的对象
    构造函数始终以一个大写字母开头,而非构造函数则以一个小写字母开头
    构造函数本身也是函数,只不过可以用来创建对象
          `任何函数,只要通过new操作符来调用,那它就可以作为构造函数`
    
      ##`函数表达式`
      ##`函数声明`
      ##`函数声明提升`
    执行代码之前会先读取函数声明
    `function funName(){}`可以 
    
      ##`函数表达式(匿名函数/拉姆达函数)`
    使用函数之前需要先赋值
    ```javascript
      var funName=function(arg0,arg1,arg2){}```
    ***
    * #####递归
    递归函数是在一个函数通过名字调用自身的情况构成的。
    arguments.callee是一个指向正在执行的函数的指针,在严格模式下,不能通过脚本访问arguments.callee,访问这个属性会导致错误
    ***
    * #####闭包
    闭包是指有权访问另一个函数作用域中的变量的函数(在函数内部创建另一个函数),闭包就是能够读取其他函数内部变量的函数,是将函数内部和函数外部连接起来的一座桥梁
    
      每次定义一个函数,都会产生一个作用域链(scope chain)。当JavaScript寻找变量varible时(这个过程称为变量解析),总会优先在当前作用域链的第一个对象中查找属性varible ,如果找到,则直接使用这个属性;否则,继续查找下一个对象的是否存在这个属性;这个过程会持续直至找到这个属性或者最终未找到引发错误为止
    ***
    * #####关于this对象
          在全局函数中,this等于window,而当函数作为某个对象的方法调用的时候,this等于那个对象。
    匿名函数的执行环境具有全局性,因此其this对象通常指向window。
    `parameter`是指函数定义中参数,而`argument`指的是函数调用时的实际参数。
    parameter=形参(formal parameter), argument=实参(actual parameter)。
    
        `Javascript语言特有的"链式作用域"结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。`
    
            在函数内部没有var的变量是全局变量。
    
    * 待续

    相关文章

      网友评论

          本文标题:《JavaScript高级程序设计》__杂记

          本文链接:https://www.haomeiwen.com/subject/xmazpttx.html