JS高级程序设计学习笔记之第三章基本概念(语法,数据类型,流控制语句,函数)——查漏补缺

时间:2020-12-01 08:40:36

一、语法:

  1. 区分大小写;

2.标识符:就是指变量、函数、属性的名字,或者函数的参数
    a、标志符的规则:①第一个字符必须是一个字母、下划线(_)或一个美元符号($)。
                        ②其他字符可以是字母,下划线,美元符号或者数字。
    b、标志符采用驼峰大小写格式。
    c、严格模式:在顶部添加以下代码:"use strict";
    d、语句:结尾加入分号、在控制语句中使用代码块为最佳实践。

二、关键字与保留字

三、变量:ECMAScript的变量是松散类型,可以保存任何类型的数据。且在初始化变量时,不会为它标记类型。
     1、不建议修改变量所保存值得类型,但这种操作是有效的
   2、使用var操作符定义的变量为局部变量。函数退出后会被销毁。
   3、不推荐省略var操作符来定义全局变量。如果有意的忽略var操作符,也会由于相应变量不会马上就有定义而导致不必要的混乱。给未经声明的变量赋值在严格模式下会报错。

四、数据类型:ECMAScript有5种简单数据类型(基本数据类型)——Undefined、Null、Boolean、Number、和String。一种复杂数据类型——Object。

  1.typeof操作符——检测给定变量的数据类型

    undefined——如果这个值未定义;
    boolean——如果这个值是布尔值;
    string——如果这个值是字符串;
    number——如果这个值是数值;
    object——如果这个值是对象或者null;
    function——如果这个值是函数;

  2.undefined类型:
    a、在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined。(默认取得)。
    b、对于尚未声明的变量,只能执行一项操作,使用typeof操作符检测其数据类型。返回undefined。
    c、尽可能显式的初始化变量,这样当ytpeof返回undefined时,我们就知道 被检测的变量还没有被声明,而不是尚未初始化。

  3、null类型:
    a、如果定义的变量准备在将来用于保存对象,那么最好将变量初始化为null而不是其他值。
    b、undefined的值是派生自null的,所以他们的相等性测试返回true。(双等返回true,三等返回false)。

  4、boolen类型:
    a、Boolean类型的字面量true和false是区分大小写的。其他写法都不是Boolean值,只是标志符。
    b、ECMAScript中所有类型的值都有与这两个Boolean值等价的值。要将一个值转换成对应的Boolean值,可以调用转型函数Boolean()。

