美文网首页
《了不起的Node.js》摘要 JavaScripts概览(三)

《了不起的Node.js》摘要 JavaScripts概览(三)

作者: 玖伍2七 | 来源:发表于2019-05-23 13:09 被阅读0次

    V8中的JavaScript

    随着Chrome浏览器的发布,带来了全新的JavaScript引擎V8,它以极快的速度运行,加之时刻保持最新并支持最新ECMAScript特性的优势,快速地在浏览器中占据了重要的位置。
    其中有些特性弥补了语言本身的不足。另外一部分特性的引入则要归功于像jQuery/PrototypeJS这样的前端类库,因为它们提供了非常实用的扩展和工具。

    Object Keys

    要想获取对象的键(a和c):

    var a = {a:'b', c : 'd'}
    for(var i in a){}
    

    通过对键进行迭代,可以将它们收集到一个数组中。不过如果采用如下方式进行过扩展

    Object.prototype.c = 'd'
    

    为了避免在迭代过程中取到c属性,可以通过hasOwnPropterty来进行检查

    for(var i in a){
      if(a.hasOwnPropterty(i){}
    }
    

    或者通过以下方式来检查

    var a  = {a:'b', c : 'd'}
    Object.keys(a);  // ['a', 'c']
    

    Array.isArray

    对数组使用typeof操作符会返回object。然后大部分情况下,我们要检查数据是否真的是数组。
    Array.isArray对数组返回true,否则返回false

    Array.isArray(new Array()) // true
    Array.isArray([]) // true
    Array.isArray(null) // false
    Array.isArray(arguments) // false
    

    数组方法

    要遍历数组,可以使用forEach(类似jQuery的$.each)

    // 打印 1,2,3
    [1,2,3].forEach(function(v){console.log(v)})
    

    要过滤元素使用filter(类似jQuery的$.grep)

    // 返回[1,2]
    [1,2,3].filter(function(v){return v < 3})
    

    要改变值使用map(类似jQuery的$.map)

    // 返回[2,4,6]
    [1,2,3].map(function(v){return v * 2})
    

    V8还对数组提供了一些方法 reduce reduceRight以及lastIndexof.

    字符串方法

    要移除字符串首末的空格,可以使用trim

    ' hello   '.trim() // 'hello'
    'i am a boy'.trim() // i am a boy 中间的空格不会移除
    

    JSON

    V8提供了JSON.stringify和JSON.parse方法来对JSON数据进行解码、编码。
    JSON是一种编码标准,和JavaScript对象字面量很近,它用于大部分WEB服务器和API服务

    var obj = JSON.parse({'a':'b'})
    obj.a == 'b' // true
    

    function.bind

    .bind (类似于jQuery的$.proxy)允许改变对this的引用

    function a(){
      this.hello == 'world'  //true
    };
    var b = a.bind({hello:'world'})
    b() // 与call和apply不同,bin不会立即调用,直接手动调用b()
    

    function.name

    V8还支持非标准的函数属性名:

    var a = function woot() {};
    a.name == 'woot' // true
    

    该属性属于V8内部的堆栈追踪。当有错误抛出时,V8会显示一个堆栈的追踪信息,会告诉你是哪函数调用导致了错误的发生

    var woot = function() {throw new Error()}
    woot()
    

    在上述例子中,v8无法为函数引用指派名字。然而,如果对函数进行了命名,V8就能在显示堆栈时追踪信息时将名字显示出来:

    var woot = function buggy(){throw new Error()}
    woot()
    Error
        at buggly (repl:1:37)
    

    为函数全名有助于调试,因此,推荐始终对函数进行全名。
    实测下来node8.x以后woot就是函数名

    proto

    ____proto____使得定义继承链变理更加容易:

    function Animal(){}
    function Ferret() {}
    Ferret.prototype.__proto__ = Animal.prototype
    

    这样就不用像以往那样借助中间构造器了

    存取器

    你可以通过调用 方法来定义属性,访问属性就是使用 ____defineGetter____设置属性使用__defineSetter____
    比如,为Data对象定义一个属性,返回以自然语言描述的日期间隔。
    比如:发生在三秒前比具体的日期容易理解

    //
    Date.prototype.__defineGetter__('ago', function(){
      var diff = (((new Date())).getTime() - this.getTime()) / 1000),
      day_diff = Math.floor(diff / 86400)
    return day_diff == 0 && (diff < 60 && 'just now' || diff < 120 && '1 minute ago' ||
      diff < 3600 && Math.floor(diff / 60) + 'minute ago' ||
      diff < 7200 && '1 hour ago' ||
      diff < 86400 && Math.floor(diff / 3600) + 'hours ago' ||
      day_diff == 1 && 'Yesterday' ||
      day_diff < 7 && day_diff + 'day ago' ||
      Math.ceil(day_diff / 7) + 'weeks ago'
    })
    

    然后,简单的访问ago属性即可。注意,访问属性实际上还会调用定义的函数,只是这个过程透明了而已:

    var a = new Date('12/12/1990')
    a.ago
    

    相关文章

      网友评论

          本文标题:《了不起的Node.js》摘要 JavaScripts概览(三)

          本文链接:https://www.haomeiwen.com/subject/zdqvoqtx.html