此随笔是为了记录自己在《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, 取决于有符号操作数的符号;
来源: http://www.bubuko.com/infodetail-3458535.html