上书房之JavaScript(Part1)

第一章 JavaScript概述

1.1 什么是JavaScript

JavaScript是一种具有面向对象能力、解释型的客户端脚本设计语言。JavaScript不需要再一个语言环境下运行,而只需要支持它的浏览器即可。它的主要目的是验证发往服务器的数据、增加Web互动、加强用户体验。

1.2 JavaScript的特点

松散性
JavaScript语言核心与C、C++、Java相似,比如条件判断、循环、运算符等,但它却是一种松散类型的语言,也就是说,它的变量不必具有一个明确的类型。
对象属性
JavaScript中的对象把属性名映射为任意的属性值,类似于哈希表或关联数组。
继承机制
JavaScript中的面向对象继承机制是基于原型的,这和C++以及Java中的集成大不相同。

1.3 JavaScript的历史

1995年,Netscape(网景)公司为解决类似于“向服务器提交数据之前验证”的问题,与Sun公司联手开发一个名为LiveScript的脚本语言,后期为了营销便利,更名为JavaScript。之后随着互联网的普及浏览器的发展,Firefox、Google Chrome、Safari等主流的浏览器对JavaScript的支持也达到了极致,使得JavaScript得到了飞速的发展,如今JavaScript已是各种浏览器默认支持的脚本语言。

第二章 JavaScript使用

JavaScript 必需嵌入到 HTML 文档,才能被浏览器解释和执行。将 JavaScript 脚本嵌入到 HTML 文档中有3种标准方法:

2.1 通过 <script> 标签嵌入

通过 <script> 标签嵌入JavaScript代码时,必需将代码放在 <script> 和 </script> 标记对之间。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
    </head>
    <script>
        document.write("这是通过<script>标签嵌入的代码");
    </script>
    <body>
        
    </body>
</html>

浏览器载入HTML文档时,会识别 <script> 标签,执行其中的 JavaScript 代码,然后将结果返回并在浏览器窗口显示。

2.2 引入外部脚本

当网页功能比较复杂,或通用代码(每个页面都是用)较多时,直接在 <script> 标签中嵌入 JavaScript 代码会导致网页杂乱,不易管理。这时候,我们希望能将JavaScript代码保存在单独的文件中,使用时再嵌入到 HTML 文档。
可以通过 <script> 标签的 src 属性可引入外部文件。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
    </head>
    <script src="../script/demo.js"></script>
    <body>
        
    </body>
</html>

引入外部脚本,能够很轻松的让多个页面使用相同的 JavaScript 代码。外部脚本一般会被浏览器保存在缓存文件中,用户再次访问网页时,无需重新载入,加快了网页打开速度。

2.3 在 HTML 属性中直接嵌入

在 HTML 属性中嵌入 JavaScript 代码主要是针对 JavaScript 事件。JavaScript 事件是指用户对网页进行操作时,网页做出相应的响应。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
    </head>
    <body>
        <button onclick="alert('你点击了按钮!')">点击我</button>
    </body>
</html>

第三章 语法、关键保留字及变量

3.1 语法构成

区分大小写
JavaScript语言是区分大小写的,text和Text表示不同的两个变量。
标识符
标识符就是指变量、属性的名字,或者函数的参数。标识符可以是可以格式规则组合起来的一个或多个字符。

  • 第一个字符必须是一个字母、下划线或者$符
  • 其他字符可以是字母、下划线、$符或者数字
  • 不能把关键字、保留字、true、false和null作为标识符

注释
JavaScript使用C语言的注释风格,分为单行注释和多行注释。
单行注释以 // 开头
多行注释以 /* 开始,以 */ 结尾
字面量
所谓字面量,就是指程序中直接显示出来的数据值。例如:
100 //数据字面量
“张强” //字符串字面量
false //布尔值字面量
null //对象字面量
{x:1, y:2} //对象字面量表达式
[1,2,3,4,5] //数组字面量表达式

3.2 关键字保留字

