《JavaScript高级程序设计》查缺补漏

  此随笔是为了记录自己在《JavaScript高级程序设计》中对JS认知的查缺补漏,也是希望自己能够坚持的把书看下去,随笔长期更。

1、DOM(文档对象模型):针对XML但经过扩展用于Html的应用程序编程接口。DOM把整个页面映射为一个多层次结构。

      BOM(浏览器对象模型):支持可以访问和操作浏览器窗口,可以控制浏览器显示的页面以外的东西。

2、Undefined和Null类型是只有一个值的数据类型,就是他们本身。在使用var声明一个变量但未对其加以初始化时,这个变量的值就是undefined。而null值表示一个空对象指针,如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null而不是其他值。

实际上,undefined的值是派生自null值的。

这里书里提到一个小技巧:即便未初始化的变量会自动被赋予undefined,但显式的初始化变量依然是明智的选择,如果能做到这一点,那么当typeof操作符返回“undefined”值时,我们就知道被检测的变量还没有被声明,而不是尚未初始化。(看下就好)

3、Number类型

除了十进制表示之外,整数还可以通过八进制或十六进制的字面值来表示。其中,八进制字面值第一位必须是0,然后是八进制数字序列(0~7)。

:如果字面值中的数字超过了范围,那么前导的零会被忽略,后面的数字将被当做十进制数值解析。如var octalNum=079//解析为79     var octalNum1=08//解析为8

十六进制字面值的前两位必须是0x,后跟任何十六进制数字(0~9A~F),字母可大写可小写。

  (1)浮点数值:必须包含一个小数点,并且小数点后面至少要有一位数字。如果小数点后面没有跟任何数字,那么这个数值就可以作为整数来保存

  对于极大极小的数值,可以用e表示法(科学计数法)。用e表示法的数值等于e前面的数值乘以10的指数次幂。var floatNum=3.125e7;//等于312570000

  重点:浮点数值的最高精度是17位小数,但在进行算术运算时其精确度远远不如整数。例如0.1+0.2的结果不是0.3,而是0.30000000000000004.这个小小的舍入误差会导致无法测试特定的浮点数值。

  关于浮点数值计算会产生摄入误差的问题,有一点需要明确:这是使用基于IEEE754数值的浮点计算的通病,ECMAScript并非独此一家;其他使用相同数值格式的语言也存在这个问题。这个坑经常踩!!!!

  (2)NaN:NaN本身有两个非同寻常的特点,首先,任何涉及NaN的操作(如NaN/10)都会返回NaN,这个特点在多步计算中有可能导致问题。其次,NaN与任何值都不相等,包括NaN本身。

  (3)数值转化

    (i)Number():

      如果是Boolean值,true和false将分别转化为1和0;如果是null值,返回0;如果是undefined,返回NaN;

      如果是字符串:只包含数字(包括前面带正号或者负号的情况),会将其转化为十进制数值,前导的0会被忽略。十六进制会被转化为相同大小的十进制数值。

    (ii)parseInt():

      parseInt()会忽略字符串前面的空格,直至找到第一个非空字符。如果第一个字符不是字符或是负号,parseInt()就会返回NaN。例如var num=parseInt("1234blue");   //1234      所以知道为什么小数只会被保留整数了吧,因为小数点不是有效的数字字符。

      以“0x”开头且后跟数字字符,会被当做十六进制解析,以“0”开头且后跟数字字符,会被当做八进制解析。

      由于ECMAScript 3 JavaScript引擎中和ECMAScript 5 JavaScript引擎中对parseInt()解析方式的不同,不指定基数意味着让parseInt()决定如何解析输入的字符串,因此为了避免错误的解析,建议无论在什么情况下都明确指定基数。多数情况下,我们要解析的都是十进制数值,因此始终将10作为第二个参数是非常必要的。例如var num=parseInt("100",10)    //按十进制解析

      如果指定了16作为第二个参数,字符串可以不带前面的“0x”。

    (iii)parseFloat():

      与parseInt()函数类似,parseFloat()也是从第一个字符(位置0)开始解析每个字符。而且也是一直解释到字符串末尾,或者解析到遇见一个无效的浮点数字字符为止。也就是说,字符串中的第一个小数点是有效的,而第二个小数点就是无效的,因此它后面的字符串将被忽略。

         始终忽略前导的0,parseFloat()只解析十进制数,因此它没有用第二个参数指定基数的用法,十六进制格式的字符串则始终会被转化为0。

4、String类型

  多数情况下,toString()方法不必传递参数,但是,在调用数值的toString()方法时,可以传递一个参数:输出数值的基数。例如

  var num=10,num.toString()    //"10"            num.toString(2)    //"1010"              num.toString(8)    //"12"

5、一元操作符

  (1)递增递减操作符

    执行前置递增和递减操作时,变量的值都是在语句被求值以前改变的。(在计算机科学领域,这种情况通常被称为副效应)

    var num1=2;                                                                                      var num1=2;

    var num2=20;                                                                                    var num2=20;

    var num3=--num1+num2;//等于21                                                    var num3=num1-- + num2;//等于22           

    var num4=num1+num2;//等于21                                                      var num4=num1+num2;//等于21 

  (2)逻辑非

    如果操作数是一个空对象,非空字符串或是任意非0数值(包括Infinity),返回false;其他情况(空字符串,0,null,NaN,undefined)返回true

  (3)逻辑与

    逻辑与操作可以应用与任何类型的操作数,不仅仅是布尔值!它遵循以下规则:如果第一个操作数是对象,则返回第二个操作数;如果第二个操作数是对象,则只有一个操作数的求值结果为true的情况下才会返回该对象;如果第一个操作数是null,NaN或者undefined,则返回它本身。

    逻辑与操作属于短路操作,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值。如果第一个操作数是false,则第二个操作时什么值,结果都不可能是true了。

  (4)逻辑或

    逻辑与操作可以应用与任何类型的操作数,也不仅仅是布尔值!它遵循以下规则:

      如果第一个操作数是对象,则返回第一个操作数;

      如果第二个操作数是对象,则只有一个操作数的求值结果为false的情况下才会返回该对象;

      如果两个操作数都是null,NaN或者undefined,则返回它本身。

    逻辑与操作也属于短路操作,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值。如果第一个操作数是true,则第二个操作时什么值,结果都不可能是false了。 

    重点:我们可以利用逻辑或来避免为变量赋null或undefined值。例如var myObject=preferredObject || backupObject;变量myobject将被赋予等号后面两个值中的一个。preferredObject中包含优先赋予myObject的值,变量backupObject负责再preferredObject中不包含有效值的情况下踢狗后备值。如果preferredObject的值不是null,那么它的值将被赋予myObject;如果是null,则将backupObject的值赋予myObject。我经常用于封装报文的时候,传给后台的数值中某些对象可为空的情况下。

  (5)乘法操作符

    如果乘积超过了ECMAScript数值的表示范围,则返回Infinity或-Infinity;

    如果有一个操作数是NaN,则结果是NaN;

    如果是Infinity与0相乘,则结果是NaN;(没想到吧)

    如果是Infinity与非0数值相乘,则结果是Infinity或-Infinity,取决于有符号操作数的符号;

原文地址:https://www.cnblogs.com/jdWu-d/p/12482001.html