数据类型 转换为true的值 转换为false的值
Boolean true false
string 任何非空字符串 空字符串
number 任何非零数值(包括无穷大) 0和无穷大
object 任何对象 null
undefined 不适用 undefined

  5、number类型:
    a、八进制字面量的第一位必须是零(0),然后是八进制数字序列。如果字面值中的数值超出了范围,那么前导零将被忽略,后面的数值被当做十进制数值解析。八进制字面量在严格模式下无效。
    b、十六进制字面量的前两位必须是0x,后跟任何十六进制数字0~9和a~z,字母可大写可小写。
    c、在进行算术计算时,所有八进制与16进制表示的数最终都被转换成十进制
    d、浮点数值:
      ①数值中必须包含一位小数点,小数点后必须至少有一位数字。小数点前可以没有整数,但是不推荐。浮点数值若能转换为整数值,那么会被转换。
      ②极大极小值用e表示法。
      ③浮点数的精度有bug,所以不要测试某个浮点数的值
    e、数值范围:超出js数值范围的值会被自动转换成Infinity。Infinity无法参与计算。isFinite()函数在参数位于最大最小值之间时会返回true。
    f、NaN:用来表示一个本来要返回数值的操作数未返回数值的情况。
      ①任何涉及NaN的操作,都返回NaN。NaN与任何值都不相等,包括他本身。
      ②isNaN()函数接收一个参数,该参数可以是任何类型,函数会尝试将参数转换为数值,任何不能被转换为数值的值都会导致函数返回true。该函数适用于对象,先调用对象的valueOf()方法,然后确定该方法返回的值能否转换为数值。若不能,则基于这个返回值再调用toString()方法,再测试返回值。
    g、数值转换:
      ①Number():用于任何数据类型
        如果是Boolean值,true和false分别返回1和0。
        如果是数值,简单地传入返回。
        如果是null,返回0。
        如果是undefined,返回NaN。
        如果是字符串:
          如果字符串只包含数字(无论正负),将其转换为十进制,忽略前导零。
          如果字符串包含有效浮点格式,转换成对应浮点格式,忽略前导零。
          如果字符串包含有效16进制,将其转换为相同大小的十进制整数值。
          如果字符串为空,将其转换为0。
          如果字符串包含除上述格式之外的字符,则将其转换为NaN。
        如果是对象:调用valueOf()方法,然后依照前面的规则转换返回值。如果转换结果是NaN,则调用toString()方法,然后再次依照前面规则转换。
      ②parseInt():忽略字符串前面的空格,直到找到第一个非空格字符。如果第一个字符不是数字字符或者负号,即返回NaN。用parseInt()解析空字符串会返回NaN。如果第一个字符是数字字符,则继续解析第二个字符直到所有的字符被解析完或者遇到了一                                    个非数字字符。
            parseInt()可以解析八进制与十六进制数,在ECMAScript5 JS引擎,parseInt()不具备解析八进制的能力。
            可以为parseInt()函数提供第二个参数来指定转换时使用的基数(即多少进制)。如果指定了十六进制,字符串前可以不带0x。
      ③parseFloat():与parseInt()类似,解析到遇到一个无效的浮点数字符为止,即第二个小数点无效。
              始终忽略前导零,十六进制字符串始终被转换成0。只解析十进制。若解析为整数则返回整数。

  6、String类型
    a、字符字面量:
      ①包含一些特殊的字符字面量,也叫转义序列,表示非打印字符,或具有其他用途。这些字符字面量可以出现在字符串中的任意位置,而且也被当做一个字符来解析。
      ②任何字符串的长度都可以通过访问其length属性获得。(若含有双字节字符,则无法返回精确的字符数目)。
    b、字符串的特点
      ①字符串是不可变的,只能销毁与重新填充变量。
    c、转换为字符串:
      ①toString():
        数值、布尔值、字符串和对象都有该方法。但是null与undefined没有。
        在调用数值的toString()方法时,可以传递一个参数来确定输出数值的基数。
      ②String():
        可以转换任何类型,包括undefined(返回undefined)与null(返回null)。

  7、Object类型:
    Object的每个实例都有以下属性与方法:
      constructor:他的构造函数
      hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中是否存在。而非原型中。
      isPrototypeOf(object):用于检查传入的对象是否是传入对象的原型。
      propertyIsEnumerable(propertyName):用于检查给定属性是否能够使用for-in语句来枚举。
      toLocaleString
      toString
      valueOf
    BOM和DOM中的对象都属于宿主对象,可能会也可能不会继承Object。

