美文网首页
《javaScript高级程序设计》读书笔记(四)

《javaScript高级程序设计》读书笔记(四)

作者: Carpon39038 | 来源:发表于2018-07-01 17:12 被阅读0次

    以下内容可能存在个人理解的部分,并非完全参照原文

    如有疑问,请以书中内容为准

    接着上一篇的内容

    3.6 语句

    大部分和其他语言差不多

    只需要注意ECMAScript没有块级作用域

    var count = 10;
    for(var i = 0; i < count; i++) {
        alert(i);
    }
    alert(i); // 10
    

    {}声明的变量可以在外部访问到

    3.7 函数

    理解参数

    ECMAScript函数的参数与大多数其他语言不同。

    ECMAScript函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型。即便你定义的函数只接受两个参数,在调用时也未必一定要传递两个参数。

    原因是ECMAScript中的参数在内部是用一个数组来表示的。函数接收到的始终都是这个数组,而不关心数组中包含哪些参数。

    实际上,在函数体内可以通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个参数。

    arguments对象与数组类似(但不是Array的实例),可以使用[]来访问他的每一个元素,使用length属性来确定传递进来多少个参数。

    可以这样

    function doAdd() {
        if(arguments.length == 1) {
            alert(arguments[0] + 10);
        } else if (arguments.length == 2) {
            alert(arguments[0] + arguments[1]);
        }
    }
    doAdd(10);      // 20
    doAdd(20,30);   // 50
    

    关于arguments的行为,还有一点比较有意思。那就是它的值永远与对应命名参数的值保持同步。

    但是如果那个命名参数没有传入值,使用arguments设置的值将不会反映到命名参数中

    function doAdd(num1,num2){
        arguments[1] = 10;
        alert(arguments[0] + num2);
    }
    test(1)     // NaN -- 1 + undefined
    test(1,2)   // 11
    

    没有重载

    定义两个同名函数,则该名字只属于后定义的函数。

    第四章 变量、作用域和内存问题

    JavaScript变量松散类型的本质,决定了它只是在特定事件用于保存特定值的一个名字而已。

    4.1 基本类型和引用类型的值

    基本类型值指的是简单的数据段,有UndefinedNullBooleanNumberString

    引用类型值指那些可能由多个值构成的对象

    JavaScript不允许直接访问内存中的位置

    ECMAScipt中的字符串是以基本类型来表示的,而不是对象

    动态的属性

    我们只能给对象添加属性

    var person = new Object();
    person.name = "Nicholas";
    alert(person.name);     // "Nicholas"
    

    如果我们给基本类型添加属性,将不会起作用

    var name = "Nicholas";
    name.age = 27;      // 不会报错
    alert(name.age);    // Undefined
    

    复制变量值

    如果从一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上。

    var num1 = 5;
    var num2 = num1;
    num1 -= 1;
    console.log(num2); // 5
    

    对原来值的修改不会影响到新的值,同理对新值的修改也不会影响到原来的变量。

    当从一个变量向另一个变量复制引用类型的值时,也会将变量对象中的值复制一份给新变量,但这个值的副本实际上是一个指针,这个指针指向存储在堆中的一个对象。两个变量实际上将引用同一个对象。

    var obj1 = new Object();
    var obj2 = obj1;
    obj1.name = "Nicolas";
    alert(obj2.name);   // "Nicolas"
    

    改变其中一个变量,就会影响另外一个变量。

    传递参数

    ECMAScript中所有函数的参数都是按值传递的。

    为了证明对象是按值传递的,看例子:

    function setName(obj) {
        obj.name = "Nicholas";
        obj = new Object();
        obj.name = "Greg";
    }
    var person = new Object();
    setName(person);
    alert(person.name);     // "Nicholas"
    

    原来的obj指向person对象,并添加了一个name属性。但第二行obj指向了一个新声明的对象。如果参数是引用传递的,那么外部的person会指向这个新的对象,但从结果来看,person并没有指向这个新的对象。

    实际上,在函数内部重写obj时,这个变量引用的是一个局部对象,会在执行完毕后被销毁。

    检测类型

    虽然在检测基本类型时typeof是非常得力的助手,但在检测引用类型的值时,这个操作符的用处不大。

    为此,ECMAScript提供了instanceof操作符

    判断一个数组用instanceof,正则表达式也可以

    相关文章

      网友评论

          本文标题:《javaScript高级程序设计》读书笔记(四)

          本文链接:https://www.haomeiwen.com/subject/mjqhuftx.html