JavaScript基础
如下两种数组/对象的创建的区别:
var arr = new Array(); var arr1 = [];
arr是通过构造函数创建,arr1则是通过字面量直接创建,二者区别如下:
- 构造函数可以被重构,而字面量声明不行。
- 字面量可以直接在行内写property声明,构造函数不行。
- 字面量生成对象比较快,不用找引用,不用遍历proto方法
- 当你需要快速创建有大容量的数组时,推荐使用构造方法生成。
- 数组的习惯用法:
方法名 | 说明 | 返回值 |
---|---|---|
push([item0, item1, item2]) | 将参数添加到数组的末尾 | 新数组的长度 |
pop() | 删除数组中的最后一个元素后返回该数组 | 被删除的item的值 |
sort(comparefn) | 根据compareFn对数组进行排序并 | 排序后的新数组 |
join(separator) | 在数组的元素之间加入分隔符之后生成相应的字符串值 | 新生成的字符串 |
reverse() | 将数组中的元素逆序置换 | 新数组 |
unshift([item0, item1, item2]) | 将元素添加到数组的头部 | |
shift() | 删除数组中的第一个元素 |
3. 用new 关键字创建对象时new的作用:
构造函数会隐式的执行return this,如果构造函数本身return了一个别的对象,则返回别的对象;如果return的是基本类型的值,那么就还是返回this对象
4. const, let, var:
+ var 有声明提前,即只要作用域内任何位置用var声明变量,其声明会被自动提前到作用域顶部。
+ let和const一定要先声明再使用, 且不允许重复声明,不存在声明提前,并且会从所在作用域开始到变量声明位置声场暂定性死区,即下面代码块会报错。
+ const声明一定要初始化,即声明的时候就要赋值。
+ 另外需要注意的是,var和let或者const出现在一个作用域中声明同一变量会报错,因为let和const都不能重复声明。
5. 箭头函数:
+ 箭头函数的this指向定义时所在的对象,而不是使用时所在的对象。箭头函数的指向是固定的
+ 不可以当做构造函数,不可以使用new命令,否则报错
+ 不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用rest参数代替。
+ 不可以使用yield命令,因此箭头函数不能用作Generator函数
6. apply, call, bind的区别:
- apply与call都可以用来改变函数引用的this指向,即调用的上下文,扩充函数的作用域。二者不同之处在于对于参数的传递不同。apply是将除了argObj之后的所有参数作为一个数组传递。而call是将之后的args原样传递。
- bind这个方法会创建一个函数的实例,其this值会被绑定到传给bind()函数的值。
7. ES6 module export/import, module.export, require之间的区别:
8. 闭包:
闭包是指有权访问另一个函数作用域中的变量的函数。常用方法是在一个函数内部声明另一个函数。
9. 原型链:
10. 快排:
function quickSort(arr, left, right) {
if(arr === undefined || arr.length <1) return arr; //验空
let pivot = arr.length/2;
let left = [];
let right = [];
//循环遍历,比pivot的值小的放到left里,比pivot的值大的放到right里
for(var index; index< arr.length; index++){
if(arr[index] < arr[pivot]){
left.push(arr[index]);
}
else{
right.push(arr[index]);
}
}
return quickSort(left).concat(arr[pivot], quickSort(right));
//对left和right两个子集进行循环并将结果合并。
}