JavaScript 高级程序设计学习笔记2—— 基本概念(语法、变量、数据类型、操作符)

第3章 基本概念

3.1 语法

ECMAScript 的语法大量借鉴了C 及其他类 C 语言(Java / Perl)的语法。

3.1.1 区分大小写

ECMAScript 中的一切(变量、函数名、操作符)都区分大小写。

3.1.2 标识符

标识符——变量、函数、属性的名字,或函数的参数。标识符可以是按下列各式规则组合起来的一个或多个字符:
1)第一个字符必须是字母、下划线或美元符号;
2)其他字符可以是字母、下划线、美元符号或数字。
注:
1)标识符中字母可包含扩展的 ASCII 或 Unicode 字母字符,但不推荐这样做。
2)驼峰大小写格式:第一个字母小写,剩下的每个单词首字母大写。 firstSecond
3)关键字、保留字、true、false、null不可用作标识符。

3.1.3 注释

单行注释://单行注释
块级注释:
/*
*这是一个多行(这两行的星号不是必须的,纯粹为了提高注释的可读性,企业级应用中用的较多)
*(块级)注释 (这两行的星号不是必须的,纯粹为了提高注释的可读性,企业级应用中用的较多)
*/

3.1.4 严格模式

严格模式为 JavaScript 定义了一种不同的解析和执行模式。
要启用严格模式,可以在顶部添加如下代码:
‘use strict’—— 编译指示,用于告诉支持的 JavaScript 引擎切换到严格模式。
可以在函数内部上方包含这条编译指示,也可以制定函数在严格模式下执行。
严格模式下,JavaScript 的执行结果会有很大不同。

3.1.5 语句

ECMAScript 中的语句以一个分号结尾;若省略分号,由解析器确定语句的结尾(不推荐),代码行结尾处无分号会导致压缩错误。且加上分号,则解析器不必花时间推测应该在哪里插入分号、增进代码性能。

3.2 关键字和保留字

关键字——用于表示控制语句的开始或结束,或用于执行特定操作等。

break    do    instanceof    typeof    case    else    new    var    catch    finally   
return    void    continue    for    switch    while    debugger*    fuction    this    
with    default    if    throw    delete    in    try

保留字——无特定用途,但将来可能被用作关键字。

avstract    enum    int    short    boolean    export    interface    static    byte  
extends    long    super    char    final    native    synchronized    class    float    
package    throws    const    goto    private    transient    debugger    
implements    protected    volatile    double    import    public

第 5 版 非严格模式下运行时的保留字缩减为下列这些:
class enum extends super const export import
严格模式下,第5版还对以下保留字施加了限制:
implements package public interface private static let protected yield

3.3 变量

ECMAScript 的变量是松散类型的——可以用来保存任何类型的数据,即每个变量仅仅是一个用于保存值得占位符而已。
如:var message = 'hi'; 变量 message 中保存了一个字符串 hi ,但并不会把它标记为字符串类型。
message = 100;则 message 保存了 一个数值,虽然我们不建议修改变量所保存值得类型,但这种操作在 ECMAScript 中完全有效。
在函数内用 var 定义一个变量,则该变量为定义该变量的作用域中的局部变量,函数推出后则销毁。
省略 var ,则为全局变量,在函数外的任何地方都可被访问到(不推荐,难维护,且在严格模式下会抛出错误)。
注:
ES6 中增加了 let 和 const ,let 用来定义变量,定义后可更改;const 用来定义常量,定义后不可更改。
let 和 var 的区别。
1)let 是块级作用域,var 是函数级作用域,let 的作用域更小;
2)let 无变量提升。下面定义的变量,在上面使用会报错;var有变量提升,下面定义的变量,在上面值为undefined。
3)let 同一个变量只能声明一次,而 var 可声明多次。
一条语句定义多个变量:

var   message = 'hi',
        found = false,
        age = 29;

注:严格模式下,不能定义名为 eval 或 arguments 的变量,否则会导致语法错误。

3.4 数据类型

简单数据类型(基本数据类型): Undefined ; Null ; Boolean ; Number ; String
复杂数据类型:Object,Object 本质上是由一组无序的名值对组成。

3.4.1 typeof 操作符

typeof——返回给定变量的数据类型,可能返回如下字符串:

'undefined'——Undefined
'boolean'——Boolean
'string'——String
'number'——Number
'object'——Object / Null (Null 为空对象的引用)
'function'——Function