JavaScript描述了一组具有特定用途的关键字和保留字,一般用于控制语句的开始或结束,或用于执行特定的操作等,这些关键字和保留字不能用作标识符。

关键字保留字

3.3 变量

JavaScript变量是松散型的,所谓松散类型就是用来保存任何数据的类型。定义变量时要使用var操作符(var是关键字),后面跟一个变量名(变量名是标识符)。
var name;
alert(name); //undefined
var name = “Johnny”;
alert(name); //Johnny
变量是一个可以改变的标识符,声明并赋值后,可以改变它的值。

第四章 数据类型

JavaScript有5种简单的数据类型:Undefined、Null、Boolean、Number、String。还有一种复杂数据类型——object。JavaScript不支持任何创建自定义类型的机制。所有值都是以上6种数据类型之一。

4.1 Typeof操作符

typeof操作符是用来检测变量的数据类型,对于值或者变量使用typeof操作符会返回如下字符串:

变量定义 typeof操作符 返回值
var x; typeof(x); undefined
var x = 1; typeof(x); number
var x = true; typeof(x); boolean
var x = “johnny”; typeof(x); string
var x = new object(); typeof(x); object

4.2 Undefined类型

Undefined是一种特殊的数据类型,指的已声明但没有赋值的变量对应的类型。Undefined类型主要目的是为了作比较,引入Undefined类型是为了区分空对象与未初始化的变量,所以,未初始化的变量与根据不存在的变量是不一样的。
实例:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
    </head>
    <script>
        var sex;
        document.write(sex);
        document.write(college);
    </script>
    <body>
        
    </body>
</html>

PS: 在实际项目中,声明一个变量的时候,就必须初始化。

    <script>
        var customerName = "";  //字符串变量的初始值一般为空
        var total = 0;  //数字类型的初始值一般为0
        var success = false;    //布尔值类型的初始值一般的false
        var car = null; //对象类型的初始值一般为null;
    </script>

4.3 Null类型

Null类型是一个只有一个值的数据类型,即特殊值null,他表示一个空对象引用。当时用typeof检测null时,返回值为object。
如果定义的变量将来准备用于保存对象,那么最好在定义变量的时候将其初始化为null。这样,当检查null值就知道变量是否已经分配了对象引用了。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
    </head>
    <script>
        var car = null;
        if(car != null){
            document.write("对象已赋值");
        }else{
            document.write("对象尚未初始化");
        }
    </script>
    <body>
        
    </body>
</html>

4.4 Boolean类型

Boolean类型有两个值:true和false。它用于条件判断时使用。
实例:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
    </head>
    <script>
        var success = true;
        if(success){
            document.write("submit success.");
        }else{
            document.write("submit failed.");
        }
        
        var x = 3;
        var y = 3;
        if(x === y){
            document.write("x is equal to y.");
        }else{
            document.write("x is not equal to y.");
        }
    </script>
    <body>
        
    </body>
</html>

4.5 Number类型

Number类型包含两中数值,整数和浮点数。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
    </head>
    <script>
        var total = 100;
        var score = 90.5;
         document.write(typeof(total));
         document.write(typeof(score));
    </script>
    <body>
        
    </body>
</html>

判断是否为数字类型——isNaN
精确到小数点后几位——toFixed()
转为字符串类型——toString()

4.6 String类型

String类型用于表示由零或多个字符组成的字符序列,即字符串。字符串可以由双引号("")或单引号('')表示。
var customerName = "Johnny";
var customerName = 'Johnny';
String类型包含了一些特殊的字符字面量,也叫转义字符。

字面量 含义
\n 换行
\t 制表
\b 空格
\r 回车
\f 进纸
\ 斜杠
' 单引号
" 双引号

JavaScript中的字符串是不可改变的,字符串一旦被创建,它的值就不能在被修改。如果要修改一个字符串变量的值,首先要销毁原来的字符串,然后再新创建一个字符串来填充该变量。
使用toString()方法可将数字类型的值转为字符串类型。

