首页 > vue.js 源代码学习笔记 ----- 工具方法 lang

vue.js 源代码学习笔记 ----- 工具方法 lang

 

 

/* @flow */
// Object.freeze 使得这个对象不能增加属性, 修改属性, 这样就保证了这个对象在任何时候都是空的
export const emptyObject = Object.freeze({})


/*** Check if a string starts with $ or _

ascii unicode 的区别

  

charcodeAt是一个字符的 unicode编码, 但是像 0x24 (代表的是 $ ) 0x5f (代表的是 _ ) 因为是字符, 先存着ascii编码中, 所以用ascii转换



$ _ 作为保留字, 这里判断输入的字符是否是vue可能使用的关键字, 比如 $set _bind 等等*/ export function isReserved (str: string): boolean {const c = (str + '').charCodeAt(0)return c === 0x24 || c === 0x5F }

/*** Define a property.

这里简单的定义一个对象, 定义它的值 和 是否能在for...in循环中遍历出来或在Object.keys中列举出来。
*/ export function def (obj: Object, key: string, val: any, enumerable?: boolean) {Object.defineProperty(obj, key, {value: val,enumerable: !!enumerable,writable: true,configurable: true //注意要设置成true, 否则后面就不能设置value了}) }/*** Parse simple path.

解析简单的路径, 比如 o.corp.$1, 是合法的, 不在正则 bailRE中

而 o.corp.names[0]是不合法的, 会被直接return, 因为对象才能被defineProperty, 数组是不能监听的.

  

  使用

  var path = parsePath('o.corp.$1');

  var obj = { o:{ corp: { $1: 'haha' } } }



path( obj ) ==> 'haha'



这里没有直接用 eval或者 new Function去解析路径, 应该是考虑到用这两个会有性能的损耗, 另外eval在一些浏览器会提示作用域变成全局的, 比较的危险

另外, new Function eval 还可以转换 js语句的字符串, 所以会有一些安全问题, xss注入等
*/ const bailRE = /[^w.$]/



export function parsePath (path: string): any {if (bailRE.test(path)) {return}

//得到一个数组 ['o', 'corp', '$1' ]const segments
= path.split('.')

return function (obj) {for (let i = 0; i < segments.length; i++) {if (!obj) return



    // obj = obj['o'] => obj=obj['o']['corp'] = > obj=obj['o']['corp']['$1'], 这就是不断改变obj的值, 使obj指向自己属性的过程

    // 最后返回 $1的值 'haha'

obj
= obj[segments[i]];}return obj} }

 

转载于:https://www.cnblogs.com/dhsz/p/7064930.html

更多相关:

  • /*js中遍历对象属性*/ function printObject(obj) {var temp = "";for (var key in obj) {temp += key + ":" + obj[key] + " ";}return temp; }/*测试用例*/ var obj = {"a": "1", "b": "2"};...

  • 当使用jquery1.3以上版本时,进行ajax参数传值时,会出现以下的一个错误:  ognl.ExpressionSyntaxException: Malformed OGNL expression: f[] [ognl.ParseException: Encountered " "]" "] "" at line 1, col...

  • 在IssueVision的命令模式中有如下代码(PatternsCommander.cs)  public static void Connect(ToolBarButton button, Command command)  {   ToolBarButtonCommander unused = new ToolBarButto...

  • /*判断屏幕宽高比是否为16:9*/ function isScreen16to9() {return window.screen.height / window.screen.width === 9 / 16; }...

  • /*关闭、刷新、跳转、离开当前网页前提示*/ onbeforeunload = function () {return false; };  ...

  • let json = {/**判断JSON格式*/ isJSON: function (str) {if (typeof str == "string") {try {var obj = JSON.parse(str);if (typeof obj == "object" && obj) {return true;} else {...

  •   项目结构   index.js //必须要安装否则就别想运行了❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤ //npm i body-parser -D & cnpm i express & cnpm i node-xlsx & cnp...

  • 一、递归 函数    为什么要有函数,提高代码的可读性,避免重复的代码,提高代码的复用性      在函数中能用return的不要print 1、递归的最大深度997 def foo(n):print(n)n+=1foo(n) foo(1) 递归的最大深度 2、修改递归的最大深度     由此我们可以看出,未报错之前能看到的最大数...

  • importjava.security.SecureRandom;importjavax.crypto.Cipher;importjavax.crypto.SecretKey;importjavax.crypto.SecretKeyFactory;importjavax.crypto.spec.DESKeySpec;//结果与DES算...

  • 题目:替换空格 请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 输入:s = "We are happy." 输出:"We%20are%20happy." 限制: 0 <= s 的长度 <= 10000 解题: 时间复杂度:O(n) 空间复杂度:O(n) class Solution { public:s...

  • 在C++11标准库中,string.h已经添加了to_string方法,方便从其他类型(如整形)快速转换成字面值。 例如: for (size_t i = 0; i < texArrSize; i++)RTX_Shader.SetInt(string("TexArr[") + to_string(i) + "]", 7 + i);...

  • Ubuntu 14.04安装并升级之后,变成楷体字体非常难看,我昨天搞了一晚上,终于理了个头绪,这里整理一下。 经过网上调研,大家的一致看法是,使用开源字体库文泉驿的微黑字体效果比较理想,甚至效果不输windows平台的雅黑字体。下面我打算微黑来美化Ubuntu 14.04. 1.安装文泉驿微黑字体库 sudo aptitude...

  • 使用string时发现了一些坑。 我们知道stl 容器并不是线程安全的,所以在使用它们的过程中往往需要一些同步机制来保证并发场景下的同步更新。 应该踩的坑还是一个不拉的踩了进去,所以还是记录一下吧。 string作为一个容器,随着我们的append 或者 针对string的+ 操作都会让string内部的数据域动态增加,而动态增加的...