由几道JS笔试题引发的知识点探究一——JS有哪些全局函数?

  首先要明确什么是JS。各位读者肯定都是在学习和研究JS的,或是菜鸟或是大牛,但是你考虑过什么是JS吗?乍一看来我这问题有点死抠字眼的味道,但在学习一门语言的时候就必须有这种打破沙锅问到底的精神。只有这样才能学得深入,才能学到这门语言的本质。几句絮叨之后,我们回到之前的问题——什么是JS?我们挂在嘴边的JS实际上有两种含义——一,ECMAScript,也就是所谓的JS标准;二,宿主环境中的JS,因为JS基本上是用于web开发的(JS官方称JS为"language of the web"),所以实际上也就是各大浏览器环境中的JS。既然有两种JS,那这道题自然也就有两种答案了。

  一、ECMAScript。

  有些文章里说ECMAScript所谓的全局函数和内置对象的函数或属性是不同的概念,全局函数是不属于任何对象的。我认为这种说法是错误的,但同时也是正确的。先说它错误的一面。按照ECMAScript5标准,全局函数也是内置对象的属性,这个内置对象就是所谓的全局对象(The Global Object)。标准原文解释说,"The unique global object is created before controls enters execution context"。这里就引出了全局对象的第一个特点——独一无二,也就是说你不可能用某种构造函数再创建一个全局对象出来。 好了,我们已经明确了全局函数是全局对象的属性,也就说明了前面那句话的错误性。那我为什么又说它也是正确的呢?因为标准里面一提到全局对象就用“The Global Object”,这个独一无二的全局对象连个变量名都没有,是个只知其人不知其名的家伙,因此我们永远都不可能在代码里面直接用这个家伙,那忽略这个对象的存在又有何妨呢?所以我说前面那句话也有一定的正确性。

  OK,接下来我们来研究究竟有哪些全局函数/属性(很多地方就这个问题给了个看似完整的列表,但实际上都不完整,下面我们就完全按照ECMAScript5标准来解释这个问题)。

  1. 值属性

    1.1 NaN

      NaN属性的值是NaN。

    1.2 Infinity

      Infinity属性的值是+∞。

    1.3 undefined

      undefined属性的值是undefined。

    这三个属性是干嘛用的呢——嘛都不干,至少我觉得没毛用,标准里也是一句话带过,存在感太低。

  2. 函数属性

    2.1 一般函数

      2.1.1 eval(x)

       如果x是不是字符串,直接返回x本身;如果x是字符串,则将这个字符串解析为一段ECMAScript代码(如果无法正确解析,抛出错误),然后为这段代码新建一个执行环境并执行这段代码,最后返回执行结果。

      2.1.2 parseInt(string,radix)

      关于这个函数有很多可以说的,限于篇幅这里只提两点:一,parseInt('')和parseInt('null')均返回NaN;二,在JS解析器自动执行强制转型时,执行的是Number()函数而不是parseInt()。

      2.1.3 parseFloat(string)

      和parseInt()最明显的差别就是没有radix参数,也就是说parseFloat()只能按十进制进行数字转换。

      2.1.4 isNaN(number)

      2.1.5 isInfinity(number)

        上面两个函数只要记住才对number尽心强制转型的时候调用的是Number()。

    2.2 处理URI的函数

      2.2.1 decodeURI(encodedURI)

      2.2.2 decodeURIComponent(encodedURIComponent)

      2.2.3 encodeURI(uri)

      2.2.4 encodeComponent(uriComponent)

         JS对URI的处理也不是三言两语就能说清楚的问题,这里就不叙述了,留待日后详细研究。

    2.3 构造函数

     这里就是JS内置类型的构造函数了,它们也都是全局函数,每一个都值得深入探讨,这里只做一个简单罗列:

    Object() Function() Array() String() Boolean() Number() Date() RegExp() Error() EvalError() RangeError() ReferenceError() SyntaxError() TypeError() URIError()

  2.4 其他属性

  其他还有两个:Math和JSON,想必也是耳熟能详的两个家伙,具体研究也就留待日后了。

  好了,到这里一切就很清楚了。按ECMAScript5的标准,如果除去那一大堆构造函数以外,全局函数共有九个,分别是:eval() parseInt() parseFloat() isNaN() isInfinite() decodeURI() decodeURIComponent() encodeURI() encodeURIComponent()。

  OK,ECMAScript5的全局函数到此讲完。

二、浏览器中的JS

  浏览器中的JS是ECMAScript标准的具体实现,它不仅基本符合ECMAScript标准,而且添加了许多在标准之外但有十分有用的特性(这些特性估计早晚也会成为标准的一部分)。就全局对象而言,前面我们说过,在ECMAScript标准的表述中,它是没有名字的,但浏览器给它起了名字——window,用于代表浏览器访问网页的web窗口,想必大家也是耳熟能详。在浏览器中,一切全局函数和变量都是作为window的属性而存在的(window本身也是window的属性,属性值还是window)。window除了具备上面所提到的ECMAScript标准中要求实现的所有属性之外,还添加了N多属性(打开谷歌,按下F12,点击console面板,输入 window. ,出来的那一大堆提示项就是全局属性啦)。这N多属性里面又有N多函数属性,要想一下讲完恐怕得讲个三天三夜了,下面罗列一些我个人认为比较常用的并就此结束此文。

  moveTo() moveBy() resizeTo() resizeBy() open() setTimeout() setInterval() alert() confirm() prompt() console.log()

 

posted @ 2015-06-03 14:27  Reid  阅读(1713)  评论(0编辑  收藏  举报