Skip to content

JavaScript

进阶

值类型和引用类型

值类型

值类型又叫基本数据类型,在 JavaScript 中值类型有以下五种:

  • 数值类型
  • 布尔类型
  • undefined
  • null
  • 字符串

值类型存储在栈(stack)中,它们的值直接存储在变量访问的位置。比如:

js
var num = 18;
var flag = true;
var un = undefined;
var nu = null;
var str = "zhangsan";

值类型的特征

值类型的值是不可变的,不可变是指值类型指向的空间不可变。比如:

js
var a = 2;
a = a + 2;
console.log(a); //打印结果为 4。

在上述例子中,a 变量指向的值变了,但是 2 的内存没有变。按值传递的变量之间互不影响。比如:

js
var a = 1;
var b = a;
a = a + 2;
console.log(a,b); // 打印结果为3,1

值类型赋值,直接将值赋值一份。比如:

js
var num1 = 1;
var num2 = num1;

当参数为值类型的时候,函数内和函数外的两个变量完全不同,仅仅只是存的值一样而已,修改时互不影响。比如:

js
function foo(num){
    num = num + 1;
}

var a = 1;
foo(a);
console.log(a); //打印结果为 1

引用类型

引用类型又叫复合数据类型,在 JavaScript 中引用类型有以下三种:

  • 对象
  • 数组
  • 函数

引用类型存储在堆中,也就是说存储在变量处的值是一个指针,指向存储对象的内存处。比如:

js
var arr = [1, 2, 3];
var p = {name:"张三", age:18};

引用类型的特征

引用类型赋值,是将地址复制一份。比如:

js
var p = {name:"zhangsan", age:18};
var p1 = p;  # p1和p中的存放的地址是一样的

当参数为引用类型的时候,函数内和函数外的两个变量不同,但是共同指向同一个对象,在函数内修改对象数据时会影响外部。比如:

js
function foo(o){
    o.age = o.age +1;
}

var p = {name:"zhangsan", age:18};

foo(p);

console.log(p.age); // 打印结果为 19。

异常处理

异常捕获

我们使用 try-catch 语句开捕获异常,语法为:

js
try{
    //这里写可能出现异常的代码
}catch(err){
    //在这里写,出现异常后的处理代码
}

例:

js
<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>

    <body>
        <input type="button" value="点击一下" onclick="message()">
        <script>
            var txt = "";

            function message() {
                try {
                    alertt("我爱学习,身体好好"); //故意把alert写错
                } catch(err) {
                    txt = "There was an error on this page.\n\n";
                    txt += "Error description: " + err.message + "\n\n";
                    txt += "Click OK to continue.\n\n";
                    alert(txt);
                }
            }
        </script>
    </body>

</html>

需要注意以下几点:

  • 语句 try 和 catch 是成对出现的。
  • 如果在 try 中出现了错误, try 里面出现错误的语句后面的代码都不再执行, 直接跳转到 catch 中,catch 处理错误信息,然后再执行后面的代码。
  • 如果 try 中没有出现错误,则不会执行 catch 中的代码,直接执行后面的代码。通过 try-catch 语句进行异常捕获之后,代码将会继续执行,而不会中断。

throw 语句

通过 throw 语句,我们可以创建自定义错误。throw 语句常常和 try catch 语句一起使用。

例子:

js
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>

    <body>
        <p>请输入 0 到 100 之间的数字:</p>
        <input id="demo" type="text">
        <button type="button" onclick="myFunction()">测试输入值</button>
        <p id="throwText"></p>
        <script>
            function myFunction() {
                try {
                    var x = document.getElementById("demo").value;
                    if(x == "") throw "您输入的值为空";
                    if(isNaN(x)) throw "您输入的不是数字";
                    if(x > 100) throw "您输入的值太大";
                    if(x < 0) throw "您输入的值太小";
                } catch(err) {
                    var y = document.getElementById("throwText");
                    y.innerHTML = "错误提示:" + err + "。";
                }
            }
        </script>
    </body>

</html>