前言

创建一个map,返回一个检查key是否在map中的函数

主要用途: 判断标签是原生组件还是自定义组件,直接通过map这种key-value一一对应的数据结构,实现快速判断

  /**
   * Make a map and return a function for checking if a key
   * is in that map.
   */
function makeMap (
    str,
    expectsLowerCase
  ) {
    var map = Object.create(null);
    var list = str.split(',');
    for (var i = 0; i < list.length; i  ) {
      map[list[i]] = true;
    }
    return expectsLowerCase
      ? function (val) { return map[val.toLowerCase()]; }
      : function (val) { return map[val]; }
  }

参数解释

str:(字符串类型)

所传入需要创建map的字符串

expectsLowerCase:(布尔型)

是否需要全部转为小写——也就是说,str中出现非小写字母 则不需要

若没传,则为undefined为falsy——假值(也就不会触发小写转换方法)

源码解释

首先通过Object.create创建一个对象,将传入的字符串str以,分隔,生成一个list数组

对list数组进行循环,通过[list[i]]创建一个key-value的map

  • key:为字符串类型
  • value:全部为true——布尔类型

判断函数参数expectsLowerCase是否true

  • true——返回一个忽略大小写,判断key是否存在的函数
  • false——返回一个判断key是否存在的函数

源码疑问

为什么这里使用Object.create创建一个对象,而不直接使用{ }创建呢?

我们来做一个实验就明白了

这里直接用浏览器的控制台实验

var objA = Object.create(null)

首先我们创建一个objA——通过Object.create(null)

打印出来看看

然后在创建一个objB,直接赋值{}

我们发现直接通过Object.create(null)创建的东西,十分干净,也不存在原型链和原型方法

而通过{ }创建出来的东西,很明显出现了很多不需要的属性

小结:

使用Object.create条件:

  • 需要一个非常干净和高可定制的对象
  • 无需使用Object原型链中的方法

在其他正常情况下,直接使用{ }即可

很显然,源码这里是需要创建一个非常干净的对象,从而使用的Object.create方法

为什么使用[ ]访问属性

对象获取属性的方法有两种,当然还可以直接使用对象解构获取属性

  • 点属性访问器
  • 方括号属性访问器

我们做一个实验区别两者,看看为啥尤大大要这么使用

首先我们先创建一个obj

var objA = Object.create(null)

访问不存在的属性

当我们使用点属性访问器访问一个不存在的属性时,结果是undefined

现在试试使用方括号访问器试试

没想到居然直接报错了

报错的信息是x 没被定义,看来是把x当成变量了

那我们直接使用字符串试试

结果居然也和.访问结果一致了!!

动态创建属性

现在我们使用点属性访问器去创建一个不存在的属性时

使用方括号属性访问器创建时,结果一致

通过变量访问

定义一个temp变量,存放我们需要访问的key

var temp = 'x'

我们现在使用.访问这个变量

结果居然发现,这个东西的结果和访问不存在属性一样

而通过[]访问时

结果就是访问temp所代表的x

小结:

点属性访问器:

  • 直接访问.后面的值——因此不支持变量访问

方括号属性访问器

  • 访问不存在变量时,若不是变量,需要以字符串形式出现
  • 支持变量访问

当然因为这里是需要直接动态的获取数组的内容,相当于

  • 需要动态的创建一个不存在的
  • 属性属性是一个变量

因此,选择使用方括号属性选择器

到此这篇关于Vue源码makeMap函数深入分析的文章就介绍到这了,更多相关Vue makeMap函数内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

Vue源码makeMap函数深入分析的更多相关文章

  1. HTML实现代码雨源码及效果示例

    这篇文章主要介绍了HTML实现代码雨源码及效果示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 源码推荐:简化Swift编写的iOS动画,iOS Material Design库

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  4. swift皮筋弹动发射飞机ios源码

    这是一个款采用swift实现的皮筋弹动发射飞机游戏源码,游戏源码比较详细,大家可以研究学习一下吧。

  5. swift 写的app 源码,保存一下下

    http://www.topthink.com/topic/3345.htmlhttp://www.csdn.net/article/2015-01-09/2823502-swift-open-source-libs

  6. swift 源码网站 code4app

    http://code4app.com/ios/HTHorizontalSelectionList/54cb2c94933bf0883a8b4583http://123.th7.cn/code/DMPagerViewController_2522.html

  7. OpenStack Swift源码导读:业务整体架构和Proxy进程

    OpenStack的源码分析在网上已经非常多了,针对各个部分的解读亦是非常详尽。其中proxy是前端的业务接入进程。account、container和object目录分别是账户、容器和对象的业务处理逻辑进程。各个业务进程或模块之间的逻辑关系可以参考《OpenstackSwift简介》文中的架构图。在《OpenstackSwift简介》从理论上面介绍了具体的节点寻找过程。

  8. 源码推荐(7.21):顶部滑动菜单FDSlideBar,Swift版无限循环轮播图

    顶部滑动菜单FDSlideBarFDSlideBar是一个顶部滑动菜单,如常见的网易、腾讯新闻等样式。菜单间切换流畅,具有较好的体验性。测试环境:Xcode6.2,iOS6.0以上Swift版无限循环轮播图无限循环轮播图片点击代理可设置图片Url的数组Url和本地图片混合轮播测试环境:Xcode6.2,iOS7.0以上弹幕系统实现--QHDanumuDemo说明:QHDanmu文件夹下是主要的弹幕模块系统,QHDanmuSend文件夹下是简单的发射弹幕的界面。

  9. openstack swift和wsgi源码分析1 HTTP请求处理过程

    分析proxy-server代理服务的执行流程,其他的三个主要服务accountserver,containerserver,objectserver执行过程通proxyserver类似。入口函数调用run_wsgi,此函数完成以下工作:下面重点研究下process_request函数是如何把消息转化为HTTP的request对象这一过程。process_request函数,生成HttpProtocol对象,并执行init操作,注意,HttpProtocol对象自身没有init函数,所以会调用父类的父类的

  10. fir.im Weekly - 进击的 Swift

    最近Swift开源了,众开发者们欢呼雀跃。本期fir.imWeekly准备了一些关于Swift的“新鲜”干货分享,也包括一些优秀的GitHub源码、开发工具和技术文章等等。同时,苹果启用了新的官网:Swift.org,Swift的GitHub主页:https://github.com/apple/swiftSwift3API设计准则勤快的@星夜暮晨翻译了苹果Swift官方网站博客的一篇文章:Swift3APIDesignGuidelines,了解Swift3特性,希望对你有所帮助。如何在iOS中实现一个可

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部