4.7 Object类型

JavaScript中的对象其实就是一组数据和功能的集合。对象可以通过执行new操作符后跟要创建的对象类型的名称来创建。在第八章中,我们会用专门的章节来介绍JavaScript的对象类型。

第五章 运算符

5.1 什么是表达式

表达式是JavaScript中的一个“短语”,解释器会通过计算把它转换成一个值。表达式分为简单表达式和复杂表达式,简单表达式就是字面量或者变量名;复杂表达式是通过合并简单的表达式来创建的一种表达式。

简单表达式 说明
5.96 数值字面量
'Lee' 字符串字面量
True 布尔值字面量
null 空值字面量
{x:1, y:2} 对象字面量、对象表达式
[1,2,3] 数组字面量、数组表达式
function(n) {return x+y;} 函数字面量、函数表达式
box 变量
复杂表达式 说明
box + 5.96 加法运算的表达式
typeof(box) 查看数据类型的表达式
box > 8 逻辑运算表达式

通过上面的叙述,我们得知,单一的字面量和组合字面量的运算符都可称为表达式。

5.2 一元运算符

只能操作一个值的运算符叫做一元运算符。
递增++和递减--
var count = 10;
count++; //相当于count = count + 1;
count--; //相当于count = count - 1;
前置和后置的区别
var count = 10;
++count; //相当于count = count + 1;
--count; //相当于count = count - 1;
var result1 = count++; //先赋值,后自增
var result2 = ++count; //先自增,后赋值
前置和后置的区别
var count = 10;

5.3 算术运算符

JavaScript定义了5个算术运算符,加、减、乘、除、求模(取余)。如果在算术运算的值不是数值,那么后台会先使用Number()转型函数将其转换为数值(隐式转换)。
(1) 加法
var x= 1 + 2;
(2) 减法
var x = 2 - 1;
(3) 乘法
var x = 2 * 1;
(4) 除法
var x = 6 / 3;
(5) 求模
var x = 6 % 3;

5.4 关系运算符

用于进行比较的运算符称作为关系运算符,JavaScript中有8中关系运算符:小于(<)、大于(>)、小于等于(<=)、大于等于(>=)、相等(==)、不等(!=)、 恒等(===)、不恒等(!==)。
和其他运算符一样,当关系运算符操作非数值时要遵循一下规则:

  • 两个操作数都是数值,则数值比较
  • 两个操作数都是字符串,则比较两个字符串对应的字符编码值
  • 两个操作数有一个是数值,则将另一个转换为数值,再进行数值比较
  • 两个操作数有一个是对象,则先调用valueOf()方法或toString()方法,再用结果比较

相等(==)和恒等(===)的区别:
相等(==):值相等即可
恒等(===):值和类型必须都相同
不等(!=):值不相同即可
不恒等(!==):值或类型不相等

5.5 逻辑运算符

逻辑运算符通常用于布尔值的操作,一般和关系运算符配合使用,有三个逻辑运算符:逻辑与(&&)、逻辑或(||)、逻辑非(!)。
(1) 逻辑与(&&)
var result = (5 > 4) && (4 > 3); //true,两边都为true,返回true

第一个操作数 第二个操作数 结果
true true true
true false false
false true false
false false false
(2) 逻辑与
var box = (9 > 7) (7 > 8); //true,两边只要有一边是true,返回true
第一个操作数 第二个操作数 结果
----------- ----------- ----
true true true
true false true
false true true
false false false

(3) 逻辑非(!)
逻辑非运算符可以用于任何值。无论这个值是什么数据类型,这个运算符都会返回一个布尔值。它的流程是:先将这个值转换成布尔值,然后取反,规则如下:

  • 操作数是一个对象,返回false;
  • 操作数是一个空字符串,返回true;
  • 操作数是一个非空字符串,返回false;
  • 操作数是数值0,返回true;
  • 操作数是任意非0数值(包括Infinity),false;
  • 操作数是null,返回true;
  • 操作数是NaN,返回true;
  • 操作数是undefined,返回true;

