前两天看了小胡子哥写了一篇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,即是补码
js中==和===的区别
做js的时候,也没仔细的研究过==和===两个操作符之间的具体区别,但是本着实事求是的态度,今天上网查了一下他们两个的区别,最后得出的结论是:
1 | `===` 严格相等,会比较两个值的类型和值 |
然后我就更迷惑了,先类型转换,我擦,怎么转换,左边转换成右边类型还是右边转换成左边类型?
ES6初探之Promise
在es6中新添加了一个Promise对象,其实这并不是“新”的概念,很早之前就有了promise规范,在es6之前有很多第三方库对其做了实现,es6对其进行原生实现。Promise规范的提出是为了解决异步编程中回调函数的“滥用”。
promise的三种状态:
- pending 等待状态
- resolved 完成状态
- rejected 拒绝状态
promise的三种状态,只能是pending->resolved或者pending->rejected,不能有其他类型的状态转换,并且状态一旦发生转换,就不再发生变化。
promise和co搭配生成器函数方式解决js代码异步流程的比较
在es6中引入的原生Promise为js的异步回调问题带来了一个新的解决方式,而TJ大神写的co模块搭配Generator函数的同步写法,更是将js的异步回调带了更优雅的写法。
今天我想对比一下这两种方式,来看看这两种方式的区别以及优劣。
angular自定义filter
angular除了几个自带的常用的filter,还可以自定义filter,以满足不同的需求,简单研究了一下自定义filter,记录一下。
有如下场景,后台返回的数据中,status可能是英文字符串,如果在html中使用if进行挨个判断,则显得有些啰嗦,这样我们就可以使用自定义的filter实现