1

JavaScript高级程序设计(第3版)读书笔记

1.区分大小写:

变量、函数名和操作符都要区分大小写。大小写的不同分别表示不同的变量。

2.标识符:

变量、函数、属性、函数参数的名字。

注意:

  1. 开头必须字母、下划线、一个美元符号$
  2. 其他字符可以是字母、下划线、美元符号、数字。
  3. 也可以包含扩展的ASCII或Unicode字母。(不推荐)

起名:采用驼峰大小写格式:第一个字母小写,剩下的每个有意义的单词的首字母大写

例子:firstSecond、myCar

3.注释:

  1. 单行注视//
  2. 块级注释/ /

4.严格模式:

为JS定义一种不同的解析与执行模型。(对某些不安全的操作抛出错误)

**开启:在JS文件顶部添加'use strict';**    

也可以在函数内部的上方包含这条指示。

**支持版本:IE10+、Firefox 4+、Safari 5.1+、Opera12+ 、谷歌**


5.语句:

每段代码都要以;结尾。

注意:

  1. 如果省略了分号,由解析器确定语句的结尾。
  2. 虽然可以省略,但是加上了这个分号可以避免很多错误,也可以增进代码的性能,解析器就不用推测哪里插入分号。

6.关键字和保留字:

关键字:语言保留的,不能用做标识符。

保留字:不能用做标识符的。

**注意:在严格/非严格模式下保留字会有少不同**


7.变量:

**js的变量是松散类型的,就是可以用来保存任何类型的数据。**
  1. Var message = 'hi';
  2. var message = 18;

注意:

  1. 变量刚开始存储'hi';然后被数字值100取代。(这种是可以的,但是不推荐)
  2. 用var修饰的变量,将成为定义该变量的作用域中的局部变量。
function test(){
    var message = "hi";//局部
}
test();
alert(message);//错误

如果省略了var,从而创建了全句变量(严格模式下报错)

以上面的例子为例:

调用了test(),这个变量就有定义,就可以在函数外的任何地方被调用。


可以使用一条语句定义多个变量用逗号分开(可初始化,也可以不初始化):

var a,b,c;

Var a = 1,b='11',c=false;

8.数据类型(JS具有动态性):

1.**基本数据类型**:
  1. Undefined
  2. Null
  3. Boolean
  4. Number
  5. String

    2.复杂数据类型:

    object。

本质:由一组无序的名值对组成的。

注意:js不支持任何创建自定义类型的机制,而所有值最终都将是上述6种数据类型之一

3.typeof操作符:

检测给定变量的数据类型:typeof

使用typeo操作符可能返回以下情况:

  1. ‘undefined':这个值未定义。
  2. ‘boolean' :布尔值
  3. string : 字符串
  4. number : 数值
  5. object : 对象或null
  6. function : 函数
//typeof 可以数值或变量
var a = "some string";
alert(typeof a);
//typeof括号可以省略
alert(typeof (a));
alert(typeof 11);

注意:

  1. tupeof null 会返回 object. 特殊值:null被认为是一个空的对象引用;
  2. Safari5 、谷歌7之前的版本,对正则表达式调用typeof操作符会返回"function",而其他浏览器返回object.

注意:function也是个对象,不是一种数据类型,然而,函数也确实有一些特殊的属性,通过typeof操作区分函数和其他对象是必要的

4.Undefined 类型:

Undefined 类型只有一个值,就是特殊的undefined.

**在使用var声明,但未对其初始化时,这个变量的值就是underined**
var message;
alert (message == undefined); ture

//声明了,但未对其进行初始化。
//显示
var message=undefined;
alret (message == undefined); ture

//不过,包含undefined的值的变量与尚未定义的变量还是不一样的。
var messgae;
//var age;
alert(message); //undefined
//使用alerg函数时尚未声明的变量age--会导致错误。
alert(age); //报错

如果都把age变量注释掉了:
//var age,
var message;
alret(type messgae); undefined;
alret(type age);  undefined;

