2016年3月

JavaScript 说一个排序算法

依旧还是面试题,比较麻烦的是,这个排序的关键在于,我们需要时间复杂度为O(n),空间复杂度为O(1)。

题目大概是这样的,看了输入输出基本就会明白了:

input: arr = ['', 'a', 'b', '', 'a', 'c', '*', 'm']
output: [ '', '', '*', 'a', 'a', 'b', 'c', 'm' ]
问题描述:将数组中的字母与星号分开

这里其实主要没做出来是因为我没有很好地理解怎么计算复杂度,尤其是空间复杂度,时间复杂度我勉强记忆成for循环的嵌套还是可以的,但是空间复杂度呢?

- 阅读剩余部分 -

JavaScript 多维数组转一维数组

面试时还被问到多维数组如何转换成一维数组的问题,这个问题比较灵活,其实也有很多种解法,当然,考虑到面试时候比较紧张,还是踏踏实实的用传统的方法来,和深拷贝一样,依旧是使用递归。

由于没有额外需要考虑的东西,因此这题实际上比起深拷贝来说要简单许多:

var convert = function(arr) {
    var newArr = [];

    arr.forEach(function(val) {
        if (val instanceof Array) {
            Array.prototype.push.apply(newArr, convert(val));
        } else {
            newArr.push(val);
        }
    });

    return newArr;
};

- 阅读剩余部分 -

JavaScript 说说arguments

面试中遇到了这样一个问题,在我在编码中使用arguments时,面试官顺便问道:arguments和数组的区别是什么。我记得arguments是伪数组,然后……就没有然后了。

实际上,关于argument,MDN是这么说的:

The arguments object is not an Array. It is similar to an Array, but does not have any Array properties except length. For example, it does not have the pop method. However it can be converted to a real Array:
var args = Array.prototype.slice.call(arguments);

翻译起来说,也就是说,他除了数组所具有的length属性外,别的什么都没有,如果我们需要使用,需要调用call或者apply,或者把arguments转换为真数组后操作。

CSS 理解伪类与伪元素

在刚开始学习CSS的时候写过一篇叫做CSS伪类与伪元素的文章,大致是把w3school搬过来罢了。

在面试的过程中,有面试官问我,伪类与伪元素的区别是什么?——我,一脸懵逼,只能举例说伪类伪元素大致是哪些东西(而且还说错了)。

回来之后,果断查了查伪类与伪元素,才发现完全是可以理解而不是记忆的知识点。

- 阅读剩余部分 -

JavaScript 深拷贝的实现

这里的深拷贝总体考虑的还是比较浅显的,主要是考虑引用类型中,我们需要把引用类型拷贝下来,这里主要考虑的引用类型,说白了其实还是很少的,主要就是自己定义的objectArray

在面试中,题目也是类似于拷贝数组一类的题。

当然,觉得自己的代码还是不够好看,希望菊苣们指摘。

另外,本来我也是喜欢直接写在原型上修改的,但是之前看到说原型上修改会出很多不可预知的错误(大家一起改),所以还是用传统的函数

- 阅读剩余部分 -