5.6 赋值运算符

赋值运算符用等于号(=)表示,就是把右边的值赋给左边的变量。

var box = 100;  //把100赋值给box变量

复合赋值运算符通过x=的形式表示,x表示算术运算符。

var box = 100;
box = box +100;  //200,自己本身再加100

这种情况可以改写为:

var box = 100;
box += 100;  //200,+=代替box+100

除了这种+=加/赋运算符,还有其他的几种如下:

  • 乘/赋(*=)
  • 除/赋(/=)
  • 模/赋(%=)
  • 加/赋(+=)
  • 减/赋(-=)

5.7 其他运算符

(1) 字符串运算符
字符串运算符只有一个,即:"+"。它的作用是将两个字符串相加。
规则:至少一个操作数是字符串即可。

var x = '100' + '100';  //100100
var y = '100' + 100;        //100100
var z = 100 + 100;      //200

(2) 三元运算符
三元条件运算符其实就是后面将要学到的if语句的简写形式。

var x = 5 > 4 ? 'Y' : 'N';

第六章 流程控制

6.1 if语句

if 语句即条件判断语句,一共有三种格式:
(1) if (条件表达式) 语句;

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
    </head>
    <script>
        var age = 18;
        if(age >= 18){
            alert("成年人。");
        }
    </script>
    <body>
        
    </body>
</html>

(2) if (条件表达式) {语句;} else {语句;}

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
    </head>
    <script>
        var age = 18;
        if(age >= 18){
            alert("成年人。");
        }else{
            alert("未成年人。");
        }
    </script>
    <body>
        
    </body>
</html>

(3) if (条件表达式) {语句;} else if (条件表达式) {语句;} ... else {语句;}

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
    </head>
    <script>
        var score = 90;
        if(score >= 85){
            alert("优秀");
        }else if(score >= 75){
            alert("良好");
        }else if(score >= 60){
            alert("及格");
        }else{
            alert("不及格");
        }
    </script>
    <body>
        
    </body>
</html>

6.2 switch语句

switch语句是多重条件判断,用于多个值相等的比较。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
    </head>
    <script>
        var day = new Date().getDay();
        switch(day){
            case 0:
                alert("Today is Sunday");
                break;
            case 1:
                alert("Today is Monday");
                break;
            case 2:
                alert("Today is Tuesday");
                break;
            case 3:
                alert("Today is Wednesday");
                break;
            case 4:
                alert("Today is Thursday");
                break;
            case 5:
                alert("Today is Friday");
                break;
            case 6:
                alert("Today is Saturday");
                break;  
            default:
                alert("error");
                break;
        }
    </script>
    <body>
        
    </body>
</html>

6.3 do...while语句

do...while语句是一种先运行,后判断的循环语句。也就是说,不管条件是否满足,至少先运行一次循环体。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
    </head>
    <script>
        var x = 10;
        do{
            alert(x);
            x++;
        }while(x <= 5)
    </script>
    <body>
        
    </body>
</html>

6.4 while语句

while语句是一种先判断,后运行的循环语句。也就是说,必须满足条件了之后,方可运行循环体。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
    </head>
    <script>
        var x = 10;
        while(x <= 5){
            alert("x");
            x++;
        }
    </script>
    <body>
        
    </body>
</html>

6.5 for语句

for语句也是一种先判断,后运行的循环语句。但它具有在执行循环之前初始变量和定义循环后要执行代码的能力。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
    </head>
    <script>
        for(var i=0; i<5; i++){
            alert(i);
        }
    </script>
    <body>
        
    </body>
</html>

6.6 for...in语句

