• a + b in JavaScript

    计算方法

    1. 将A和B都转换为原始值(primitive,执行ToPrimitive),这里记为A1,B1
    2. 如果A1和B1中有一个值为string,则将A1、B1都转换为string(执行ToString),其值记为A2、B2,将A2 B2连接后就是A+B的结果
    3. 否则的话将A1、B1都转换为number(执行ToNumber),其值记为A3、B3,将A3 B3相加即为A+B的结果

    ToPrimitive(obj,preferredType)

    JS引擎内部转换为原始值ToPrimitive(obj,preferredType)函数接受两个参数,第一个obj为被转换的对象,第二个preferredType为希望转换成的类型(默认为空,接受的值为Number或String)

    更多...

  • 亲手实现一个Promise

    为何要手写Promise?直接import不行吗?

    身处技术圈,前端技术真的是日新月异,异步的实现方式从callback、到Promise、再到Generator、Async/Await,有了长足的发展,Promise作为发展过程中的一种产物其既是callback的一种改良,也是Generator、Async/Await的基础。

    直接import一个Promise类库当然可行(在支持的浏览器中直接使用Promise也未尝不可),但是如果我们能够亲手实现一个Promise,那么我们还能够:

    • 对Promise的理解更加深刻
    • 提升自己的类库编写能力,尤其是各种边界值的处理

    另外有一点需要说明,本文针对的是有一定Promise基础的同学,基础知识不在本文范畴之内,不了解的话请自行Google :)

    实现的内容

    实现之前我们先来思考下,一个Promise中到底有哪些是必须要实现的?

    按照Promise/A+的标准来说,只需要Promise的then方法即可,至于怎么实现、constructor怎么写,完全没有提及。不过虽然看似东西很少,但是实质上还是有蛮多东西要处理的。

    首先,constructor是必须的,在这里我们需要做一些初始化的动作:

    • 初始状态处理
    • 对传入的resolver进行判断并做容错处理
    • 执行传入的resolver函数
    • 定义resolve、reject函数

    其次,then方法由于是每个实例上都有,所以会挂在prototype上面,then方法中我们需要做的事情有

    • 对传入的onFulfilled、onRejected进行判断并做容错处理
    • 判断当前Promise的状态并返回一个新的Promise

    然后,我们还需要一个resolvePromise函数,这个函数根据标准而来(其实不管怎样,Promise的实现中都是少不了这样的处理过程)

    至于原型上的catch方法以及race、all等静态方法,暂时不处理,而且这些在我们实现了Promise的基础代码后都是很容易的事情,暂时不做处理。

    Constructor

    01function Promise(resolver) {
    02 
    03  var self = this
    04  self.status = 'pending'
    05  self.fulfilledCallbacks = []
    06  self.rejectedCallbacks = []
    07  self.data = null
    08 
    09  if(typeof resolver !== 'function') {
    10    throw new TypeError('Promise resolver ' + resolver + 'is not a function')
    11  }
    12 
    13  function onFulfilled(data) {
    14    setTimeout(function
    更多...

  • JS原型链回顾

    前两年在看JS原型链的时候花了挺久终于搞懂了,时间一久又渐渐生疏,趁机画个图总结下

    主要知识点:

    1. 在用构造函数F创建新的实例对象f时,会为f创建__proto__属性,指向
    更多...

  • jQuery实现多浏览器兼容HTML5 placeholder

    大家都知道HTML5里面的input或者textarea里的placeholder吧,可以很轻松的在点击后隐藏提示文字,但是IE老版本的因为不支持HTML5所以必定无法用,啊啊啊!!!可是这个需求真的是很普遍,工作中已经遇到过好多次这样的了,为了以后偷懒今天下班搞了个通用的代码吧~~

    先说说思路吧:

    1. 用CSS将文本框(这里叫他
    更多...

  • JQuery学习之JQ下拉菜单

    JQuery相信大家都接触过了,不过我这个JS菜鸟最近才开始学习。

    以前一直要搞个下拉菜单,现在学了点JQ,发现也挺简单的,上代码!(Demo页面)

    HTML代码

    01<ul id="nav-categories">
    02    <li><a href="../">首页</a>
    03    </li>
    04    <li>
    05        <a href="#">链接</a>
    06        <ul>
    07            <li><a href="#">aaa</a></li>
    08            <li><a href="#">bbb</a></li>
    09            <li><a href="#">ccc</a></li>
    10            <li><a
    更多...

  • JS代码根据网页来源显示不同内容

    我的JS学了没多久,今天就拿这个问题来练练手,不过功能还很简单,只能判断是不是来源于一些搜索引擎,然后决定是否显示指定代码。

  • ASP.NET使用母版页后动态加载JS/CSS

    ASP.NET中使用母版页最大的好处就是当有许多相似的页面时只用加一个母版页,每个页面用这个母版页生成内容页,然后根据情况修改每个内容页中的内容,保持页面布局的统一,同时也减少了代码量。

    但另一个突出的问题是使用母版页后,每个内容页中没有了<head></head>标记,因为这都在母版页中有了,而这对修改标题、加载JS/CSS等文件都有影响,前面我已经说过在ASP.NET中使用母版页后统一网页标题,那这篇就来说说如何加载JS/CSS等文件。

    ASP.NET中使用母版页后统一网页标题中修改标题的原理一样,加载JS/CSS等文件可以在内容页中加,也可以在母版页中统一加载。

    1、在单个内容页中加载

    将下面两段段代码放入内容页的Page_Load中即可,很简单了,也不再多解释。

    • 加载JS文件
    01#region 加载JS文件
    02HtmlGenericControl JSControl = new HtmlGenericControl("script");
    03JSControl.Attributes.Add("type", "text/javascript");
    04JSControl.Attributes.Add("src", "JS/js.js");
    05Page.Header.Controls.Add(JSControl);
    06#endregion
    • 加载CSS文件

    01HtmlLink CssControl = new HtmlLink();
    02CssControl.Href
    更多...

  • WordPress折腾记-精简CSS及JS在插件中的调用

    爱折腾WP是我的一个习惯,不折腾就会手痒,哈哈~~此文仅作为一个精简CSS及JS在插件中调用的范例,其他插件的精简可以按照此文的方法来做。

    更多...