JS汇总---面向对象&数组

面向对象


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);
    }
}

若干个数字,怎么选出最大的五个

你可能感兴趣的:(JS汇总---面向对象&数组)