面向对象
js原型链的继承
静态属性怎么继承
js原型链以及特点
面向对象有哪几个特点
封装,继承,多态
对象的继承
创建对象的几种方式
继承的两种方法。
原型链继承和类继承。然后类继承只继承了实例属性,没有原型属性。
原型链继承可以继承所有。然后用apply和call怎么继承原型链上的共享属性?通过空函数传值。新建一个空函数C。C实例化后C的实例属性就是空,然后用B的apply/call去继承C,相当于继承了C的实例属性
JS怎么实现继承
将父对象的一个实例赋值给子对象的原型
js实现继承的5种方式
new操作符时具体是干了些什么
New:
1、创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。
2、属性和方法被加入到 this 引用的对象中。
3、新创建的对象由 this 所引用,并且最后隐式的返回 this 。
怎么判断属性来自对象自身还是原型链
hasOwnProperty
一个对象的实例,如何统计被几次调用过,分别具体被哪些函数调用过,可以有哪些方法
写个Animal类
有个Cat类继承它,要求新建一个Cat的实例,可以调用catch方法输出自己的名字“大白的猫”;
实现私有变量
(这里当时还没看到相关部分,只能想到用属性的setter、getter来做。。。面试官各种启发呀。。);
手写一个类的继承,并解释一下
手写JS实现类继承,讲原型链原理
数组
Array对象自带的方法,一一列举
var arr = [0,1,2];
1.pop():删除数组的最后一个元素,减少数组的长度,返回删除的值。
这里是2.
2.push(3):将参数加载到数组的最后,返回新数组的长度。
现在arr中是:0,1,2,3
3.shift():删除数组的第一个元素,返回删除的值,同时数组长度减一。
这里是0
4.unshift(3,4):把参数加载数组的前面,返回新数组的长度。
现在arr:中是3,4,0,1,2
5.sort():按指定的参数对数组进行排序 ,返回的值是经过排序之后的数组
var a = [0,1,5,10,15];
var b = a.sort(); // a:[1,2,3,4,5] b:[0,1,10,15,5]
正确的排序:
function compare(val1, val2) {
return val1 - val2;
}
arr = [3,7,6];
arr.sort(compare); // 3,6,7
6.reverse():反转数组项的顺序,返回的值是经过排序之后的数组
7.concat(3,4):把两个数组拼接起来。 返回的值是一个副本
8.slice(start,end):返回从原数组中指定开始下标到结束下标之间的项组成的新数组
var colors = ["red", "green", "blue", "yellow", "purple"];
// 一个参数:[ ,+∞)
var color1 = colors.slice(1);
alert(color1); // green,blue,yellow,purple
// 两个参数:[,)
var color2 = colors.slice(1,4);
alert(color2); // green,blue,yellow
6splice():
删除: 2个参数,起始位置,删除的项数
插入: 3个参数,起始位置,删除的项数,插入的项
替换:任意参数,起始位置,删除的项数,插入的任意数量的项
var colors = ["red", "green", "blue"];
var removed = colors.splice(0,1); // 删除第一项
alert(colors); // green,blue
alert(removed); // red,返回数组中只包含一项
removed = colors.splice(1, 0, "yellow", "orange"); // 从位置1开始插入两项
alert(colors); // green,yellow,orange,blue
alert(removed); // 返回的数组是一个空数组
removed = colors.splice(1, 1, "red", "purple"); // 从位置I开始插入两项
alert(colors); // green,red,yellow,orange,blue
alert(removed); // yellow,返回的数组中只包含一项
indexOf()和lastIndexOf():接受两个参数,要查找的项(可选)和查找起点位置的索引
indexOf():从数组开头向后查找
lastIndexOf():从数组末尾开始向前查找
every():对数组中的每一项运行给定函数,如果该函数对每一项都返回true,则返回true。
filter():对数组中的每一项运行给定函数,返回该函数会返回true的项组成数组。
forEach():对数组的每一项运行给定函数,这个方法没有返回值。
map():对数组的每一项运行给定函数,返回每次函数调用的结果组成的数组。
some():对数组的每一项运行给定参数,如果该函数对任一项返回true,则返回true。以上方法都不会修改数组中的包含的值。
reduce()和reduceRight():缩小数组的方法,这两个方法都会迭代数组的所有项,然后构建一个最终返回的值。
join(separator):将数组的元素组起一个字符串,以separator为分隔符,省略的话则用默认用逗号为分隔符
var a = [1,2,3,4,5];
var b = a.join("|"); //a:[1,2,3,4,5] b:"1|2|3|4|5"
Array对象自带的排序函数底层是怎么实现的
数组去重
思路:
1.创建一个新的数组存放结果
2.创建一个空对象
3.for循环时,每次取出一个元素与对象进行对比,如果这个元素不重复,则把它存放到结果数组中,同时把这个元素的内容作为对象的一个属性,并赋值为1,存入到第2步建立的对象中。
说明:至于如何对比,就是每次从原数组中取出一个元素,然后到对象中去访问这个属性,如果能访问到值,则说明重复。
Array.prototype.unique3 = function(){
var res = []; // 创建一个新的数组存放结果
var json = {}; // 创建一个空对象
for(var i = 0; i < this.length; i++){
if(!json[this[i]]){ // json不为空的时候
res.push(this[i]); // 把元素依次放入到res中
json[this[i]] = 1; //?
}
}
return res; // 返回res
}
var arr = [112,112,34,'你好',112,112,34,'你好','str','str1'];
alert(arr.unique3()); // 调用unique3函数
数组去除一个函数。
用arr.splice。又问splice返回了什么?应该返回的是去除的元素。
你知道伪数组吗
这里把符合以下条件的对象称为伪数组:
1,具有length属性
2,按索引方式存储数据
3,不具有数组的push,pop等方法
如
1,function内的arguments 。
2,通过document.forms,Form.elements,Select.options,document.getElementsByName() ,document.getElementsByTagName() ,childNodes/children 等方式获取的集合(HTMLCollection,NodeList)等。
3,特殊写法的对象 ,如
var obj={};
obj[0] = "一";
obj[1] = "二";
obj[2] = "三";
obj.length = 3;
那你重新设计一下这个函数,让它直接拥有数组的方法吧
// 方法一、 声明一个空数组,通过遍历伪数组把它们重新添加到新的数组中,大家都会,这不是面试官要的
var aLi = document.querySelectorAll('li');
var arr = [];
for (var i = 0; i < aLi.length; i++) {
arr[arr.length] = aLi[i]
}
// 方法二、使用数组的slice()方法 它返回的是数组,使用call或者apply指向伪数组
var arr = Array.prototype.slice.call(aLi);
实现sum(2,3);sum(2,3,4);sum(2,3,4,5);
(我用了比较原始的方法,if来判断)
那如果sum里面的参数不确定呢
(提取arguments的长度,用for循环)
手写一个递归函数(考察arguments.callee,以及arguments的解释)
// arguments.callee 是一个指向正在执行函数的指针
function factorial(num) {
if (num <= 1) {
return 1;
}
else {
return num * arguments.callee(num - 1);
}
}