zoukankan      html  css  js  c++  java
  • 解析js字符串

    myEval

    export const evalExp = /[!&|+-*\%=/<>^()~:?;]/g;
    export function myEval(originString: string, context: any) {
        if (!context) return;
        let bindKey = originString;
        bindKey = bindKey.replace(evalExp, " ");
        let bindKeys = bindKey
            .split(" ")
            .map(s => s.trim())
            .filter(e => !!e)
            .filter(e => {
                if (/^['"`]/.test(e)) {
                    return false;
                }
    
                // 过滤布尔值
                if (e === "true" || e === "false") {
                    return false;
                }
    
                // 过滤number
                if (!isNaN(+e)) {
                    return false;
                }
                return true;
            });
        let args = bindKeys.map(s => {
            if (/./.test(s) && /[|]/g.test(s)) {
                let aindex = s.indexOf(".");
                let bindex = s.indexOf("[");
                let index = Math.min(aindex, bindex);
                let obj = s.substr(0, index);
                return obj;
            } else if (/./.test(s)) {
                let aindex = s.indexOf(".");
                let obj = s.substr(0, aindex);
                return obj;
            } else if (/[|]/g.test(s)) {
                let bindex = s.indexOf("[");
                let obj = s.substr(0, bindex);
                return obj;
            }
            return s;
        });
        args = toArray(new Set(args));
        const newArgs: string[] = [];
        let datas = args.map((k) => {
            if (k in context) {
                newArgs.push(k)
                return context[k]
            }
        }).filter(e => !!e);
    
        if (!datas.length) return;
        let funbody = `return function(${newArgs.toString()}) {
           'use strict';
           ${originString};
        }`;
        return Function(funbody)()(...datas);
    }
    

    evalFun

    export function evalFun(bindKey: string, data: any) {
        if (undefinedp(data)) return;
        try {
            const r = Function(`with(this){ return ${bindKey} }`).apply(data, arguments)
            return r === '' ? undefined : r;
        } catch (error) {
    
        }
    }
    

    setData

    export function setData(key: string, newValue: any, contextData: ContextData) {
        if (!stringp(key)) return null;
        return Function(`return function(d) {
            with(this){
              ${key} = d;
            }
          }`)().call(contextData.store, newValue);
    }
    
  • 相关阅读:
    java动态代理机制
    Spring的几种注入bean的方式
    java的泛型与反射机制
    java中equals与==的比较
    Java虚拟机JVM简单理解
    java集合类总结
    timersmanager 解析
    rtsp实时流通过rtmp推送到服务端
    udp 视频包网络传输花屏
    GB28181国检推流
  • 原文地址:https://www.cnblogs.com/ajanuw/p/12073959.html
Copyright © 2011-2022 走看看