for...in语句是一种精准的迭代语句,可以用来枚举对象的属性。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
    </head>
    <script>
        var car = {
            "名称": "奔驰",
            "型号": "GLC300",
            "颜色": "白色"
        };
        for(var p in car){
            alert(p);
        }
    </script>
    <body>
        
    </body>
</html>

6.7 break和continue语句

break和continue语句用于在循环中精确地控制代码的执行。其中,break语句会立即退出循环,强制继续执行循环体后面的语句。而continue语句退出当前循环,继续后面的循环。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
    </head>
    <script>
        for(var i=0; i<10; i++){
            document.write(i+"<br>");
            if(i === 5){
                document.write("退出循环"+"<br>");
                break;
            }
        }
        document.write("循环执行完成");
    </script>
    <body>
        
    </body>
</html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
    </head>
    <script>
        for(var i=0; i<10; i++){
            if(i === 5){
                document.write("跳过本次循环"+"<br>");
                continue;
            }
            document.write(i+"<br>");
        }
        document.write("循环执行完成");
    </script>
    <body>
        
    </body>
</html>

第七章 函数

函数是定义一次但却可以调用或执行任意多次的一段JS代码。函数有时会有参数,即函数被调用时指定了值的局部变量。函数常常使用这些参数来计算一个返回值,这个值也成为函数调用表达式的值。

7.1 函数声明

函数对任何语言来说都是一个核心的概念。通过函数可以封装任意多条语句,而且可以在任何地方、任何时候调用执行。JavaScript中的函数使用function关键字来声明,后跟一组参数以及函数体。

    <script>
        function showMessage(){
            alert("shwo message function be called.");
        }
        showMessage();
    </script>
    <script>
        function showMessage(name, age){
            alert("Your name:" + name + ", age:" + age);
        }
        showMessage("Johnny",30);
    </script>

7.2 return返回值

带参数和不带参数的函数,都没有定义返回值,而是调用后直接执行的。实际上,任何函数都可以通过return语句跟后面的要返回的值来实现返回值。

    <script>
        function getMessage(){
            return "shwo message function be called.";
        }
        
        var msg = getMessage();
        alert(msg);
    </script>
    <script>
        function getMessage(name, age){
            return "Your name:" + name + ", age:" + age;
        }
        
        var msg = getMessage("Johnny",30);
        alert(msg);
    </script>

return语句还有一个功能就是退出当前函数,注意和break的区别(break用在循环和switch分支语句里)。

    <script>
        function getMessage(name, age){
            if(name === "马云"){
                return "哇塞,阿里巴巴创始人,首富啊!"+ "年龄:" + age;
            }
            return "你的名字: " + name + ", 年龄: " + age;
        }
        
        var msg = getMessage("马云",50);
        alert(msg);
    </script>

7.3 arguments对象

JavaScript函数可以不定义参数,可以在函数体内可以通过arguments对象来接收传递进来的参数(不常用)。

    <script>
        function getMessage(){
            if(arguments[0] === "马云"){
                return "哇塞,阿里巴巴创始人,首富啊!"+ "年龄:" + arguments[1];
            }
            return "你的名字: " + arguments[0] + ", 年龄: " + arguments[1];
        }
        
        var msg = getMessage("张强",30);
        alert(msg);
    </script>

第八章 对象和数组

JavaScript对象,其实就是一种类型,即引用类型。而对象的值就是引用类型的实例。在JavaScript中引用类型是一种数据结构,用于将数据和功能组织在一起。它也常被称为类,但JavaScript中却没有这种东西。虽然JavaScript是一门面向对象的语言,却不具备传统面向对象语言所支持的类和接口等基本结构。
JavaScript中所有的类型都是对象。

8.1 Object对象

到目前为止,我们使用的引用类型最多的可能就是Object类型了。虽然Object的实例不具备多少功能,但对于在应用程序中的存储和传输数据而言,它确实是非常理想的选择。JavaScript 中的所有事物都是对象:字符串、数值、数组、函数等等,此外,JavaScript 允许自定义对象。

