第二章
变量: 1 声明 2 初始化 (赋值)
变量名: 1 区分大小写 2 任意数字, 字符, 下划线组合 3 不能数字开头
操作符:++ 前置 先返回值再自增 1, 后置 先自增 1 再返回
- var a = 1;
- var b = a++;
- console.log(b); //1
- console.log(a); //2
!(数字, 字符串, 布尔, null(也是对象),undefined), 都是对象.
Infinity: 超出 JS 处理范围的数值. typeof Infinity => number;
- console.log(1e309); //Infinity
- console.log(1e308); //1e+308
- console.log( - Infinity + Infinity); //NaN
- console.log(Infinity + 1); //Infinity
- console.log(Infinity - 1); //Infinity
- console.log(Infinity * 1); //Infinity
- console.log(Infinity / 1); //Infinity
- NaN: console.log(typeof NaN); //number, 属于数字.
- console.log(1 * 'abc'); //NaN
- console.log(1 * 'abc'); //NaN
- console.log(1 + true); //2
- console.log(1 * null); //0
- console.log(1 * undefined); //NaN
不支持运算的结果为 NaN, 且具有传染性.
字符串转换: 把一个数字字符串用于算术运算, 该字符串会被当成数字类型使用,+ 除外.
任意数字字符串转数字:*1;
其他类型转字符串:+"";
布尔: 加引号为字符串 true 或 false.
非与或
同一值两次! 等于其等效布尔值.
falsy:null, undefined, "", NaN, 0, false
优先级:!&&||
惰性求值: JS 引擎特点,&&or|| 一旦满足其特点即返回, 后面不再运算. 逻辑表达式中有非布尔类型操作数也有效.
- var a = 11;
- var d = 22
- console.log(true || a); //true
- console.log(false || a); //11
- console.log(false || a || true); //11
- console.log(false || a); //11
- console.log(false || a || false); //11
- console.log(false || a || b); //11
- console.log(false || a || true || d); //11
|| 返回首个不影响结果的短路值.
- var b = 2;
- var c = 3;
- console.log(false && b); //false
- console.log(true && b); //2
- console.log(true && b && false); //false
- console.log(true && b && true); //true
- console.log(true && b && true && c); //3
&& 返回首个 false 或 falsy, 或返回最后一个真值.
利用 || 的特点, var testnum = testnum || 10; // 如果 testnum 未定义则初始化为 10, 如果定义了返回原值.
注: 6 个 falsy 转布尔值都为 false, 此公式对它们无效.
数组: 能存储任何类型的数据.
第三章
函数: 实参随便写, JS 引擎只取形参够用的, 后面自动忽略不报错.
函数内置 argments() 方法.
全局函数:
parseInt() 第二个 redix 参数不指定, 默认十进制. 读取日历数据有 0 的开头要注意.
isNaN(): 检查输入值是否可以参与算术运算.
变量域: 函数域优先全局.
- var a = 1;
- function f1() {
- alert(a);
- var a = 2;
- alert(a);
- }
- f1();
- //undefined.2.
- // 局部变量 a 会覆盖所有与其同名的变量, 该变量已经存在本地空间, 没赋值.
函数是数据.
函数标识记法: var a = function (){return 1;}
63 页开头的那段代码是错的.
自调匿名函数: 不产生全局变量, 无法重复执行 (可放循环内或其他函数中). 适合初始化或一次性任务.
2018/04/03
闭包: 如果一个函数需要在其父类函数返回之后留住对父级作用域的链接的话, 可以建闭包.
- function f1(arg) {
- var n = function(){
- return arg;
- }
- arg++;
- return n;
- }
- var a = f1(123);
- console.log(a()); //124
arg 返回 124 表明函数绑定的是整个作用域, 而不是某变量或返回值.
2018/04/07
书中有关 for 循环的问题
基本数据类型的赋值没问题,
- function f1() {
- var arr1 = [];
- var i;
- for (i = 0; i < 3; i++) {
- arr1[i] = i;
- }
- return arr1;
- }
- var r = f1();
- console.log(r); //[0,1,2]
但要更多需求改成闭包, 于是出现问题.
- function f1() {
- var arr1 = [];
- var i;
- for (i = 0; i < 3; i++) {
- arr1[i] = function() {
- return i;
- };
- }
- return arr1;
- }
- var r = f1();
- console.log(r[0]()); //3
- console.log(r[1]()); //3
- console.log(r[2]()); //3
for 循环执行完再把值赋给 arr1[i];
书中给自调函数和内部函数解决方法, 都是让 f1 的局部变量 i 传递一份过去.
也证明了 JS 没有块级作用域.
2018/04/09
第四章 对象
this: 如宿主环境是浏览器, var a=1; a; 和 window.a 及 window['a'], 都是一个意思.
JS 传递或拷贝的是对象 / 函数的引用. 在引用上做任何改动, 会影响原对象 / 函数.
- var original = {howmany : 1};
- var copy = original;
- console.log(copy.howmany);
- copy.howmany = 'abc';
- console.log(original.howmany);
- var original = {howmany : 100};
- var nullify = function(o) {o.howmany = 'abc'}
- console.log(original.howmany);
- nullify(original);
- console.log(original.howmany);
三大类内建构造器:
1 数据封装类: Object Array Boolean Number String
2 工具类: Math Date RegExp
3 错误类
- ---2018/04/10
- var arr = [];
- arr[0] = 0
- arr['a'] = "a"
- arr.prop = "a"
- arr[2] = 2
- console.log(arr.length); //3
- console.log(arr['prop']); //a
Array 的 length 不计算对象属性.
来源: http://www.qdfuns.com/note/49859/7365cc9f3e1f7328c1915efc5efded5f.html