征服《JavaScript高级程序设计(第3版)》之路 =>
作为一名不爱读书之人的自我救赎 ╮(╯▽╰)╭ 。以前所有的知识几乎都是从各大学习网站的视频来的,大都会带一些讲课老师自己的理解,个人认为,这样有助于快速入门,因为老师在讲课时,还会带一些个人经验,对于以后的开发也会很有帮助,但是,也会有一些因为带了个人理解而导致的 `二手货` 知识在传达上有理解偏差,所以最终,我还是回到了这本javascript经典之作上,从基础上学起。
这个系列的笔记就是看看我能不能坚持把这本书读完,每天打卡;再顺便记录一下,本书中与我之前的理解有些偏差的地方,以及一些因为本来就很菜,所以记不太清,但是又很重要的点( ╮(╯▽╰)╭ 大概就是整本书吧 )
因为看得比较细,所以可能其中会有一些完全用不到的知识整理出来,但是for fun嘛
如有错误,欢迎指正。如有建议,欢迎讨论。如有益处,,,不存在的。
因为之前学过java、c、c++,所以有一些基本概念相同的大都会省去。
第 3 章 基本概念
3.1 语法
(1)标识符:驼峰式,不能是关键字、保留字、true、false和null
(2)分号结尾不省略。
(3)始终在控制语句中使用代码块。
3.2 关键字和保留字
(1)保留关键字中:
void,例:
<!-- void 运算符:返回undefined,MDN给出两种用途-->
<a href="javascript:void(0);">。。。</a>
<a href="javascript:void(document.body.style.backgroundColor='green');">。。。</a>
<!-- 阻止页面刷新,不推荐,可以使用<button>来代替,应该只将锚点用于正常的 URL 导航 -->
void function iife() {
console.log("I will show immediately.")
}();
<!-- 在使用立即执行的函数表达式时,让 JavaScript 引擎把一个function关键字识别成函数表达式而不是函数声明(否则花括号后面的大括号会报错) -->
<!-- 建议用 void 0 或 void(0) 代替 undefined, 因为undefined并不是javascript中的保留字,用作标识符后会被重新赋值,而void 0 可以获取undefined原始值 -->
with,例:
//不推荐使用
with (Math) {
a = PI * r * r;
x = r * cos(PI);
y = r * sin(PI / 2);
}
debugger,例:
function potentiallyBuggyCode() {
debugger;
// do potentially buggy stuff to examine, step through, etc.
}
goto,transient,volatile,eval,arguments
3.3 变量
(1)不建议修改变量所保存至的类型。
3.4 数据类型
(1)typeof 操作符
(2)undefined引入是为了区分空对象指针 null 与未经初始化的变量。
(3)对于尚未声明过的变量只能用 typeof 操作符检测其数据类型,返回`undefined`。操作未定义的变量会报错。

(4)建议显式初始化变量,以区分未定义的变量。
(5)null值表示空对象指针,typeof返回`object`。
(6)建议给存放对象的变量在声明时初始化为null。
(7)true不一定等于1,false不一定等于0

(8)虽然Boolean类型的字面值只有两个,但是所有类型的值都有与这两个Boolean值等价的值。

(9)流控制语句自动执行相应的Boolean转换,如 if

(10)可以但不推荐小数点前没有整数:var floatNum = .1;
(11)由于保存浮点数值需要的内存空间是保存整数值的两倍,因此,
如果小数点后没有跟任何数字 或 跟0,也会被转换为整数,如 1.0会被转换为1。
(12)精度问题:浮点数和大整数
对于大整数,ES6新增了的Number对象的方法:
Number.isSafeInterger(value)可以判断传入的参数值是否是一个"安全整数",安全整数范围为-2^53到2^53之间的整数。
对于浮点数,小心使用,

浮点数的比较要使用范围比较,参考:小心使用浮点数

(13)Number的一些属性和方法

(14)对于传入参数可以是对象,最后返回值为数值的方法:先调用对象的valueOf(),然后依照方法的规则转换返回的值,若结果是NaN,则调用对象的toString(),再依照规则转换返回的字符串值。
(15)实际上,只有0/0才会返回NaN;正数/0返回Infinity,负数/0返回-Infinity。

(16)NaN的特点

(17)Number(value)

(18)一元加操作符 与 Number()函数 效果相同。
*对于整数,前导零会被忽略;但是对于浮点数,前导零会导致错误。(一般前导零也是用于位数补全,不用于浮点数)

(19)常用parseInt()和parseFloat(),它们和Number()的差别如下:

(20)对于parseInt(),常用两个参数,parseInt(value, 基数);,推荐指定基数。

(21)字符字面量:\xnn:以十六进制代码nn表示一个字符;\unnnn以十六进制代码nnnn表示一个Unicode字符。
这些字符字面量常用于正则表达式。
取length,算1个字符。

(22)js中的字符串是不可变的。

对于我们平时对字符串重新赋值的操作,书中有个例子:

重新定义的后台操作如下:先创建一个能容纳10个字符的新字符串;然后在这个字符串中填充"Java"和"Script",最后是销毁原来的字符串"Java"和"Script"。
(23)null和undefined没有toString()方法,但是String(value)如果值是null或undefined会返回"null"和"undefined"。
(24)数值.toString(基数)传入基数,可以指定输出二进制、八进制、十六进制等等。

结合之前的parseInt(value, 基数),我们得到十进制转其他进制,其他进制转十进制的方法:
其它进制转十进制:
var value = "010";
parseInt(value, 8); //8
十进制转其它进制:
var value = 8;
value.toString(8); //"10"

所以,进制间互相转化:m进制转n进制
parseInt(value, m).toString(n);
如,十六进制转八进制:
var value = "0x10";
parseInt(value, 16).toString(8);
(25)Object每个实例都具有的属性和方法:


(26)toLocaleString():新的 locales 和 options 参数让应用程序可以指定要进行格式转换的语言,并且定制函数的行为,但是还不是所有浏览器都支持。在旧的实现中,会忽略 locales 和 options 参数,使用的语言环境和返回的字符串的形式完全取决于实现方式。
这个方法涉及到格式化,但是当格式化大量数字时,最好建立一个 NumberFormat 对象并且使用它提供的 NumberFormat.format 方法。格式化日期,则使用DateTimeFormat
(27)toString():
1)可以自定义一个方法来覆盖默认的 toString() 方法。该 toString() 方法不能传入参数并且必须返回一个字符串。
2)使用toString()检测对象类型
var toString = Object.prototype.toString;
toString.call(new Date); // [object Date]
toString.call(new String); // [object String]
toString.call(Math); // [object Math]
toString.call(undefined); // [object Undefined]
toString.call(null); // [object Null]
(27)valueOf():JavaScript的许多内置对象都重写了该函数,因此,不同类型对象的valueOf()方法的返回可能不同。Math 和 Error 对象没有 valueOf 方法。

可以覆盖Object.prototype.valueOf()来调用自定义方法。
function MyNumberType(n) { this.number = n;}
MyNumberType.prototype.valueOf = function() { return this.number; };
var myObj = new MyNumberType(4);
myObj + 3; // 7
3.5 操作符
js的操作符适用于很多值,它们都自动先将非数值转换为数值(Number(),包括对象,参考3.4的(14)),然后操作,返回值为数字值或NaN。
(1)按位非操作符:~,相当于操作数的负值减 1,但是速度更快(因为是底层操作)。
(2)在有一个操作数不是布尔值的情况下,逻辑与和逻辑或操作就不一定返回布尔值。


(3)常用逻辑或来避免为变量赋值null或undefined值。
var backupObject={。。。};
var myObject = perfferredObject || backupObject;
(4)取整(parseInt()):~~3.3 == 3
获取布尔值(Boolean()):!!"blue" == true
(5)某些Infinity乘法、除法、求模规则:

(6)加法操作符,如果有操作数是非数值,会转换成字符串(调用toString()),而不是数值。
(7)加法操作符,字符串中的数值运算:如果想先进行数值运算,就用括号,优先执行。

(8)Infinity和0的加减法:
结果规律:减法如果遇到负号,结果相当于合并为加号的返回值。

(9)如果要按字母表顺序比较字符串,应先把两个操作符转换为相同的大小写形式,再进行比较:
var result = "Brick".toLowerCase() < "alphabet".toLowerCase(); //false
(10)任何值与NaN比较都返回false,如果是!=,返回true。
var result1 = "23" < 3; //false
var result2 = "23" >= 3; //false
(11)null == undefined //true,
null === undefined //false,
它们两者在比较前不会转换为其他任何值。

(12)全等 === 和不全等 !== 操作符,在比较前不转换类型。
(13)推荐使用全等和不全等操作符。
(14)使用复合赋值操作符,只会简化代码,没有提升性能。
3.6 语句
(1)do-while 用于循环体中的代码至少要被执行一次的情形。
(2)在使用for-in前,先检测确认该对象的值不是null或undefined。
(3)使用label语句,一定要使用描述性的标签。label : for(。。。){for(。。。){。。。}}
(4)switch语句传入参数可以是任何数据类型,case的值也可以是变量或表达式。
(5)switch语句在比较值时使用的是全等操作符,因此不会发生类型转换。
(6)js中所有参数传递的都是值,不可能通过引用传递参数。
(7)命名参数和arguments中的值,在非严格模式下是同步的,但是内存空间也是独立的,只是值同步。

课外:
(1)类似void 0 代替undefined的简写例子(在看书的时候,想整理一些代码简写的例子,换一篇,这篇太长了)
(2)变量提升和函数提升:因为在JavaScript中执行上下文的工作方式,函数声明和变量声明总是会被被`提升`到方法体的最顶部,但不提升初始化;则在这个作用域中,声明的变量和函数可以在声明前使用。