8.1.1 创建Object

创建Object类型有三种方式。
(1) 使用new运算符创建Object

<script>
  var car = new Object();       //使用new方式创建对象
  car.name = "Mercedes Benz";   //创建属性字段
  car.model = "GLC 300";        //创建属性字段
  car.color = "White";      //创建属性字段
</script>

(2) 使用字面量方式创建Object

<script>
  var car = {
    name: "Mercedes Benz",
    model: "GLC 300",
    color: "White"
  };
</script>
<script>
  var car = {
    "name": "Mercedes Benz", //属性字段也可以使用字符串形式
    "model": "GLC 300",
    "color": "White"
  };
</script>
<script>
  var car = {}; //使用字面量及传统赋值方式,字面量声明为空对象
  car.name = "Mercedes Benz";
  car.model = "GLC 300";
  car.color = "White";
</script>

(3) 使用构造函数方式

<script>
  function car(name, model, color){
    this.name = name;
    this.model = model;
    this.color = color;
  }
</script>

8.1.2 定义Object属性

JavaScript可以为对象定义三种类型的属性:私有属性、实例属性和类属性。
(1) 私有属性的定义
私有属性只能在构造函数内部定义与使用。

<script>
  function car(name, model, color){
    this.name = name;
    this.model = model;
    this.color = color;
    
    var msg = "品牌:" + car.name + "\n型号:" + car.model + "\n颜色:" + car.color;
  }
  var car = new car("Mercedes Benz", "GLC 300", "White");
  alert("您的爱车:" + car.name + "\n型号:" + car.model + "\n颜色:" + car.color);
  alert(car.showMsg()); //undefined
</script>

(2) 实例属性的定义
实例属性定义,也存在两种方式:prototype方式(原型方式)和this方式。实例属性必须通过对象的实例进行引用
prototype方式(原型方式):functionName.prototype.propertyName=value;

<script>
  function car(name, model, color){
    car.prototype.name = name;
    car.prototype.model = model;
    car.prototype.color = color;
  }
  var car = new car("Mercedes Benz", "GLC 300", "White");
  alert("您的爱车:" + car.name + "\n型号:" + car.model + "\n颜色:" + car.color);
</script>

this方式:this.propertyName=value;

<script>
  function car(name, model, color){
    this.name = name;
    this.model = model;
    this.color = color;
  }
  var car = new car("Mercedes Benz", "GLC 300", "White");
  alert("您的爱车:" + car.name + "\n型号:" + car.model + "\n颜色:" + car.color);
</script>

(3) 类属性的定义
类属性可以直接通过类名进行引用。

<script>
  function car(){};
  car.name = "Mercedes Benz";
  car.model = "GLC 300";
  car.color = "White";
  alert("您的爱车:" + car.name + "\n型号:" + car.model + "\n颜色:" + car.color);
</script>

8.1.3 取得Object的属性

取得Object属性值也有两种方式:
(1) 使用.运算符(常用)

<script>
  var car = {}; //使用字面量及传统赋值方式,字面量声明为空对象
  car.name = "Mercedes Benz";
  car.model = "GLC 300";
  car.color = "White";
  alert("您的爱车:" + car.name + "\n型号:" + car.model + "\n颜色:" + car.color);
</script>

<script>
  function car(name, model, color){
    this.name = name;
    this.model = model;
    this.color = color;
  }
  var car = new car("Mercedes Benz", "GLC 300", "White");
  alert("您的爱车:" + car.name + "\n型号:" + car.model + "\n颜色:" + car.color);
</script>

(2) 使用[ ]运算符

<script>
  var car = {}; //使用字面量及传统赋值方式,字面量声明为空对象
  car.name = "Mercedes Benz";
  car.model = "GLC 300";
  car.color = "White";

  alert("您的爱车:" + car["name"] + "\n型号:" + car["model"] + "\n颜色:" + car["color"]);
</script>

8.1.4 创建Object的方法

