无标题文章

2018-03-08  本文已影响0人  许晨星

# JavaScript权威指南2/3章

## 第二章:词法结构

### 2.1字符集

* JS使用Unicode字符集编写,这是ASCII和Latin-1的超集

* JS区分大小写

    * 但是html不区分大小写

* JS忽略空格,换行符和格式控制符

### 2.3直接量

* 注意一下直接两可以是正则表达式直接量,比如/javascript/gi

### 2.4 标识符和保留字

* 这个特别注意下严格模式下的保留字

    * implements

    * let

    * private

    * public

    * yield

    * interface

    * package

    * protected

    * static

### 2.5 可选分号

* js会自动在【换行处 且 缺少分好就无法正确解析代码】的时候填补分号

## 第三章:类型、值和变量

### 3.1数字

* js不区分整数值和浮点数,所有的数字都用浮点数表示,采用IEEE 754标准的64位浮点格式表示数字

* 整型

    * 进制

        * 16进制:0x

        * 8进制:0

            * ES标准不支持8进制,所以尽量别用

                * 严格模式下8进制是禁止的

* 浮点型

    * 记住指数记数法就好,e/E都可以,+/-也可以用,如 6.02e-3

* 常见数学计算函数都封装在Math里

    * 幂运算

        * Math.pow(a,b)

            * 立方根

                * Math.pow(3,1/3)

    * 四舍五入

        * Math.round()

    * 向上取整

        * Math.ceil()

    * 向下取整

        * Math.floor()

    * 绝对值

        * Math.abs()

    * 返回最大值/最小值

        * Math.max() / Math.min

    * 生成一个0《x<1.0的伪随机数

        * Math.random()

    * 圆周率

        * Math.PI

    * 自然对数的底数

        * Math.E

    * 平方根

        * Math.sqrt

    * 三角函数

        * Math.sin()/Math.cos

    * 自然对数

        * Math.log()

    * e的n次幂

        * Math.exp()

* JavaScrip的算术运算在溢出/下溢/被0整除 都不会报错

    * 溢出

        * 结果为一个±infinity值,表示无穷大/小

    * 下溢

        * 无穷小属于溢出,不是属于下溢

        * 指的是运算结果无限接近0且比js能表示的最小值还小

        * 结果:返回0

    * 被0整除

        * 返回±infinity

        * 但是0/0会返回一个非数字值NaN

    * JS中的非数字值与【任何值】都不等,包括自身

        * 无法通过x==NaN 来判断x是否是NaN

        * 通过.isNaN()函数来判断

            * 类似函数还有.isFinite()

        * 应该通过x!=x

    * -0 = +0

* 3.1.5 日期与时间

    * Date()构造函数可以创建表示日期和时间的对象

    * undefined

### 3.2文本

* 从ES5开始,字符串直接量可以拆分成数行,每行以‘\'结束

常见转义字符

    * \t 水平制表符

        * \v垂直制表符

    * \n 换行符

    * \b 退格符

    * \r 回车符

* 字符串api

    * undefined

* 模式匹配

    * 这里抽到第十章讲吧

### 3.3布尔值

* 任意Js的值都会转换为布尔值

    * 转为true

        * 一般有值就会使真值

    * 转为false

        * undefined

        * null

        * 0

        * -0

        * NaN

        * "" 空字符串

* 注意&&,||,! 这种逻辑运算符都有C++一样的特性,就是判断了第一个,如果已经满足逻辑条件,就不会执行第二个语句

### 3.4 Null 和 undefined

* null

    * null是一个特殊的对象,含义是“非对象”,表示数字,字符串,对象是“无值”

* undefined

    * 指的是变量没有初始化,不存在,没有这个属性

* 当使用==的时候,两者相等;使用===的时候,不相等

### 3.5 全局对象

* 全局属性

    * ,比如undefined,infinity和NaN

* 全局函数

    * 比如isNaN(),parseInt(),eval()

* 构造函数

    * 比如Date(),RegExp()