typeof 是操作符而非函数,所以可以使用圆括号,也可以不使用。

var message = ’some string‘;
alert(typeof message); /     alert(typeof (message));

注:对声明未初始化的变量和未声明的变量执行typeof操作符,都会返回 undefined。

各数据类型及描述
  • Undefined:undefined

使用var声明变量但未初始化;或初始化其值为undefined(不必要,一般不用)
(var message);alert(message);//undefined

  • Null:null

空对象指针,用于在将来保存对象。这样只要检查变量是否等于null,就知道这个变量内是否已经保存了一个对象的引用。

alert(null == undefined); //true
alert(null === undefined); //false
  • Boolean:true / false

ECMAScript 中所有类型的值都有与这两个Boolean 值等价的值;可使用转型函数Boolean()进行转换。
非空字符串、非零数值、任何对象都是 true;
空字符串、数值零或NaN、null都是false。
流控制语句(如if)会自动执行 Boolean 转换。

var message = 'hello';
if(message){alert('value is true');}  //message被自动转换为对应的 Boolean 值(true)。
  • Number

1)定义
var intNum = 55; //整数
八进制:第一位为0,后面数值若超出范围,则前导零被忽略,将后面数值按十进制解析
var intNum = 070; //八进制的56
var intNum = 079; //无效的八进制数值,解析为79
十六进制:前两位为0x,后跟十六进制数字。
var initNum = 0xa; //十六进制的10
var initNum = 0x1f; //十六进制的31
2)浮点数值:
必须包含一个小数点,且小数点后必须至少有一位数字。
保存浮点数需要的内存空间是保存整数值的两倍,所以ECMAScript会不失时机地将浮点数转换为整数。若小数点后没有数字(1.)或数字为0(10.0),则将被作为整数来保存。
浮点数最高精度是17位小数,但计算时其精度远不如整数。如 0.1 + 0.2 不是 0.3,而是0.3000000000000004.因此,永远不要测试某个特定的浮点数值。
3)数值范围
由于内存限制,ECMAScript并不能保存世界上所有数值。
Number.MIN_VALUE(5e-324) < number < Number.Max_VALUE(1.7976931348623157e+308)
大于这个范围,会被转换为 Infinity(正无穷),小于这个范围,会被转换为 -Infinity(负无穷)。
isFinity()可以返回这个数是否在范围内,在则返回 true,否则返回 false。
4)NaN
非数值——特殊的数值,本该返回数值的操作数未返回数值的情况,不抛出错误。
任何涉及 NAN 的操作都会返回 NaN ,NaN 与任何值都不相等。 alert(NaN == NaN ); //false
isNaN(),函数收到一个值后,会尝试将这个值转换为数值,可以转换则返回 false,否则返回 true。
alert(isNaN(true)); 返回 false,因为 true 可以被转换为1。
5)数值转换
Number()——用于任何类型;parseInt()、parseFolat()——专用于把字符串转换为数值。

Number()
var num1 = Number("Hello world!"); //NaN
var num2 = Number(""); //0
var num3 = Number("000011"); //11
var num4 = Number(true); //1
parseInt()
var num1 = parseInt("1234blue"); // 1234
var num2 = parseInt(""); // NaN
var num4 = parseInt(22.5); // 22
var num6 = parseInt("70"); // 70
var num8 = parseInt("s2131"); // NaN
var num = parseInt("0xAF", 16); //175
var num1 = parseInt("AF", 16); //175
var num2 = parseInt("AF"); //NaN
指定基数转换:
var num1 = parseInt("10", 2); //2 (按二进制解析)
var num2 = parseInt("10", 8); //8 (按八进制解析)
var num3 = parseInt("10", 10); //10 (按十进制解析)
var num4 = parseInt("10", 16); //16 (按十六进制解析)
parseFloat()
从第一个字符开始解析,始终忽略前导零
var num1 = parseFloat("1234blue"); //1234 (整数)
var num2 = parseFloat("0xA"); //0
var num3 = parseFloat("22.5"); //22.5
var num4 = parseFloat("22.34.5"); //22.34
var num5 = parseFloat("0908.5"); //908.5
var num6 = parseFloat("3.125e7"); //31250000
  • String