注意:即便未初始化变量会自动赋值undefinde,但是显示变量赋值是个明智的选择

5.Null类型:

Null类型是第二个只有一个值的数据类型,特殊的值是null.

null 代表着空对象指针.

typeof检测null,就会放回object



var car = null;
alert(typeof car); // object

注意:如果变量存储对象,请初始化null,而不是其他值。

只要直接检测null值就可以知道相应的变量是否已经保存了一个对象的引用:

if(car != null){
    
}

实际上,undefined值,来自null值的。

它们进行判断就是ture.

注意:它们有着这样关系,但是用途不一样

  1. 只要意在保存对象的变量还没有真正保存对象,就保存null

6.Boolean 类型:

两个值:true和false

注意:

  1. ture不一定等于1
  2. false不一定等于0
  3. 区分大小写
js所有类型的值都有与这两个不贰值等价的值

要将值转换对应的布尔值,Boolean()函数

var a = "11";
var message = Boolean(a); ture

转换规则:

ture:

  1. 任何非空字符串
  2. 非0数字值
  3. 任何对象
  4. n/a(不适用)

则反之

在控制语句中,自动执行相应的转换规则
var message = "11";
if(message){
    alert("ok");
}

7.Number类型:

整数和浮点数值

整数:

  1. 十进制:10
  2. 八进制: 第一位必须0,然后八进制数字序列1(0-7),如果字面值中数值超出范围,前导0被忽略,后面当作十进制
  3. 八进制在严格模式无效
  4. 十六进制,开头0x,后面跟着十六进制数字(0-9以及A-F),字母可以大写也可以小写
  5. 算术计算时,八进制和十六进制表示的数值都被转换十进制数值

注意:正零和负0被认为相等

浮点数:

  1. 包含小数点,小数点后面至少有一位数字。(小数点前面可以没有整数)
  2. 保存的浮点数值的内存空间时整数的两倍(所以小数点没有任何数字。自动转换整数来保存。如果是一个整数1.0,那么更会自动转换了)
  3. 对于极大或极小的值,可以用e来表示,表示浮点数值
  4. e表示:e前面的数值。乘以 10的指数次幂(即使是一个大写或小写的字母e)

    var floatNum = 3.125e7
    3.125 乘于十的七次方

5.e表示法,表示极小的数值

0.00000000000000003
3e-17
会把小数点六个0以上的浮点转换为e表示

6.浮点最高精度是17位小数。计算其精度不如整数

0.1+0.2 结构不是0.3,而是0.300000000004

if(a+b == 0.3){
    alret("不要这样测试");
}

注意,永远不呀测试某个特定的浮点数值

7.1数值范围:
注意:由于内存的限制,ECMAScript并不能保存世界上所有的数值。

js中能够表示的最小数值和最大的数值保存在Number.

MIN_VALUE:这个值是5e-324;

MAX_VALUE:这个值是1.7976931348623157e+308

**注意:计算的时候超过js数值范围的值,那么数值自动转换infinity值**
  1. 数值是负数,-infinity(负无穷)
  2. 数值是正数,infinity(正无穷)

注意:只要计算返回了正或负的infinnity值,将无法进行下一次的计算

确认最大值与最小值之间,可以使用isFinite()函数,如果在范围内,返回true

访问:
Number.NEGATIVB_INFINITY 
Number.POSITUVE_INFINITY
得到 负 和 正 infinity
7.2 NaN:
即非数值,是一个特殊的数值。

表示一个本来要返回数值的操作数,未返回数值的情况。(不会抛出错误)

**注意:任何数除于0会返回NaN,不会影响其他代码的执行**
  1. 任何涉及NaN的操作(NaN/10)都会返回NaN,(多步计算有可能导致问题)
  2. NaN与任何值都不相等,包括NaN本身。
alert(NaN == NaN) //false

为针对上面情况:

isNaN()函数。

参数可以是任何类型,函数会帮我们,确定这个参数是否 “**不是数值**”。