五、操作符:
  1、++  -- 又分别有前置后置,共四个操作符。可用于number、boolean、string、object。
  2、+ -操作符。对非数值应用一元加或减操作符时,操作符会像Number()转型函数一样对这个值执行转换
  3、布尔操作符:
    逻辑非:!
      如果操作数是一个对象,返回false。
      如果操作数是一个空字符串。返回true。
      如果操作数是一个非空字符串。返回false。
      如果操作数是一个0,返回true。
      如果操作数是任意非零数值(包括Infinity),返回false。
      如果操作数是null,返回true。
      如果操作数是NaN,返回true。
      如果操作数是undefined,返回true。
      同时使用两个逻辑非操作符,实际上就会模拟Boolean()转型函数。
  
    逻辑与:&&,可以应用于任何类型的操作数,在第一个操作数不是布尔值得情况下,就不一定返回布尔值。逻辑与操作属于短路操作。
      如果第一个操作数是对象,就返回第二个操作数。
      如果第二个操作数是对象,则只有在第一个操作数的求值结果为true的情况下才会返回该对象。
      如果两个操作数都是对象,则返回第二个操作数。
      如果有一个操作数是null,则返回null。
      如果有一个操作数是NaN,则返回NaN。
      如果第一个操作数是undefined,则返回undefined。
  
    逻辑或:||,可以应用于任何类型的操作数,在有一个操作数不是布尔值得情况下,就不一定返回布尔值。逻辑或操作属于短路操作。
      如果第一个操作数是对象,就返回第一个操作数。
      如果第一个操作数的求值结果为false,则返回第二个操作数。
      如果两个操作数都是对象,则返回第一个操作数。
      如果两个操作数都是null,则返回null。
      如果两个操作数都是是NaN,则返回NaN。
      如果两个操作数都是undefined,则返回undefined。

  4、乘性操作符:
    ①乘法:若某个操作数不是数值,后台会先使用Number()转型函数将其转换。
        在处理特殊情况时,遵循下列原则;
          如果有一个操作数为NaN,则结果为NaN。
          如果Infinity与0相乘,结果为NaN。
          如果Infinity与非0相乘,结果为Infinity或-Infinity。
          如果Infinity与Infinity相乘,结果是Infinity。
    ②除法:与乘法类似
        在处理特殊情况时,遵循下列原则;
          如果有一个操作数为NaN,则结果为NaN。
          如果Infinity被Infinity除,结果为NaN。
          如果0被0除,结果为NaN。
          如果非0有限数被0除,结果为Infinity或-Infinity。
          如果Infinity被任何非零数除,结果是Infinity或-Infinity。
    ③求模:
        在处理特殊情况时,遵循以下原则:
          如果被除数是无穷大值,除数是有限大数值,则结果是NaN。
          如果被除数是有限大数值,而除数是零,则结果是NaN。
          如果是Infinity被Infinity除,则结果是NaN。
          如果被除数是有限大的数值而除数是无穷大的数值,则结果是被除数。
  5、加性操作符:
    ①加法:
      如果是Infinity加-Infinity,结果是NaN。
      如果有一个操作数是对象、数值或布尔值,则调用他们的toString()方法取得相应的字符串值,然后拼接。对于undefined与null,调用String()取得相应字符串,然后拼接。
    ②减法:
      如果是Infinity减去Infinity,结果是NaN。
      如果是-Infinity减去-Infinity,结果是NaN。
      如果是Infinity减去-Infinity,结果是Infinity。
      如果是-Infinity减去Infinity,结果是-Infinity。

  6、关系操作符:< > <= >=
     如果两个操作数都是数值,则执行数值比较。
     如果两个操作数都是字符串,则比较两个字符串对应的字符编码值。
     如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较。
     如果一个操作数是对象,调用valueOf()方法,然后依照前面的规则。如果没有valueOf()方法,则调用toString()方法,然后再次依照前面规则比较。
     任何操作数和NaN比较,结果都是false。

  7、相等操作符:
    == :双等号,先转换,在判断。
      null与undefined是相等的。
      要比较相等性之前,不能将null与undefined转换为其他任何值。
      如果有一个操作数是NaN,则相等操作符返回false。不等操作符返回true。两个操作数均为NaN,相等操作符返回false。
      如果两个操作数都是对象,若都指向同一个对像,则相等操作符返回true,否则,false。
    === :三等号,仅比较不转换。
  8、条件操作符:  a ? b : c
  

六、语句
  1、if
  2、do-while:后测试循环
  3、while:前测试循环
  4、for-in:精准的迭代,用来枚举对像属性。(在循环之前,先检测确认该对象的值不是null或undefined)。
  5、label语句。配合break与continue使用。高程58页。
  6、break continue。
  7、with:简化多次编写同一对象的工作。严格模式下不允许使用。

/*第一种写法*/
var qs = location.search.substring(1);
var hostName = location.hostName;
var url = location.url; /*whith写法,与第一种功能相同*/
with(location){
var qs = search.substring(1);
var hostName = hostName;
var url = url;
}

  8、switch:每执行完一个case需要break,否则将继续执行下一个case。

七、参数:
  ECMAScript中的参数在内部使用一个数组表示,函数接收到的始终是这个数组,而不关心数组中有哪些参数。在函数体内通过arguments对象来访问这个参数数组。arguments对象与数组类似但是不是数组,使用length属性可以确定长度。
  arguments的值永远与对应的命名参数保持同步。但是内存空间独立。arguments的长度仅由传入参数的个数决定。没有传递值的命名参数将自动被赋予undefined。
  ECMAScript中所有参数的传递都是值。
八、没有重载:两个命名相同的函数,只有后一个有效。