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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容