JavaScript:函数也是对象吗?

2,253 阅读2分钟

对象和原始类型

对象:
多个键值对集合。

原始类型:
一个键值对。

var person = {
    name: 'Brynn',
    age:'20'
};
var pen = 'pilot';

这里的person是一个对象,有两个键值对,第二个的键是age,值是20
而pen是一个原始类型

函数/数组也是对象

在JS中见到的所有,不是对象,就是原始类型。
数组是一个对象,是一个键被省略的对象。

从第一个name/value pair开始,name依次被定义为0、1、2...可以看这个例子:

var animal = ['cat', 'dog','bat'];

你可以理解成下面这样

    var animalCopy = {
        '0': 'cat',
        '1': 'dog',
        '2': 'bat'
    };

函数也是一个对象,只不过比较特殊。
对象就是多个键值对的集合,把一个键值对叫做对象的一个属性。

函数这个对象的特殊点在与,它有其他对象没有的属性,一个叫name——就是这个函数的名字,另一个叫code——就是写在花括号里的东西

    function test(){
        var city = '西安';
        console.log(`今天${city}雾霾好严重`);
    }
    test();

这个特殊的对象——函数,有name属性test,一个code属性var city = '西安'; console.log( '今天${city}雾霾好严重');
写下的不是函数,只是函数的一个属性——code。 这个属性比较特殊,它可以被调用,通过一个小括号,test()

        ------------------------可以略过,想起来就随便写的一点东西,有错误----------------------------
        所以有了first class function的概念,在JavaScriptfunction因为是一个特殊的object,它可以像一个primitive type,或者普通的object那样,赋值给变量
        var demo = function(){
            var city = '西安';
            console.log(`今天${city}雾霾好严重`);
        }
        demo();
        这里的demo就是一个object,通过小括号invoke这个object的code部分
        这个fuction没有name这个property,所以他叫匿名函数,因为我们可以通过demo找到它,它不需要name这个property了,当然你也可以写出来
        var demo = function demo2(){
            var city = '西安';
            console.log(`今天${city}雾霾好严重`);
        }
        demo();//输出今天西安雾霾好严重
        demo2();//会报错,因为没有为demo2这个function开辟内存,只有一块内存叫demo
        顺带一提,上面的这种写法叫function expression,而上面的上面的那种写法叫function statement
        区别在于有没有返回值,在chrome的控制台中敲下这些:
        function test(){
            var city = '西安';
            console.log(`今天${city}雾霾好严重`);
        }
        然后回车,什么都没有,没有返回值,这是statement
        而敲下这些:
        var demo = function(){
            var city = '西安';
            console.log(`今天${city}雾霾好严重`);
        }
        会返回一个demo,因为 = 是一个运算符,它有一个返回值,这是expression
        

原始类型

原始类型有六种: boolean、number、string、null、undefined以及ES6提出的symbol。(注意首字母都是小写的)

1.关于undefined和null:不要使用var a = undefined;这样的语句,undefined是JavaScript引擎对所有变量赋的初始值,如果要表示一个变量的值为空,可以用var a = null;,这样可以区别是开发者自己定义的值还是JavaScript引擎赋初始值的