String 类型用于表示由零或多个16 位Unicode 字符组成的字符序列,即字符串。字符串可以由双
引号(")或单引号(')表示,但前后符号应保持一致。

var firstName = "Nicholas";
var lastName = 'Zakas';

1)特殊的字符字面量(转义序列),用于表示非打印字符或具有其他用途的字符。一个转义序列表示一个字符。
任何字符串的长度都可以通过 length 属性取得。

2)字符串的特点
ECMAScript 中的字符串是不可变的,也就是说,字符串一旦创建,它们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量

3)转换为字符串 toString()
数值、布尔值、对象和字符串都有一个 toString() 方法,返回一个字符串。null 和 undefined 没有 toString() 方法。
数值的 toString() 方法可以传一个参数:输出数值的基数。

var num = 10;
alert(num.toString()); // "10"  不传,默认为10
alert(num.toString(2)); // "1010"
alert(num.toString(8)); // "12"
alert(num.toString(10)); // "10"
alert(num.toString(16)); // "a"

在不知道要转换的值是不是 null 或 undefined 时,可以使用转型函数 String(),这个函数可以将任何类型的值转换为字符串。String()遵循下列转换规则:
如果值有toString()方法,则调用该方法(没有参数)并返回相应的结果;
如果值是null,则返回"null";
如果值是undefined,则返回"undefined"。

  • Object

ECMAScript 中的对象其实就是一组数据和功能的集合。对象可以通过执行new 操作符后跟要创建
的对象类型的名称来创建。
如:var o = new Object();若不传参数,圆括号可省,但不推荐这样做。
仅仅创建Object 的实例并没有什么用处,但关键是要理解一个重要的思想:即在ECMAScript 中,
Object 类型是所有它的实例的基础。换句话说,
Object 类型所具有的任何属性和方法也同样存在于更具体的对象中。
Object 的每个实例都具有下列属性和方法。
constructor:保存着用于创建当前对象的函数。对于前面的例子而言,构造函数(constructor)
就是Object()。
hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。其中,作为参数的属性名(propertyName)必须以字符串形式指定(例如:o.hasOwnProperty("name"))。
isPrototypeOf(object):用于检查传入的对象是否是传入对象的原型
propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in 语句来枚举。与hasOwnProperty()方法一样,作为参数的属性名必须以字符串形式指定。
toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。
toString():返回对象的字符串表示。
valueOf():返回对象的字符串、数值或布尔值表示。通常与toString()方法的返回值相同。
由于在ECMAScript 中Object 是所有对象的基础,因此所有对象都具有这些基本的属性和方法。

3.5 操作符

操作符,包括算数操作符、位操作符、关系操作符和相等操作符。
操作符适用于很多值:字符串、数值、布尔值、对象。应用于对象时,相应的操作符通常都会调用对象的 valueOf() 或 toString() 方法,以便取得可以操作的值。

3.5.1 一元操作符——只能操作一个值
1.递增递减操作符——可用于数值、字符串、布尔值、对象。

前置:先改变变量的值,在求语句的值

前置递增: var age = 29;var age2 = 2;var result =  ++age + age2;(同 age = age +1;) 
//age 为30 result 为32

前置递减: var age = 29;var age2 = 2;var result =  --age+ age2;(同 age = age -1;)   
 //age 为28 result 为30

后置;先求语句的值,再改变变量的值
后置递增: var age = 29;var age2 = 2;var result =  age++ + age2;(同 age = age +1;) 
//age 为30  result 为31

后置递减: var age = 29;var age2 = 2;var result =  age-- + age2;(同 age = age -1;)   
 //age 为28 result 为31

应用规则:
1)应用于数值时,直接执行加减操作。
2)应用于字符串,若包含有效数字字符,则转换为数字值,再执行操作,字符串变量变成数值变量;若不包含有效数字字符,则变量的值设为 NaN ,字符串变量变成数值变量。
3)应用于布尔值时,若是 false,则先转换为 0 再执行;若是 true,则先转换为 1 再执行;最终都将布尔值变量变为数值变量。
4)应用于对象时,先调用 valueOf() 方法,取得一个可供操作的值,再对其应用上述规则。若结果是 NaN,则调用 toString()方法后再应用上述规则。对象变量变成数值变量。

