看到有一篇写前端面试中常见的算法文章,里面的例子很简单,但也挺有趣。
重要的是,其实每个问题,都不止一个解答,我们可以从各个方面细想一下,拓展一下思路。
30分钟学会AWK
js数组拷贝
从搭建hexo个人博客过程中理解学习DNS解析
最近,新接触到了hexo这个博客工具,并利用它搭建了基于git hub pages静态页面的个人博客站,绑定了自己的域名,在绑定域名这个环节,逐步学习并理解了域名解析这个过程,想到之前有个有趣的面试题就是“当你在浏览器地址栏中输入一个网址,并按下回车键后,发生了什么”,于是就想把此记录下。
js中0.1+0.2为什么不等于0.3
前两天看了小胡子哥写了一篇js中浮点数运算的一个比较特殊的0.1+0.2
的问题,揭秘 0.1 + 0.2 != 0.3,略感小胡子哥写的还是稍微粗略,于是查各种资料,将包括IEEE754关于浮点数二进制的只是又整理一下,做此记录。
js对象的toString()方法和valueOf()方法
在研究js的==和===的区别时,曾经说过,在js中非原始值对象,要参加运算需要ToPrimitive(x)转换成原始值类型。
在ToPrimitive(x)时,我们曾得出结论:
ToPrimitive
- ToPrimitive(input,hint)转换为原始类型的方法,根据hint目标类型进行转换。
- hint只有两个值:String和Number
- 如果没有传hint,Date类型的input的hint默认为String,其他类型的input的hint默认为Number
- Number 类型先判断 valueOf()方法的返回值,如果不是,再判断 toString()方法的返回值
- String 类型先判断 toString()方法的返回值,如果不是,再判断 valueOf()方法的返回值
也就是说,js中的对象离不开toString()方法和valueOf()方法。那到底何时用toString()方法,何时用valueOf()方法呢?怎么用?
es6中promise的研究
学习了es6有一段时间了,对promise的概念也有一定的了解,起先觉得概念上挺简单的,但是在实际操作中却发现,用起来却没那么顺利。
首先,我们先看一个问题,有一个国外的哥们写的一篇博客,关于promise的研究上开篇提出来的问题,大家有兴趣可以看一下原文:https://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html
下面这四个调用方式,返回结果有什么不同,运行方式有什么不同。
1 | doSomething().then(function () { |
ecmasrcipt类型转换
之前写了一篇 《js中==和===的区别.md》,其中提到了 ToPrimitive()
,转换为原始类型的方法。这个方法中,其实也引用到了其他的类型转换,比如,ToBoolean()
转换为Boolean类型,ToNumber()
转换为数字类型等等,但是这些方法具体是怎么执行的,并未做说明,今天就看看ecma中对类型转换的几个方法的说明。
js的位操作
今天在看js的Array的方法时, 看到源码中有下面的一段代码, 挺有意思, 是关于位运算的, 就拿来研究了一下:
1 | var len = t.length >>> 0; |
这里使用了 >>>
,无符号右移运算符, 还右移了 0 位, 初看有点蒙, 到底啥意思? 带着疑问做了如下实验:
1 | console.log(1 >>> 0); //1 |
从结果来看,不管是什么类型的数据,都被强制转换成了整型。 为什么 >>>
运算符会如此呢?这要从js的位运算符说起。
计算机中的负数为什么使用补码表示
我们都知道,在计算机的内部,所有的数据都是以二进制的形式存储的,为了区分正数和负数,在最高位拿出来当作符号位,0表示正数,1表示负数。而且,负数的存储,除了最高位的符号位,其他位使用的是补码的形式存储的。
计算一个数值的二进制补码,以下3个步骤:
- 求这个值的绝对值的二进制原码
- 原码取反,得到反码
- 反码加1,即是补码