JavaScript应用场景
1.网页特效
2.服务端开发(Node.js)
3.命令行工具
4.桌面程序(Electron)
5.App(Cordova)
6.控制硬件-物联网(Ruff)
7.游戏开发(cocos2d-js)
复习以下知识点
-
数据类型
- 简单数据类型:Number,String,Boolean,Undefined和Null
- 复杂数据类型:Object
- 获取变量类型:typeof
- 数据类型转换:toString(转换成字符du串),String(),num+"",Number(),parseInt(str),parseFloat(str),Boolean()
-
数组及数组常用的方法
注意:直接给Array的length赋一个新的值会导致Array大小的变化:
arr.length; // 3
arr.length = 6;
arr; // arr变为[1, 2, 3, undefined, undefined, undefined]
arr.length = 2;
arr; // arr变为[1, 2]
-
indexof
与String 类似,Array也可以通过indexof()来搜索一个指定的元素的位置:
arr.indexOf(10); // 元素10的索引为0
arr.indexOf(20); // 元素20的索引为1
arr.indexOf(30); // 元素30没有找到,返回-1
arr.indexOf('30'); // 元素'30'的索引为2
-
slince
slice()就是对String的substring()版本,它截取Array的部分元素,然后返回一个新的Array
var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
arr.slice(0, 3); // 从索引0开始,到索引3结束,但不包括索引3: ['A', 'B', 'C']
arr.slice(3); // 从索引3开始到结束: ['D', 'E', 'F', 'G']
注意:slice()的起止参数包括开始索引,不包括结束索引。还有就是如果不给slice()传递任何参数,它就会从头到尾截取所有元素。利用这一点,我们可以很容易地复制一个Array。
-
push和pop
push()向Array的末尾添加若干元素,pop()则把Array的最后一个元素删除掉:
var arr = [1, 2];
arr.push('A', 'B'); // 返回Array新的长度: 4
arr; // [1, 2, 'A', 'B']
arr.pop(); // pop()返回'B'
arr; // [1, 2, 'A']
arr.pop(); arr.pop(); arr.pop(); // 连续pop 3次
arr; // []
arr.pop(); // 空数组继续pop不会报错,而是返回undefined
arr; // []
- unshift和shift
如果要往Array的头部添加若干元素,使用unshift()方法,shift()则把Array的第一个元素删掉:
var arr = [1, 2];
arr.unshift('A', 'B'); // 返回Array新的长度: 4
arr; // ['A', 'B', 1, 2]
arr.shift(); // 'A'
arr; // ['B', 1, 2]
arr.shift(); arr.shift(); arr.shift(); // 连续shift 3次
arr; // []
arr.shift(); // 空数组继续shift不会报错,而是返回undefined
arr; // []
-
sort
sort()可以对当前的Array进行排序,它会直接修改当前Array的元素位置,直接调用时,按照默认的顺序排序:
var arr = ['B', 'C', 'A'];
arr.sort();
arr; // ['A', 'B', 'C']
-
reverse
reverse()把整个Array的元素给掉个,也就是反转:
var arr = ['one', 'two', 'three'];
arr.reverse();
arr; // ['three', 'two', 'one']
-
splice
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']
-
concat
concat()方法把当前的Array和另一个Array连接起来,并返回一个新的Array:
var arr = ['A', 'B', 'C'];
var added = arr.concat([1, 2, 3]);
added; // ['A', 'B', 'C', 1, 2, 3]
arr; // ['A', 'B', 'C']
concat()方法可以接收任意个元素和Array,并且自动把Array拆开,然后全部添加到新的Array里:
ar arr = ['A', 'B', 'C'];
arr.concat(1, 2, [3, 4]); // ['A', 'B', 'C', 1, 2, 3, 4]
-
join
join()方法是一个非常实用的方法,它把当前Array的每个元素都用指定的字符串连接起来,然后返回连接后的字符串:
var arr = ['A', 'B', 'C', 1, 2, 3];
arr.join('-'); // 'A-B-C-1-2-3'
-
函数
-
函数的调用:函数作为数据类型可以作为参数,返回值
-
作用域
- 全局变量:不使用var声明的变量(不推荐使用),关闭网页或浏览器才会销毁。
- var申明的变量的作用域:
1.如果一个变量在函数内部申明,则该变量的作用域为整个函数体,在函数体外不可以引用该变量
2.如果两个不同的函数给自申明了同一个变量,那么该变量就只在各自的函数体内起作用。换句话说,函数内部的同名变量相互独立,互不影响
3.由于Js的函数可以嵌套,此时,内部函数可以访问外部函数定义的变量,反过来则不行
-
闭包
- 闭包(closure)指有权访问另一个函数作用域中变量的函数
- 简单理解:一个作用域可以访问另外一个函数内部的局部变量
-
-
递归
- 如果函数在内部可以调用其本身,那么这个函数就是递归函数
+由于递归很容易产生"栈溢出"错误(stack overflow),所以必须要加推出条件return
- 如果函数在内部可以调用其本身,那么这个函数就是递归函数
-
JS代码的执行过程
- JavaScript的函数定义有一个特点,它会先扫描整个函数体的语句,将所有申明的变量"提升"到函数顶部
function foo() {
var y; // 提升变量y的申明,此时y为undefined
var x = 'Hello, ' + y;
console.log(x);
y = 'Bob';
}
-
this详解
- 一般函数直接执行,内部this指向全局window
- 函数作为一个对象的方法,被该对象所调用,那么this指向的时该对象
-
构造函数中的this时一个隐式对象,类似一个初始化的模型,所有方法和属性都挂载到这个隐式对象上,后续通过关键字调用,从而实现实例化
ES6的知识点(补充)
-
let/const
- 两个重要的两个特性就是提供了块级作用域与不再具备变量提升。
- let:不可重复声明,块级作用域;只能在{}里打印,外面就无法打印
-
const:声明常量
-
解构赋值
- 可以同时对一组变量进行赋值,什么是结构赋值,看例子:
var array = ['hello', 'JavaScript', 'ES6'];
var x = array[0];
var y = array[1];
var z = array[2];
- 注意,对数组元素进行解构赋值时,多个变量要用[...]括起来。
如果数组本身还有嵌套,也可以通过下面的形式进行解构赋值,注意嵌套层次和位置要保持一致:
let [x, [y, z]] = ['hello', ['JavaScript', 'ES6']];
x; // 'hello'
y; // 'JavaScript'
z; // 'ES6'
也可以忽略某些元素
let [, , z] = ['hello', 'JavaScript', 'ES6']; // 忽略前两个元素,只对z赋值第三个元素
z; // 'ES6'
使用注意事项:
1.两边的结构必须一致
2.两边必须是一个实际的内容:数组或对象-
箭头函数:
function (x) {
return x * x;
}
x => x * x
-
map
配合数组使用,具有很棒的效果啊!
-
剩余参数
- ...用于声明剩余的参数,a,b是命名参数,...c用来收集剩余参数
- ...也称为扩展运算符,通过...运算使得两个数组实现深拷贝
-
参数模板
- 模板字符串是为了解决使用"+"号拼接字符串的不便利而出现的
- ${变量名称/常量名称},外面使用' '(反单引号)包裹
-
数组方法
- Array.of(变量):将变量转为数组,可以不要在使用eval进行替换,替代Array()或new Array()
- reduce():接收函数作为累加器,数组的元素从左到右缩减,最终计算为一个值
例子:有一个数组,存取了6位学生的成绩,求六位学生的平均分
//求几位学生的平均分
let scores=[23,34,5,6,45];
let average=scores.reduce((tmp,score,index)=>{
console.log(tmp,score,index);
if(index==scores.length-1){
return(tmp+score)/scores.length;
}
else{
return tmp+score;
}
})
console.log(average.toFixed(2));
-
filter():创建新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素