它会尝试把参数这个值,转换为**数值**。不是数值的值会直接转换为数值。

不能被转换的数值的值都会导致这个函数返回true.



alert(isNaN(NaN)) ture
alert(isNaN(10)) false
alert(isNaN('10')) false
alert(isNaN('blue')) ture
alert(isNaN(ture)) false
  1. NaN本身,即非数值。
  2. 数值10和字符串10,能转换数值,返回了false
  3. blue不能转换数值
  4. true可以转换成数值1

Tips: isNaN也适合对象,在对象调用函数时,首先会调用对象的valueOF方法,然后确定该方法返回的值是否可以转换为数值。如果不能,基于这个返回值调用tostring方法,再测试返回值

7.3.数值转换:
非数值转换为数值函数:Number()、parseInt()、parseFloat
  1. Number:用于任何数据类型
  2. 其他两个,把字符串转换成数值

注意:这三个函数对于同样的输入会有返回不同的结果

Number转换规则:

  1. 布尔值,true和false,转换1和0
  2. 数字值,简单的传入和返回
  3. null,返回0
  4. undefined,返回NaN
  5. 字符串:

    1. 只包含数字(包含正负号情况),则将其转换十进制。(注意前导0会被忽略)
    2. 字符串是浮点,转换对应的浮点数值。(忽略前导零);
    3. 字符串是十六进制格式,转换相同大小的十进制整数
    4. 字符串是空,转换为0
    5. 除了以上的格式外的字符串,转换为NaN

6.如果对象,调用对象的valueOf(),然后按照上述的规则转换返回的值。如果结果是NaN,调用对象的toString()方法。然后再按照上述规则转换返回字符串值。

注意:该函数处理字符串毕竟复杂,不够合理,因此处理整数的时候更常用,parseInt()函数

parseint函数:

  1. 转换字符串时,看其是否符合数值模式。
  2. 忽略字符串前面的空格,直到找到第一个非空格字符串
  3. 如果第一个字符不是数字符串或着负号,返回NaN
  4. 用它转换空字符会返回NaN.
  5. 如果第一字符串是数字字符串,继续解析下一个,直到解析完所有或遇到非数字符串。例如:123blue,blue会被完全忽略,转换123.
  6. 如果是浮点数,22.5,会转换22,小数点并不是数字字符串。
  7. 如果字符串中的第一个字符是数字字符,识别各种整数格式(二、十、十六进制)。如果以"0x"开头会转换十六个进制。以0开头并且后面跟着数字,八进制来解析。
var a = parseInt("123blue") 123
var b = parseInt("")    NaN
var c = parseInt("0xA");    10
var d = parseInt("22.5") 22
var e = parseInt("070") 56
var f = praseInt("70") 70
vae g = praseInt("0xf") 15

注意:js3和js5,转换八进制的时候,有所不同,在js5中,前导0被认为无效,这个值当成0,严格模式也是如此

解决办法:

可以为parseint函数,提供第二参数,转换使用的基数(多少进制)



parseInt("0xAF",16); 175
parseInt("AF",16);175
parseInt("AF") NaN

注意:基数决定如何解析输入的字符串,避免了错误的解析,所以使用的时候,明确基数

parseFloat:

  1. 第一个字符串开始解析每一个,直到末尾或遇到无效的浮点数字字符为止。
  2. 字符串中第一个小数点有效,第二个无效,后面的字符串会被忽略。22.34.5 转换22。34
  3. 它会忽略前导0
  4. 十六进制格式字符串,始终转换0.。(只解析十进制,没有第二参数指定参数的用法)
  5. 如果字符串包含的是一个可解析为整数的数(没有小数点或着小数点后都是0),它会返回整数。
var a = parseFloat("123blue") 123

var b = parseFloat("OxA") 0

var c = parseFloat("22.5") 22.5
var d = parseFloat("22.34.5") 22.34
var e = parseFloat("0808.5")808.5
var f = parseFloat("3.125e7") 31250000

