0%

JavaScript学习

  1. 数组 []
    JavaScript的数组可以包括任意数据的类型(用逗号分隔&&是否可以不分???索引从0开始,索引超出范围用undefined表示)

  2. 对象
    JavaScript的对象是一组由键-值对组成的无序集合。

    JavaScript的对象用于描述现实世界的某个对象。例如,为了描述某个人,我们可以用若干键值对来描述他:

    1
    2
    3
    4
    5
    6
    7
    var person = {
    name : 'Hth',
    age : 23,
    height : 1.63,
    city : 'Chengdu',
    zipcode : null
    }
1
2
3
4
5
6
7
8
9
10
   
想要获取一个对象属性的值,我们用`person.name`的形式(和Java一样???)

访问属性是通过`.`操作符完成的,但这要求属性名必须是一个有效的变量名。如果属性名包含特殊字符,就必须 用`''`括起来:

```javascript
var xiaohong = {
name : 'xiaohong',
'middle-school' : 'No.1 Middle School'
}

xiaohong的属性名middle-school不是一个有效的变量,就需要用''括起来。访问这个属性也无法使用.操作符,必须用['xxx']来访问:

1
2
3
xiaohong['middle-school']; // 'No.1 Middle School'
xiaohong['name']; // '小红'
xiaohong.name; // '小红'

由于JavaScript的对象是动态类型,你可以自由地给一个对象添加或删除属性:

1
2
3
4
5
6
7
8
9
10
11
var xiaoming = {
name: '小明'
};
xiaoming.age; // undefined
xiaoming.age = 18; // 新增一个age属性
xiaoming.age; // 18
delete xiaoming.age; // 删除age属性
xiaoming.age; // undefined
delete xiaoming['name']; // 删除name属性
xiaoming.name; // undefined
delete xiaoming.school; // 删除一个不存在的school属性也不会报错

如果我们要检测xiaoming是否拥有某一属性,可以用in操作符('toString' in xiaoming;)(但是这个属性可能是对象继承得到的)。要判断一个属性是否是xiaoming自身拥有的,而不是继承得到的,可以用hasOwnProperty()方法:xiaoming.hasOwnProperty('toString');

  1. 变量 (变量名也可以用中文,但是,请不要给自己找麻烦)

    变量在JavaScript中就是用一个变量名表示,变量名是大小写英文、数字、$_的组合,且不能用数字开头。变量名也不能是JavaScript的关键字,如ifwhile等。申明一个变量用var语句,比如:

    1
    2
    3
    4
    5
    var a; // 申明了变量a,此时a的值为undefined
    var $b = 1; // 申明了变量$b,同时给$b赋值,此时$b的值为1
    var s_007 = '007'; // s_007是一个字符串
    var Answer = true; // Answer是一个布尔值true
    var t = null; // t的值是null

    在同一个页面的不同的JavaScript文件中,如果都不用var申明,恰好都使用了变量i,将造成变量i互相影响,产生难以调试的错误结果。

    使用var申明的变量则不是全局变量,它的范围被限制在该变量被申明的函数体内(函数的概念将稍后讲 解),同名变量在不同的函数体内互不冲突。

  2. ${ }用法可以简化拼接字符串的烦恼

  3. 函数
    廖雪峰讲函数那里讲的太好了!!!
    本质上说,函数就是最基本的一种代码抽象的方式。像Σ(n+1)一样,我们不用关心n+1的计算过程,只需要在更高的层次去思考东西。
    定义函数
    function去定义函数,如:

    1
    2
    3
    4
    5
    6
    7
    function abs(x) {   //function指出这是一个函数定义;函数名称是abs;x是函数的参数,多个参数以                           逗号,分隔
    if (x >= 0) {
    return x;
    } else {
    return -x; //请注意,函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕, 并将结果返回。因此,函数内部通过条件判断和循环可以实现非常复杂的逻辑。
    }
    }

    第二种定义方式

    1
    2
    3
    4
    5
    6
    7
    var abs = function (x) {   //在这种方式下,function (x) { ... }是一个匿名函数,它没有函数名。但是,这个匿名函数赋值给了变量abs,所以,通过变量abs就可以调用该函数。上述两种定义完全等价,注意第二种方式按照完整语法需要在函数体末尾加一个分号;,表示赋值语句结束。
    if (x >= 0) {
    return x;
    } else {
    return -x;
    }
    };

    调用函数
    没啥讲的

    高阶函数 https://www.liaoxuefeng.com/wiki/1022910821149312/1023021271742944****
    map() reduce() filter() sort()

    every()方法可以判断数组的所有元素是否满足测试条件。

    find()方法用于查找符合条件的第一个元素,如果找到了,返回这个元素,否则,返回undefined
    forEach()map()类似,它也把每个元素依次作用于传入的函数,但不会返回新的数组。forEach()常用于遍历数组,因此,传入的函数不需要返回值。

    箭头函数(Arrow Function)

    x=>x+x 相当于 function(x){return x+x;}

    箭头函数相当于匿名函数,并且简化了函数定义。箭头函数有两种格式,一种像上面的,只包含一个表达式,连{ ... }return都省略掉了。还有一种可以包含多条语句,这时候就不能省略{ ... }return

    1
    2
    3
    4
    5
    6
    7
    8
    x => {
    if (x > 0) {
    return x * x;
    }
    else {
    return - x * x;
    }
    }

如果参数不是一个,就需要用括号()括起来:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 两个参数:
(x, y) => x * x + y * y

// 无参数:
() => 3.14

// 可变参数:
(x, y, ...rest) => {
var i, sum = x + y;
for (i=0; i<rest.length; i++) {
sum += rest[i];
}
return sum;
}

如果要返回一个对象,就要注意,如果是单表达式,这么写的话会报错:

1
2
// SyntaxError:
x => { foo: x }

因为和函数体的{ ... }有语法冲突,所以要改为(用括号将{}包起来):

1
2
// ok:
x => ({ foo: x })
  1. 面向对象编程
    JavaScript的原型链和Java的Class区别就在,它没有“Class”的概念,所有对象都是实例,所谓继承关系不过是把一个对象的原型指向另一个对象而已。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var Student = {
    name: 'Robot',
    height: 1.2,
    run: function () {
    console.log(this.name + ' is running...');
    }
    };

    var xiaoming = {
    name: '小明'
    };

    xiaoming.__proto__ = Student;

    注意最后一行代码把xiaoming的原型指向了对象Student,看上去xiaoming仿佛是从Student继承下来的:

    1
    2
    xiaoming.name; // '小明'
    xiaoming.run(); // 小明 is running...

    xiaoming有自己的name属性,但并没有定义run()方法。不过,由于小明是从Student继承而来,只要Studentrun()方法,xiaoming也可以调用:


    这时候如果xiaoming.__proto__ = Bird;就不能使用run方法了,因为这时小明的原型已经指向Brid,小明只能调用Bird的方法了。

    ⭐⭐强调点,请不要使用.__proto__去指向原型,应该用下面的:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    // 原型对象:
    var Student = {
    name: 'Robot',
    height: 1.2,
    run: function () {
    console.log(this.name + ' is running...');
    }
    };

    function createStudent(name) {
    // 基于Student原型创建一个新对象:
    var s = Object.create(Student);
    // 初始化新对象:
    s.name = name;
    return s;
    }

    var xiaoming = createStudent('小明');
    xiaoming.run(); // 小明 is running...
    xiaoming.__proto__ === Student; // true
  1. AJAX
    AJAX不是JavaScript的规范,它只是一个哥们“发明”的缩写:Asynchronous JavaScript and XML,意思就是用JavaScript执行异步网络请求。
    AJAX请求是异步执行的,也就是说,要通过回调函数获得响应。

  2. jQuery
    $是著名的jQuery符号。实际上,jQuery把所有功能全部封装在一个全局变量jQuery中,而$也是一个合法的变量名,它是变量jQuery的别名:

    1
    2
    3
    4
    window.jQuery; // jQuery(selector, context)
    window.$; // jQuery(selector, context)
    $ === jQuery; // true
    typeof($); // 'function'

    选择器
    选择器是jQuery的核心。一个选择器写出来类似$('#dom-id')

  3. s