美文网首页程序员
征服《JavaScript高级程序设计(第3版)》之路 =>

征服《JavaScript高级程序设计(第3版)》之路 =>

作者: xuelulu | 来源:发表于2018-12-21 20:22 被阅读0次

    作为一名不爱读书之人的自我救赎 ╮(╯▽╰)╭ 。以前所有的知识几乎都是从各大学习网站的视频来的,大都会带一些讲课老师自己的理解,个人认为,这样有助于快速入门,因为老师在讲课时,还会带一些个人经验,对于以后的开发也会很有帮助,但是,也会有一些因为带了个人理解而导致的 `二手货` 知识在传达上有理解偏差,所以最终,我还是回到了这本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`。操作未定义的变量会报错

    尚未声明变量 b

    (4)建议显式初始化变量,以区分未定义的变量。

    (5)null值表示空对象指针,typeof返回`object`。

    (6)建议给存放对象的变量在声明时初始化为null。

    (7)true不一定等于1,false不一定等于0

    Boolean类型的字面值和数字值

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

    Boolean(value)转换规则

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

    (10)可以但不推荐小数点前没有整数:var floatNum = .1;

    (11)由于保存浮点数值需要的内存空间是保存整数值的两倍,因此,

                如果小数点后没有跟任何数字 或 跟0,也会被转换为整数,如 1.0会被转换为1。

    (12)精度问题:浮点数和大整数

        对于大整数,ES6新增了的Number对象的方法:

                Number.isSafeInterger(value)可以判断传入的参数值是否是一个"安全整数",安全整数范围为-2^53到2^53之间的整数。

        对于浮点数,小心使用,

    浮点数精度丢失

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

    范围比较浮点数

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

    Number的一些属性和方法

    (14)对于传入参数可以是对象,最后返回值为数值的方法:先调用对象的valueOf(),然后依照方法的规则转换返回的值,若结果是NaN,则调用对象的toString(),再依照规则转换返回的字符串值。

    (15)实际上,只有0/0才会返回NaN;正数/0返回Infinity,负数/0返回-Infinity。

    (16)NaN的特点

    (17)Number(value)

    (18)一元加操作符 与 Number()函数 效果相同。

    *对于整数,前导零会被忽略;但是对于浮点数,前导零会导致错误。(一般前导零也是用于位数补全,不用于浮点数)

    +和Number()

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

    parseInt()、parseFloat()、Number()

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

    (21)字符字面量:\xnn:以十六进制代码nn表示一个字符;\unnnn以十六进制代码nnnn表示一个Unicode字符。

               这些字符字面量常用于正则表达式。

               取length,算1个字符。

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

    字符串不可变

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

    变量lang开始时包含字符串"Java";第二行代码把lang的值重新定义为"Java"与"Script"的组合。

    重新定义的后台操作如下:先创建一个能容纳10个字符的新字符串;然后在这个字符串中填充"Java"和"Script",最后是销毁原来的字符串"Java"和"Script"。

    (23)null和undefined没有toString()方法,但是String(value)如果值是null或undefined会返回"null"和"undefined"。

    (24)数值.toString(基数)传入基数,可以指定输出二进制、八进制、十六进制等等。

    10的四进制是"22"

                结合之前的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每个实例都具有的属性和方法:

    Object每个实例都具有的属性和方法 toLocaleString()、toString()、valueOf()

    (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 方法。

    重写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的加减法:

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

    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中执行上下文的工作方式,函数声明和变量声明总是会被被`提升`到方法体的最顶部,但不提升初始化;则在这个作用域中,声明的变量和函数可以在声明前使用。

    相关文章

      网友评论

        本文标题:征服《JavaScript高级程序设计(第3版)》之路 =>

        本文链接:https://www.haomeiwen.com/subject/bmpekqtx.html