JS中可以为对象定义三种类型的方法:私有方法、实例方法和类方法,与Java类似:
 私有方法只能在对象内部使用
 实例方法必须在对象实例化后才能使用
 类方法可以直接通过类名去使用
(1) 私有方法
私有方法必须在构造函数体内定义,而且只能在构造函数体内使用。

<script>
  function car(name, model, color){
    this.name = name;
    this.model = model;
    this.color = color;
    
    function getCar(){
      return "品牌:" + name + "\n型号:" + model + "\n颜色:" + color;
    }
    this.carInfo = getCar();
  }
  
  var carObj = new car("Mercedes Benz", "GLC 300", "White");
  alert(carObj.carInfo);
</script>

(2) 实例方法
实例方法必须在对象实例化后才能使用。定义实例方法有两种方式:prototype方式(原型方式)和this方式。
prototype方式(原型方式)

<script>
  function car(name, model, color){
    car.prototype.name = name;
    car.prototype.model = model;
    car.prototype.color = color;
    
    car.prototype.getCarInfo = function(){
      return "品牌:" + name + "\n型号:" + model + "\n颜色:" + color;
    }
  }
  var car = new car("Mercedes Benz", "GLC 300", "White");
  alert(car.getCarInfo());
</script>

this方式

<script>
  function car(name, model, color){
    this.name = name;
    this.model = model;
    this.color = color;
    
    this.getCarInfo = function(){
      return "品牌:" + name + "\n型号:" + model + "\n颜色:" + color;
    }
  }
  var car = new car("Mercedes Benz", "GLC 300", "White");
  alert(car.getCarInfo());
</script>

(3) 类方法
类方法需要在构造函数外面定义,可以直接通过构造函数名对其进行引用。

<script>
  function car(){};
  car.getCarInfo = function(name, model, color){
    return "品牌:" + name + "\n型号:" + model + "\n颜色:" + color;
  }
  
  alert(car.getCarInfo("Mercedes Benz", "GLC 300", "White"));
</script>

8.2 Array数组

除了Object类型之外,Array类型是JavaScript最常用的类型。而且JavaScript中的Array类型和其他语言中的数组有着很大的区别。虽然数组都是有序排列,但JavaScript中的数组每个元素可以保存任何类型。JavaScript中数组的大小也是可以调整的。

8.2.1 创建数组

创建Array类型有两种方式:第一种是new运算符,第二种是字面量。
(1) 使用new关键字创建数组

<script>
  var car = new Array();    //创建了一个数组
  var car = new Array(10);  //创建一个包含10个元素的数组
  var car = new Array("Mercedes Benz","BMW","LAND ROVER","Audi");   //创建一个数组并分配好了元素
</script>

(2) 使用字面量创建数组

<script>
  var car = []; //创建了一个数组
  var car = ["Mercedes Benz","BMW","LAND ROVER","Audi"];    //创建一个数组并分配好了元素
</script>

8.2.2 读取数组

读取数组可使用索引下标来读取数组的值。

<script>
  var car = new Array("Mercedes Benz","BMW","LAND ROVER","Audi");
  for(var i=0; i<car.length; i++){
    document.write(car[i]+"<br/>");
  }
</script>

8.2.3 数组中的方法

如上面所说,数组也是一种对象,所以也具有很多内置的方法。
(1) 栈方法
JavaScript数组提供了一种让数组的行为类似于其他数据结构的方法。也就是说,可以让数组像栈一样,可以限制插入和删除项的数据结构。栈是一种数据结构(后进先出),也就是说最新添加的元素最早被移除。而栈中元素的插入(或叫推入)和移除(或叫弹出),只发生在一个位置——栈的顶部。JavaScript为数组专门提供了push()pop()方法。

数组

push()方法可以接收任意数量的参数,把它们逐个添加到数组的末尾,并返回修改后数组的长度。而pop()方法则从数组末尾移除最后一个元素,减少数组的length值,然后返回移除的元素。

