;
结束,语句块用{...}
,可以嵌套。 ;
确保运行结果与期望一致。计算机能处理的有数值、文本、图形、音频、视频、网页等各种各样的数据,不同的数据,需要定义不同的数据类型。
在JavaScript中定义了以下几种数据类型:
1. Number: JavaScript不区分整数和浮点数,统一用Number表示
2. 字符串: 字符串是以单引号’或双引号”括起来的任意文本
3. 布尔值:布尔值只有true
、false
两种值.与、或、非 分别用 &&,||,!
表示
4. 数组: 数组是一组按顺序排列的集合,集合的每个值称为元素。JavaScript的数组可以包括任意数据类型。[1, 2, 3.14, 'Hello', null, true];
,new Array(1, 2, 3);
5. 对象:JavaScript的对象是一组由键-值组成的无序集合。对象的键都是字符串类型,值可以是任意数据类型。每个键又称为对象的属性。获取一个对象的属性,我们用对象变量.属性名
的方式
0x
。例如:0xff00
,0xa5b4c3d2
==
比较会转换数据类型后比较,===
比较不会转自动换数据类型,直接比较NaN
这个特殊的Number
与所有其他值都不相等,包括它自己NaN
的方法是通过isNaN()
函数Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true
0
var
语句,变量名也可以用中文,但是,请不要给自己找麻烦。var
申明就被使用,该变量就自动被申明为全局变量,使用var
申明的变量则不是全局变量,它的范围被限制在该变量被申明的函数体内,为了修补JavaScript这一严重设计缺陷,ECMA在后续规范中推出了strict模式.启用strict模式的方法是在JavaScript代码的第一行写上:'use strict';
'I\'m \"OK\"!';
表示I'm "OK"!
\x41
可以表示ASCII
字符"A"
,个Unicode字符可用\u####
表示python
中'''...'''
+
号连接。ES6
用${var}
自动替换字符串中的变量,此时字符串引号改为反引号。类似python3
中'{}'.fromat(var)
字符串操作:s.length,s[0]
s='Hello';s.toUpperCase();s.toLowerCase();s.indexOf('w');s.substring(0,5);s.substring(7);
JavaScript数组常用方法:
1. Array
的长度:arr.length
2. arr.indexOf(var);
3. arr.slice(0,3);arr.slice(3);arr.slice();
4. arr.push('A', 'B');arr.pop();
5. arr.unshift('A', 'B');arr.shift();
6. arr.sort();
7. arr.reverse();
8. arr.concat([1, 2, 3]);
,类似python
的lst.extend
9. arr.join('-');
10. splice()
方法是修改Array的“万能方法”,它可以从指定的索引开始删除若干元素,然后再从该位置添加若干元素:
var arr = ['Microsoft', 'Apple', 'Yahoo', 'AOL', 'Excite', 'Oracle'];
// 从索引2开始删除3个元素,然后再添加两个元素:
arr.splice(2, 3, 'Google', 'Facebook'); // 返回删除的元素 ['Yahoo', 'AOL', 'Excite']
arr; // ['Microsoft', 'Apple', 'Google', 'Facebook', 'Oracle']
// 只删除,不添加:
arr.splice(2, 2); // ['Google', 'Facebook']
arr; // ['Microsoft', 'Apple', 'Oracle']
// 只添加,不删除:
arr.splice(2, 0, 'Google', 'Facebook'); // 返回[],因为没有删除任何元素
arr; // ['Microsoft', 'Apple', 'Google', 'Facebook', 'Oracle']
Array
的索引可赋值Array
的length
赋一个新的值会导致Array
大小的变化,不建议直接修改Array的大小slice()
就是对应String
的substring()
版本join
。JavaScript的对象是一种无序的集合数据类型,它由若干键值对组成。用{…}表示对象,键值对以xxx: xxx
形式申明,用,
隔开
JavaScript数组常用方法:
1. 新增age属性:xiaoming.age = 18;
2. 删除age属性: delete xiaoming.age;
3. 判断属性存在:'age' in xiaoming;
4. 判断属性是否自身拥有:xiaoming.hasOwnProperty('name');
in
判断一个属性存在,这个属性不一定是xiaoming
的,它可能是xiaoming
继承得到的JavaScript使用if () { ... } else { ... }
来进行条件判断
{}
,建议永远都要写上{}
null、undefined、0、NaN
和空字符串”视为false
,其他值一概视为true
,因此上述代码条件判断的结果是true
。for
循环
var x = 0;
var i;
for (i=1; i<=10000; i++) { // 分号间隔
x = x + i;
}
x; // 50005000
i=1; i<=10000; i++
分别为初始条件、判断条件、递增条件for
循环最常用的地方是利用索引来遍历数组for
循环的3个条件都是可以省略的,如果没有退出循环的判断条件,就必须使用break
语句退出循环,否则就是死循环for
循环的一个变体是for (var key in o) in
循环,它可以把一个对象的所有属性依次循环出来var a = ['A', 'B', 'C'];
for (var i in a) {
console.log(i); // '0', '1', '2'
console.log(a[i]); // 'A', 'B', 'C'
}
while
循环
while
循环只有一个判断条件,条件满足,就不断循环,条件不满足时则退出循环。
var x = 0;
var n = 99;
while (n > 0) {
x = x + n;
n = n - 2;
}
x; // 2500
do ... while
循环
var n = 0;
do {
n = n + 1;
} while (n < 100);
n; // 100
do { ... } while()
循环体至少会执行1次,而for
和while
循环则可能一次都不执行。Map和Set是ES6标准新增的数据类型
Map
var m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]); // 二维数组初始化 Map
m.get('Michael'); // 95
var m = new Map(); // 初始化一个空 Map
m.set('Adam', 67); // 添加新的 key-value
m.set('Bob', 59);
m.has('Adam'); // 是否存在 key 'Adam': true
m.get('Adam'); // 67
m.delete('Adam'); // 删除 key 'Adam'
Set 集合
var s = new Set(); // 初始化一个空 Set
var s2 = new Set([1, 2, 3]); // 数组初始化 Set
s.add(4); // 添加元素
s.delete(3); // 删除元素
key
的集合,且不存储valuefor ... of
循环
var a = ['A', 'B', 'C'];
var s = new Set(['A', 'B', 'C']);
var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
for (var x of a) { // 遍历Array
console.log(x);
}
for (var x of s) { // 遍历Set
console.log(x);
}
for (var x of m) { // 遍历Map
console.log(x[0] + '=' + x[1]);
}
for ... of
循环和for ... in
循环有何区别?
答:for ... in
遍历的实际上是对象的属性名称,会把新增属性包括在内。for ... of
循环,它只循环集合本身的元素
iterable内置的forEach方法
var a = ['A', 'B', 'C'];
var s = new Set(['A', 'B', 'C']);
var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
a.forEach(function (element, index, array) {
// element: 指向当前元素的值
// index: 指向当前索引
// array: 指向Array对象本身
console.log(element + ', index = ' + index);
});
for ... of
循环是ES6
引入的新的语法。具有iterable
类型的集合可以通过新的for ... of
循环来遍历function myabs(x) { //第一种定义函数的方式
// var abs = function (x) { //第二种定义函数的方式,匿名函数,赋值给了变量myabs
if (typeof x !== 'number') { // 参数检查
throw 'Not a number';
}
if (x >= 0) {
return x;
} else {
return -x;
}
}
python
返回 None
rest参数
function foo(a, b, ...rest) {
console.log('a = ' + a);
console.log('b = ' + b);
console.log(rest);
}
foo(1, 2, 3, 4, 5);
// 结果:
// a = 1
// b = 2
// Array [ 3, 4, 5 ]
foo(1);
// 唯一的全局变量MYAPP:
var MYAPP = {};
// 其他变量:
MYAPP.name = 'myapp';
MYAPP.version = 1.0;
// 其他函数:
MYAPP.foo = function () {
return 'foo';
};
从ES6开始,JavaScript引入了解构赋值,可以同时对一组变量进行赋值。
var [x, y, z] = ['hello', 'JavaScript', 'ES6'];
// x, y, z分别被赋值为数组对应元素:
console.log('x = ' + x + ', y = ' + y + ', z = ' + z);
// x = hello, y = JavaScript, z = ES6
let [x, [y, z]] = ['hello', ['JavaScript', 'ES6']];
var person = {
name: '小明',
age: 20,
gender: 'male',
passport: 'G-12345678',
school: 'No.4 middle school'
};
var {name, age, passport} = person;
// name, age, passport分别被赋值为对应属性:
console.log('name = ' + name + ', age = ' + age + ', passport = ' + passport);
var {name, single=true} = person;
undefined
[x, y] = [y, x]
function buildDate({year, month, day, hour=0, minute=0, second=0}) {
return new Date(year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + second);
}
// 只需要year、month和day这三个属性
buildDate({ year: 2017, month: 1, day: 1 });
// Sun Jan 01 2017 00:00:00 GMT+0800 (CST)
绑定到对象上的函数称为方法
var xiaoming = {
name: '小明',
birth: 1990,
age: function () {
var y = new Date().getFullYear();
return y - this.birth;
}
};
xiaoming.age; // function xiaoming.age()
xiaoming.age(); // 今年调用是25,明年调用就变成26了
function getAge() {
var y = new Date().getFullYear();
return y - this.birth;
}
var xiaoming = {
name: '小明',
birth: 1990,
age: getAge
};
xiaoming.age(); // 25, 正常结果
getAge(); // NaN
// 用apply修复getAge()调用
function getAge() {
var y = new Date().getFullYear();
return y - this.birth;
}
var xiaoming = {
name: '小明',
birth: 1990,
age: getAge
};
xiaoming.age(); // 25
getAge.apply(xiaoming, []); // 25, this指向xiaoming, 参数为空
apply()类似的方法是call(),唯一区别是:apply()把参数打包成Array再传入;call()把参数按顺序传入。
一个函数就可以接收另一个函数作为参数,称之为高阶函数