var s1 = "2";
var s2 = "z";
var b = false;
var f = 1.1;
var o = {
valueOf: function() {
return -1;
    }
};
s1++; // 值变成数值3
s2++; // 值变成NaN
b++; // 值变成数值1
f--; // 值变成0.10000000000000009(由于浮点舍入错误所致)
o--; // 值变成数值-2
2.一元加减操作符

1)一元加操作符
数值前添加一元加操作符,无作用;
其他类型前添加一元加操作符,会像 Number() 函数一样对这个值进行转换。
2)一元减操作符
数值前添加一元减操作符,转换为对应负数;
其他类型前添加一元减操作符,同样,会像 Number() 函数一样对这个值进行转换,再将得到的值转换为负数.

var s1 = "01";
var s2 = "1.1";
var s3 = "z";
var b = false;
var f = 1.1;
var o = {
valueOf: function() {
return -1;
}
};
s1 = -s1; // 值变成了数值-1
s2 = -s2; // 值变成了数值-1.1
s3 = -s3; // 值变成了NaN
b = -b; // 值变成了数值0
f = -f; // 变成了-1.1
o = -o; // 值变成了数值1
3.5.2 位操作符 略
3.5.3 布尔操作符——与、或、非
1.逻辑非 —— !

空字符串、数值0、null、undefined、null、NaN 的布尔值为 false,则对他们执行逻辑非操作,返回 true。

alert(!false); // true
alert(!"blue"); // false
alert(!0); // true
alert(!NaN); // true
alert(!""); // true
aler t(!12345); // false
2.逻辑与 —— && 有两个操作数

真值表如下:



逻辑与操作可以应用于任何类型的操作数,而不仅仅是布尔值。在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值;此时,它遵循下列规则:
如果第一个操作数的布尔值是 true,则返回第二个操作数;
如果有一个操作数是null,则返回null;
如果有一个操作数是NaN,则返回NaN;
如果有一个操作数是undefined,则返回undefined。
逻辑与操作符是短路操作符,如果第一个操作数为 false,则结果都为 false,第二个操作数不执行。

3.逻辑或 —— || 有两个操作数

真值表如下:



与逻辑与操作相似,如果有一个操作数不是布尔值,逻辑或也不一定返回布尔值;此时,它遵循下列规则:
如果第一个操作数的求值结果为 true,则返回第一个操作数;
如果第一个操作数的求值结果为 false,则返回第二个操作数;
如果两个操作数都是null,则返回null;
如果两个操作数都是NaN,则返回NaN;
如果两个操作数都是undefined,则返回undefined。
逻辑或操作符也是短路操作符,如果第一个操作数为 true,则结果都为 true,第二个操作数不执行。

3.5.4 乘性操作符

乘法、除法、求模
如果参与乘性操作符的某个操作数不是数值,后台会先使用 Number() 转型函数将其转换为数值。

1.乘法 *

特殊值处理规则:
 如果操作数都是数值,执行常规的乘法计算,即两个正数或两个负数相乘的结果还是正数,而 如果只有一个操作数有符号,那么结果就是负数。如果乘积超过了 ECMAScript数值的表示范围, 则返回 Infinity 或-Infinity;
 如果有一个操作数是 NaN,则结果是 NaN;
 如果是 Infinity 与 0相乘,则结果是 NaN;
 如果是 Infinity 与非 0数值相乘,则结果是 Infinity 或-Infinity,取决于有符号操作数 的符号;
 如果是 Infinity 与 Infinity 相乘,则结果是 Infinity;
 如果有一个操作数不是数值,则在后台调用 Number()将其转换为数值,然后再应用上面的 规则

2.除法 /

特殊值处理规则:
 如果操作数都是数值,执行常规的除法计算,即两个正数或两个负数相除的结果还是正数,而 如果只有一个操作数有符号,那么结果就是负数。如果商超过了 ECMAScript数值的表示范围, 则返回 Infinity 或-Infinity;
 如果有一个操作数是 NaN,则结果是 NaN;
 如果是 Infinity 被 Infinity 除,则结果是 NaN;
 如果是零被零除,则结果是 NaN;
 如果是非零的有限数被零除,则结果是 Infinity 或-Infinity,取决于有符号操作数的符号;
 如果是 Infinity 被任何非零数值除,则结果是 Infinity 或-Infinity,取决于有符号操作 数的符号;
 如果有一个操作数不是数值,则在后台调用 Number()将其转换为数值,然后再应用上面的规则。

3.求模(余数) %