<script>
  var car = new Array("Mercedes Benz","BMW","LAND ROVER","Audi");
  car.push("Ford");
  alert(car.join('|'));
  car.pop();
  alert(car.join('|'));
</script>

(2) 队列方法
栈方法是后进先出,而队列方法是先进先出。队列在数组的末端添加元素,从数组的前端移除元素。通过push()向数组末端添加一个元素,然后通过shift()方法从数组前端移除一个元素。

<script>
  var car = new Array("Mercedes Benz","BMW","LAND ROVER","Audi");
  car.push("Ford");
  alert(car.join('|'));
  car.shift();
  alert(car.join('|'));
</script>

JavaScript还为数组提供了一个unshift()方法,它和shift()方法的功能完全相反。unshift()方法为数组的前端添加一个元素。

<script>
  var car = new Array("Mercedes Benz","BMW","LAND ROVER","Audi");
  car.unshift("Ford");
  alert(car.join('|'));
  car.shift();
</script>

注意:IE浏览器对unshift()方法总是返回undefined而不是数组的新长度
(3) 排序方法

<script>
  var car = new Array(2,4,5,1,3,10);
  alert(car.sort(function(a,b){
    return a-b; //升序
  }));
  
  alert(car.sort(function(a,b){
    return b-a; //降序
  }));
</script>

第九章 Function类型

在JavaScript中,Function(函数)类型实际上是对象。每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法。由于函数是对象,因此函数名实际上也是一个指向函数对象的指针。

9.1 函数的声明

(1) 普通函数的声明

<script>
  function sum(num1, num2){
    return num1 + num2;
  }
</script>

(2) 使用变量初始化函数

<script>
  var sum = function(num1, num2){
    return num1 + num2;
  }
</script>

9.2 作为值的函数

JavaScript中的函数名本身就是变量,所以函数也可以作为值来使用。也就是说,不仅可以像传递参数一样把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回。

<script>
  function getResult(sum, num){
    return sum(num);
  }
  
  function sum(num){
    return num + 10;
  }
  
  var result = getResult(sum, 10); //将sum函数作为参数传递给getResult函数
  alert(result);
</script>

9.3 函数内部属性

在函数内部,有两个特殊的对象:arguments和this。arguments是一个类数组对象,包含着传入函数中的所有参数,主要用途是保存函数参数。但这个对象还有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。

<script>
  function recursion(num) {
    if (num <= 1) {
      return 1;
    } else {
      return num * recursion(num-1); //一个简单的递归
    }
  }
  
  var result = recursion(5);
  alert(result);
</script>
<script>
  function recursion(num) {
    if (num <= 1) {
      return 1;
    } else {
      return num * arguments.callee(num-1);
    }
  }
  
  var result = recursion(5);
  alert(result);
</script>

function sum(num1, num2, num3){
  alert(arguments.length);
  return num1 + num2 + num3;
}

函数内部另一个特殊对象是this,其行为与Java和C#中的this大致相似。换句话说,this引用的是函数据以执行操作的对象,或者说函数调用语句所处的那个作用域。PS:当在全局作用域中调用函数时,this对象引用的就是window。

<script>
  window.color = "red";
  var car = {
    brand: "Mercedes Benz",
    color: "white",
    drive: function(){
      alert(this.brand + " " + this.color + " is driving."); //这里的color引用的是具备的color
    }
  };
  
  car.drive();
  alert(this.color); //这个color属性引用的是全局的color
</script>

<script>
  window.color = "red";
  window.brand = "BMW";
  var car = {
    brand: "Mercedes Benz",
    color: "white"
  };
  
  function drive () {
    alert(this.brand + " " + this.color + " is driving.");
  }
  drive(); //这里的color和brand属性引用的是全局的color和brand
  car.drive = drive;
  car.drive(); //这里的color和brand属性引用的是局部的color和brand
</script>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容