标签 知识 下的文章

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

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

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

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

- 阅读剩余部分 -

菜鸟说动态规划

从我学习至今,我有三大心理阴影:递归、正则表达式、动态规划——这三个导致让我怀疑智商怀疑人生。

在这次假期刷题的时候,前两个似乎都已经不是问题了,就差动态规划——昨天不行random到一道题,一眼望着就是动态规划了——可是我不会啊。

You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins, return -1.

题目来自LeetCode,本来是不准备写LeetCode的题了,全都在GitHub上了大家看看就行了,不过这题有助于让我们更好地理解(第一次理解)动态规划。

- 阅读剩余部分 -

小解跨域问题

好了,以前自己对跨域、jsonp的理解不太正确,写一篇文章纠正一下……

说起跨域,我们就得说到同源策略问题,简单的来说,同源策略是限制不同源(简单理解为网站吧)之间交互的一个策略,可以有效的增加安全性。

但是也不全然是好的,还有一些时候,我们依旧需要调用外部的api啊,如果禁止外部源的交互的话,我们很显然就没有办法了。

解决的方法有挺多种,这里主要就讲两种,CORS和jsonp。

- 阅读剩余部分 -

JavaScript JSON stringify格式化Date不正确

有同学问了我一个很特殊的需求,他需要格式化date为json格式,可是结果却不正确。

我们来试一把:

new Date();
// Sat Jan 09 2016 12:34:05 GMT+0800 (CST)
JSON.stringify(new Date());
// "\"2016-01-09T04:34:28.242Z\""

看上去确实不一样——不过我们能看到,差8个小时,不就是GMT(UTC)的标准时间跟我们的区别么?

也就是说,JSON.stringify会默认转换时间,解决的方案在stackoverflow也有:

x = new Date();
x.setHours(x.getHours() - x.getTimezoneOffset() / 60);

这样能够还原成UTC,就完全一致了。

当然,最好的自然还是使用时间戳啦:

Date.parse(new Date());
(new Date()).valueOf();
new Date().getTime()
其中:第一种获取的时间戳是把毫秒改成000显示,第二种和第三种是获取了当前毫秒的时间戳。

当然,没有想到什么特殊的需求需要用客户端获取时间给服务端……

另外,JSON.stringify以前竟然不知道,孤陋寡闻了。

最后想说的是,json没有标准时间格式这一说,在json.org中也有说明关于json的数据(value)类型。

参考:

PHP 使用curl获取网页内容

在上一篇文章中,我们试图获取Bing的壁纸,但是却发现它虽然是个标准的json,但不支持跨域,响应头没有:Access-Control-Allow-Origin: *

上一次用curl还是刚学PHP的时候复制粘贴的,现在感受深多了,看得懂到底是怎么回事了,不过我们的需求也比上次简单多了,上次是缓存图片到本地,而这次我们只要把内容输出就可以了。

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "http://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1");
curl_setopt($ch, CURLOPT_HEADER, 0);
$out = curl_exec($ch);

curl_close($ch);

- 阅读剩余部分 -

jQuery 初试jsonp

说来惭愧,写了这么久的前端(大概),还没有使用过jsonp(后来我发现假期用Angular+Rails使用过。。。http://codesky.me/archives/rails-solve-cross-query.wind),这次在微博中,一个好友遇到了一个需要跨域的问题,那么机会来了。

我第一反应就是jsonp,尽管他说不可以,然而我还是想要试试看。

用最顺手的jQuery吧,话虽如此,jQuery也快忘了。

- 阅读剩余部分 -