数组 []
JavaScript的数组可以包括任意数据的类型(用逗号分隔&&是否可以不分???索引从0开始,索引超出范围用undefined表示)对象
JavaScript的对象是一组由键-值对组成的无序集合。JavaScript的对象用于描述现实世界的某个对象。例如,为了描述某个人,我们可以用若干键值对来描述他:
1
2
3
4
5
6
7var person = {
name : 'Hth',
age : 23,
height : 1.63,
city : 'Chengdu',
zipcode : null
}
1 |
|
xiaohong
的属性名middle-school
不是一个有效的变量,就需要用''
括起来。访问这个属性也无法使用.
操作符,必须用['xxx']
来访问:
1 | xiaohong['middle-school']; // 'No.1 Middle School' |
由于JavaScript的对象是动态类型,你可以自由地给一个对象添加或删除属性:
1 | var xiaoming = { |
如果我们要检测xiaoming
是否拥有某一属性,可以用in
操作符('toString' in xiaoming;
)(但是这个属性可能是对象继承得到的)。要判断一个属性是否是xiaoming
自身拥有的,而不是继承得到的,可以用hasOwnProperty()
方法:xiaoming.hasOwnProperty('toString');
变量 (变量名也可以用中文,但是,请不要给自己找麻烦)
变量在JavaScript中就是用一个变量名表示,变量名是大小写英文、数字、
$
和_
的组合,且不能用数字开头。变量名也不能是JavaScript的关键字,如if
、while
等。申明一个变量用var
语句,比如:1
2
3
4
5var 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
申明的变量则不是全局变量,它的范围被限制在该变量被申明的函数体内(函数的概念将稍后讲 解),同名变量在不同的函数体内互不冲突。${ }
用法可以简化拼接字符串的烦恼函数
廖雪峰讲函数那里讲的太好了!!!
本质上说,函数就是最基本的一种代码抽象的方式。像Σ(n+1)
一样,我们不用关心n+1
的计算过程,只需要在更高的层次去思考东西。
定义函数
用function
去定义函数,如:1
2
3
4
5
6
7function abs(x) { //function指出这是一个函数定义;函数名称是abs;x是函数的参数,多个参数以 逗号,分隔
if (x >= 0) {
return x;
} else {
return -x; //请注意,函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕, 并将结果返回。因此,函数内部通过条件判断和循环可以实现非常复杂的逻辑。
}
}第二种定义方式
1
2
3
4
5
6
7var 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
8x => {
if (x > 0) {
return x * x;
}
else {
return - x * x;
}
}
如果参数不是一个,就需要用括号()
括起来:
1 | // 两个参数: |
如果要返回一个对象,就要注意,如果是单表达式,这么写的话会报错:
1 | // SyntaxError: |
因为和函数体的{ ... }
有语法冲突,所以要改为(用括号将{}
包起来):
1 | // ok: |
面向对象编程
JavaScript的原型链和Java的Class区别就在,它没有“Class”的概念,所有对象都是实例,所谓继承关系不过是把一个对象的原型指向另一个对象而已。1
2
3
4
5
6
7
8
9
10
11
12
13var 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
2xiaoming.name; // '小明'
xiaoming.run(); // 小明 is running...xiaoming
有自己的name
属性,但并没有定义run()
方法。不过,由于小明是从Student
继承而来,只要Student
有run()
方法,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
AJAX
AJAX不是JavaScript的规范,它只是一个哥们“发明”的缩写:Asynchronous JavaScript and XML,意思就是用JavaScript执行异步网络请求。
AJAX请求是异步执行的,也就是说,要通过回调函数获得响应。jQuery
$
是著名的jQuery符号。实际上,jQuery把所有功能全部封装在一个全局变量jQuery
中,而$
也是一个合法的变量名,它是变量jQuery
的别名:1
2
3
4window.jQuery; // jQuery(selector, context)
window.$; // jQuery(selector, context)
$ === jQuery; // true
typeof($); // 'function'选择器
选择器是jQuery的核心。一个选择器写出来类似$('#dom-id')
。s