特殊值处理规则:
 如果操作数都是数值,执行常规的除法计算,返回除得的余数;
 如果被除数是无穷大值而除数是有限大的数值,则结果是 NaN;
 如果被除数是有限大的数值而除数是零,则结果是 NaN;
 如果是 Infinity 被 Infinity 除,则结果是 NaN;
 如果被除数是有限大的数值而除数是无穷大的数值,则结果是被除数;
 如果被除数是零,则结果是零;
 如果有一个操作数不是数值,则在后台调用 Number()将其转换为数值,然后再应用上面的规则。

3.5.5 加性操作符:加法、减法
1.加法

操作数为如下类型时,处理如下:
数值:做加法
字符串:将字符串拼接,只有一个是字符串,则将另一个也转换为字符串。
对象、数值、布尔值、null、undefined:调用 toString() 取得相应字符串值,再拼接。

2.减法

操作数为如下类型时,处理如下:
数值:做减法
如果有一个操作数是字符串、布尔值、null、undefined:后台先调用 Number() 函数将其转换为数值,再进行减法。如果转换的结果是 NaN,则减法的结果是 NaN;
如果有一个操作数是对象,则调用 valueOf() 方法取得表示该对象的数值。得到的是 NaN,则减法的结果就是 NaN。如果没有valueOf()方法,则调用其 toString() 方法并将得到的字符串转换为数值。

3.5.6 关系操作符

小于(<)、大于(>)、小于等于(<=)和大于等于(>=)
执行规则:
两个都是数值:执行数值比较
两个都是字符串:比较两个字符串对应的字符编码值
如果一个是数值:则将另一个操作数转换为数值,然后执行数值比较
如果一个操作数是对象,则调用这个对象的 valueOf()方法,用得到的结果按照前面的规则执 行比较。如果对象没有valueOf()方法,则调用 toString()方法,并用得到的结果根据前面 的规则执行比较。
如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较。

3.5.7 相等操作符
1. 相等和不相等 == / !=

先强制转型,再比较是否相等
特殊情况及比较结果:


2. 全等和不全等 === /!==

只在两个操作苏未经转换就相等的情况下返回 true,即类型和值均相等。

3.5.8 条件操作符

var max = (num1 > num2) ? num1 : num2;
在这个例子中,max 中将会保存一个大的值。这个表达式的意思是:如果 num1 大于 num2(关 系表达式返回 true),则将 num1 的值赋给 max;如果 num1 小于或等于 num2(关系表达式返回 false), 则将 num2 的值赋给 max。

3.5.9 赋值操作符

var num = 10 ; 将等号右侧的值赋给左侧变量。
复合操作符:
num += 10; 即为 num = num + 10 ;
同理还有:
 乘/赋值(*=);  除/赋值(/=);  模/赋值(%=);  加/赋值(+=);  减/赋值(-=);  左移/赋值(<<=);  有符号右移/赋值(>>=);无符号右移/赋值(>>>=)。

3.5.10 逗号操作符

使用逗号操作符可以在一条语句中执行多个操作,如:

var num1=1, num2=2, num3=3;           //声明多个变量。
var num = (5, 1, 4, 8, 0);    // 赋值 : num 的值为 0
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,688评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,559评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,749评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,581评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,741评论 3 271
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,684评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,122评论 2 292
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,847评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,441评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,939评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,333评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,783评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,275评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,830评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,444评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,553评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,618评论 2 249

推荐阅读更多精彩内容

  • 什么是 JavaScript 语言? JavaScript 是一种轻量级的脚本语言。所谓“脚本语言”(script...
    oWSQo阅读 1,777评论 0 1
  • 本章内容 语法 数据类型 流控制语句 理解函数 3.1 语法 3.1.1 区分大小写 区分大小写 3.1.2 标识...
    闷油瓶小张阅读 651评论 0 0
  • 1、标识符 标识符是指变量、函数、属性的名字,或函数的参数。 格式规则: 第一个字符必须是一个字母、下划线(_)或...
    霜天晓阅读 646评论 0 0
  • 第1章 JavaScript 简介 JavaScript 具备与浏览器窗口及其内容等几乎所有方面交互的能力。 欧洲...
    力气强阅读 1,063评论 0 0
  • 午休时间在家,开着空调,坐在飘窗上,贪婪地看书,很是惬意
    大树的孩子阅读 207评论 0 0