* 全局对象

    * 比如Math,JSON

* 在代码的最顶级,不在任何函数内的js代码中可以用var global = this 得到全局变量

    * 而在客户端JS,在浏览器窗口中的所有JS代码中,window对象充当了全局对象

    * window对象有一个属性window引用自身,所以可以代替this来引用全局对象

### 3.6 包装对象

* 指:存取 字符串、数字、布尔值的属性时 创建的临时对象

    * 因为字符串,数字,布尔值都是只读的,并且不能定义新属性,所以它们是有别于对象的

    * 然后包装对象被创建后,被存取之后就会销毁

        * undefined

    * ==会将原始值和包装对象认为相等,===不相等

### 3.7 不可变的原始值和可变的对象引用

* 不可更改的JS原始值

    * undefined,null,布尔值,数字,字符串

        * 特别注意,字符串也是不可以更改的,字符串中所有的方法看上去返回了一个修改后的字符串,实际上返回的是一个新的字符串值

    * 但是对象(包括数组与函数)可以

* 可变的对象引用

    * 我们通常将对象成为“引用类型” reference type ,与基本类型区分开

    * 对象的比较≠值的比较,即使两个对象包含同样的属性同样的值,在===的情况下是不会相等的

    * 对象的比较 都是 引用的比较,只有引用同一个基类对象的时候,它们才相等

    * 如何copy/比较 一个对象副本

        * 显式赋值/比较

### 3.8 类型转换

* 3.8.1 转换和相等性

    * 注意 能转化并不代表==就相等

* 3.8.2 显式类型转换

    * Boolen()

    * Number()

    * String()

    * Object()

    * 除了null和undefined之外,任何值都有toString()方法

        * Number类的对应方法,接受一个进制转换参数(默认为10)

        * 字符串转换为数字

            * Number()构造函数,将传入的字符串转换为一个整数或者浮点数,只能基于十进制数,不能出现非法尾随字符

            * parseInt()  只解析整数

            * parseFloat() 解析整数和浮点数,可以接收第二个可选参数,制定数字转换的基数(比如八进制啊之类的

* 3.8.3 对象转换为原始值

    * 对象→布尔值

        * 所有对象都转换为true,包括数组,函数

    * 对象→字符串

        * 如果有,优先调用对象的toString()方法,如果toString()返回了一个JS原始值,那么就将这个值转为字符串

        * 如果没有toString()方法,或者toString()不返回原始值

            * 调用valueOf()方法,如果返回了原始值,转换为字符串

        * 如果前面2个方法都挂了,就会抛出异常

    * 对象→数字

        * 先把对象转换为字符串,再转换为数字

    * 所以含有一个元素的数组转换成字符串的结果 =  这个元素转换为字符串的结果

    * Date类型对象特殊

    * 而在“=”,“+”,“!=”“<" 这种运算发,对象转换到原始值将……?

### 3.9 变量声明

* 声明变量后如果没有指定初始值,那么初始值将是undefined

### 3.10 变量作用域

* 声明提前(hoisting)

    * JS的函数作用域是指【函数内生命的所有变量在函数体内始终是可见的】

    * 变量在代码的声明之前就已经可用,这叫声明提前

    * 可以理解为JS函数里生命的所有变量(但不涉及赋值)都被提前到了函数体的顶部

    * 这个骚操作是在预编译的时候进行的

* 作为属性的变量

    * JS强制规定,全局变量是全局对象的属性

    * JS可以允许使用this来获得全局对象,但是没有方法引用全局变量中存放的对象

* 作用域链

    * 意思就是当JS需要查找变量值x的时候(成为变量解析 variable resolution)

    * 它会从作用域链的第一个对象可以查找,如果有x,就直接用

    * 如果没有,查找链上的下一个对象,以此类推,知道查到最顶层的那个对象

    * 59页的那段话我是没有看懂的

*XMind: ZEN - Trial Version*

上一篇下一篇

猜你喜欢

热点阅读