8.String类型:

表示由0个或多个16位Unicode字符组成的字符序列,字符串。

字符串由双引号或单引号表示。

**注意:双引号开头,必须以双引号结尾,单引号也是如此**


8.1 转义字符:表示非打印字符或具有其他用途的字符。
\n 换行
\t 制表
\b 空格
\r 回车
\f 进纸
\\ 注释
\*  在字符串中使用,表示单个‘字符串
\"    在字符串中使用,表示单个"
\xnn    以16进制代码nn表示的字符nn必须0-F
\unnnn    以16进制代码nnnn表示一个Unicode字符,n必须为0-F


var test = "this is the letter sigma: \u03a3."
长度28
6个转义字符表示1个字符。
如果字符串中包含双字节字符,那么length属性可能不会精确地返回字符串中的字符数目。
8.2 字符串特点:
**注意:JS中的字符串是不可变的,也就是,字符串一旦创建,它们的值就不能改变,**

要改变某个变量保存的字符串,必须先销毁原来的字符串,其次用另一个包含新值的字符串填充改变量



var lang = "Java";
lang = lang + "Script";

lang刚开始由java字符串组成。
第二行lang的值重新定义为"java与Script"组合:
1.创建能容纳10个字符的新字符串
2.然后在这个字符串中填充javascropt
3.最后销毁原来Java和字符串“Script"

这个过程在后台发生的,旧版本的浏览器中拼接字符串时速度很慢的原因所在
8.3 转换字符串:
一个值转换为另一个字符串有两种方式:
  1. toString()方法:数值、布尔值、对象、字符串都有这个方法,这个方法返回字符串中的一个副本,但是null和undefined值没有这个方法。
  2. 一般不需要在这方法括号传参数,但是数值调用的时候,可以传,进制数(基数)。

    var age =11;
    var ageAsString = age.toString() 字符串11
    
    var a =10;
    alert(a.toString(2)); 1010
    注意:没有参数,默认基数10.
  3. 在不知道要转换的值是不是null或undefined,使用String(),能转换任何类型的值

String函数转换规则:

  1. 如果值有tostring方法,则调用该方法(没有参数)并返回相应的结果
  2. 如果值是null,则返回null
  3. 如果值是undefined,则返回undefined
var a = 10;
var b = true
var c = null;
var d;

string(a) 10
string(b) true
string(c) null
String(d); undefined

前两个个:跟调用toString函数,得到结果相同一样。
后两个,没有tostring方法,所以string函数就返回了这两个值的字面量。

9. Object 类型:

对象其实就是一组数据和功能的集合。

对象可以通过执行new操作符跟要创建对象类型的名称来创建

自定义对象:创建Object类型的实例并为其添加属性和方法
var o = new Object();
跟Java创建对象差不多。


如果不给构造函数传递参数,可以省略后面那一对括号。
var 0 = new Object//有效不推荐

理解一个重要思想:

Object 类型所具有的任何属性和方法同样存在于更具体的对象中。(Object根类)

Object的每个实例具有以下属性和方法:

  1. Constructor:保存着用于创建当前对象的函数。 构造函数:就是Object().
  2. hasOwnProperty(propertyName):用于检查给定的属性是否在当前对象实例中(而不是在实例的原型中)。

    参数属性名:必须字符串形势指定 :o.hasOwnProperty('name')

  3. isPrototypeof(Object):检查传入的对象是否是另一个对象的原型
  4. propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句。必须与字符串形势指定。
  5. toLocaleString():返回对象以字符串表示,该字符串与执行环境的地区对应
  6. toString():返回对象以字符串表示
  7. valueof():返回对象以字符串、数值、布尔值表示。与toString方法返回值相同。

注意:object是所有对象的基础,因此所有对象都具有这些基本的属性和方法

对象的行为不一定适用于JavaScript中的其他对象:

  1. 浏览器环境中的宿主对象:BOM、DOM


请叫我小白同学
71 声望0 粉丝

努力追上大前端的步伐