[原创]类似Java语法的Javascript框架js5(v2)

第二版本:

1.添加了 jimport 类似实现java的import关键字

2.jclass的改进:

  • 单个参数为返回查找的类,
  • 第一个参数为""时,产生匿名函数。
  • 从第三个参数到倒数第二个参数为mixin,且所有的mixin将按照顺序传入类定义的闭包函数的第二个参数到最后一个参数。

 

 

附上代码:

 

var Js5 = {version:"5.0.0"};
var __cpackage__;
var __classes__ = {};
var __iclasses__ = {};
var __imports__ = [];

Js5.apply = function(o, c) {
    if (o && c && typeof c == 'object') {
        for (var p in c) {
            o[p] = c[p];
        }
    }
    return o;
};

(function() {

    Js5.apply(Js5, {
        applyIf : function(o, c) {
            if (o) {
                for (var p in c) {
                    if (!Js5.isDefined(o[p])) {
                        o[p] = c[p];
                    }
                }
            }
            return o;
        },
        extend : function() {
            var oc = Object.prototype.constructor;
            return function(sb, sp, overrides) {

                var coverrides = overrides;
                if (!overrides) {
                    coverrides = sp;
                    sp = sb;
                }
                var F = function() {
                },sbp,spp = sp.prototype;
                F.prototype = spp;

                coverrides = coverrides(spp) || {};
                if (!overrides) {
                    sb = coverrides.constructor != oc ? coverrides.constructor : function() {
                        sp.apply(this, arguments);
                    };
                }
                sbp = sb.prototype = new F();
                sbp.constructor = sb;
                sb.superclass = spp;
                if (spp.constructor == oc) {
                    spp.constructor = sp;
                }

                sbp.superclass = (function() {
                    return spp;
                });

                Js5.override(sb, coverrides);  // extend coverrides

                return sb;
            }
        }(),
        mixin:function() {
            var oc = Object.prototype.constructor;
            return function(mixins, sb, sp, overrides) {
                if (!Js5.isArray(mixins)) {
                    mixins = [mixins];
                }
                var coverrides = overrides;
                if (!overrides) {
                    coverrides = sp;
                    sp = sb;
                }
                var F = function() {
                },sbp,spp = sp.prototype;
                F.prototype = spp;
                mixins.unshift(spp);

                coverrides = coverrides.apply(this, mixins) || {};
                if (!overrides) {
                    sb = coverrides.constructor != oc ? coverrides.constructor : function() {
                        sp.apply(this, arguments);
                    };
                }
                sbp = sb.prototype = new F();
                sbp.constructor = sb;
                sb.superclass = spp;
                if (spp.constructor == oc) {
                    spp.constructor = sp;
                }

                sbp.superclass = (function() {
                    return spp;
                });

                Js5.override(sb, coverrides);  // extend coverrides
                mixins.shift();
                Js5.each(mixins, function(mixin) {
                    Js5.applyIf(sbp, mixin);
                });

                return sb;
            }
        }(),
        override: function(origclass, overrides) {
            if (overrides) {
                var p = origclass.prototype;
                Js5.apply(p, overrides);
            }
        },
        /*override : function(origclass, overrides) {
         if (overrides) {
         var p = origclass.prototype;
         overrides = overrides(p.superclass);

         Js5.apply(p, overrides);

         if (Js5.isIE && overrides.hasOwnProperty('toString')) {
         p.toString = overrides.toString;
         }
         }

         },*/
        isString : function(v) {
            return typeof v === 'string';
        },
        isBoolean : function(v) {
            return typeof v === 'boolean';
        },
        isElement : function(v) {
            return !!v && v.tagName;
        },
        isDefined : function(v) {
            return typeof v !== 'undefined';
        },
        isObject : function(v) {
            return !!v && Object.prototype.toString.call(v) === '[object Object]';
        },
        isDate : function(v) {
            return toString.apply(v) === '[object Date]';
        },
        isPrimitive : function(v) {
            return Js5.isString(v) || Js5.isNumber(v) || Js5.isBoolean(v);
        },
        isNumber : function(v) {
            return typeof v === 'number' && isFinite(v);
        },
        isEmpty : function(v, allowBlank) {
            return v === null || v === undefined || ((Js5.isArray(v) && !v.length)) || (!allowBlank ? v === '' : false);
        },
        isArray : function(v) {
            return toString.apply(v) === '[object Array]';
        },
        isIterable : function(v) {
            //check for array or arguments
            if (Js5.isArray(v) || v.callee) {
                return true;
            }
            //check for node list type
            if (/NodeList|HTMLCollection/.test(toString.call(v))) {
                return true;
            }
            //NodeList has an item and length property
            //IXMLDOMNodeList has nextNode method, needs to be checked first.
            return ((typeof v.nextNode != 'undefined' || v.item) && Js5.isNumber(v.length));
        },
        each : function(array, fn, scope) {
            if (Js5.isEmpty(array, true)) {
                return [];
            }
            if (!Js5.isIterable(array) || Js5.isPrimitive(array)) {
                array = [array];
            }
            for (var i = 0, len = array.length; i < len; i++) {
                if (fn.call(scope || array[i], array[i], i, array) === false) {
                    return i;
                }
            }
            return [];
        },
        namespace : function() {
            var o, d;
            Js5.each(arguments, function(v) {
                d = v.split(".");
                o = window[d[0]] = window[d[0]] || {};
                Js5.each(d.slice(1), function(v2) {
                    o = o[v2] = o[v2] || {};
                });
            });
            return o;
        },
        nameclass:function(c) {
            if (__classes__[c]) return __classes__[c];
            var d = c.split(".");
            var o = window[d[0]] = window[d[0]] || {};
            Js5.each(d.slice(1, d.length - 1), function(v2) {
                o = o[v2] = o[v2] || {};
            });
            return __classes__[c] = o[d[d.length - 1]];
        },
        importclass:function(c) {
            if (__classes__[c]) return __classes__[c];
            if (__iclasses__[c]) return __iclasses__[c];

            var d = c.split(".");
            var o = window[d[0]] = window[d[0]] || {};
            var name = d[d.length - 1];
            Js5.each(d.slice(1, d.length - 1), function(v2) {
                o = o[v2] = o[v2] || {};
            });
            if (o[name]) {
                o = __classes__[c] = o[name];
            } else {
                Js5.each(__imports__, function(i) {
                    if ((o = i[name])) {
                        return false;
                    }
                });

                __iclasses__[c] = o;
            }

            return o;
        }
    });

    Js5.ns = Js5.namespace;
})();


/**
 * p1:String ==>package name
 * p2..p-1,Object ==>imports
 * p-1,function ==> package body
 */
function jpackage() {
    var l = arguments.length,i = 0;
    if (l == 0) return;
    var pkf = arguments[l - 1];
    if (Js5.isString(arguments[0])) {
        __cpackage__ = Js5.namespace(arguments[0]);
        i = 1;
    } else {
        __cpackage__ = window;
        i = 0;
    }
    var args = [],vs,ip;
    Js5.each(Array.prototype.slice.call(arguments, i, l - 1), function(v) {
        if (Js5.isString(v)) {
            vs = v.split(";");
            Js5.each(vs, function(v2) {
                if (v2.substr(-2) == ".*") {
                    ip = Js5.namespace(v2.substring(0, v2.length - 2));
                    __imports__.push(ip);
                    args.push(ip);
                } else {
                    args.push(Js5.importclass(v2));
                }
            });
        } else if (Js5.isArray(v)) {
            args = args.concat(v);
        } else {
            args.push(v);
        }
    });
    pkf.apply(__cpackage__, args);

    __cpackage__ = null;
    __imports__ = [];
    __iclasses__ = {};

}

function jimport() {
    var args = [],vs,ip;
    __imports__ = [];
    __iclasses__ = {};
    Js5.each(arguments, function(v) {
        if (Js5.isString(v)) {
            vs = v.split(";");
            Js5.each(vs, function(v2) {
                if (v2.substr(-2) == ".*") {
                    ip = Js5.namespace(v2.substring(0, v2.length - 2));
                    __imports__.push(ip);
                    args.push(ip);
                } else {
                    args.push(Js5.importclass(v2));
                }
            });
        } else if (Js5.isArray(v)) {
            args = args.concat(v);
        } else {
            args.push(v);
        }
    });
    return args;
}
/**
 * p1:String ==>class name
 * p2,String ==>same package;Object
 * p3,function ==>
 */
function jclass() {
    var l = arguments.length,i = 0;
    if (l == 0) {
        throw new Error("[jclass] invalid arguments");
    }

    if (l == 1) {
        return Js5.importclass(arguments[0]);
    }

    var clf = arguments[l - 1];

    var c;
    if (Js5.isString(arguments[0])) {
        c = __cpackage__;
    } else {
        c = window;
    }

    var p;
    if (l >= 3) {
        var name = arguments[1];
        if (Js5.isString(name)) {
            p = __cpackage__[name];
            if (!p) {
                p = Js5.importclass(name);
            }
        } else {
            p = arguments[1];
        }
    } else {
        p = Object;
    }
    if (!p) {
        throw new Error("[jclass] unrecognized parent class");
    }
    var mixins = [];

    if (l >= 4) {
        var vs;
        var mc;
        Js5.each(Array.prototype.slice.call(arguments, 2, l - 1), function(v) {
            if (Js5.isString(v)) {
                vs = v.split(",");
                Js5.each(vs, function(v2) {
                    mc = Js5.importclass(v2);
                    if (mc) {
                        mixins.push(mc.prototype);
                    }

                });

            } else {
                mixins.push(v.prototype);
            }
        });
    }

    var cls = Js5.mixin(mixins, p, clf);

    if (arguments[0]) {
        c[arguments[0]] = cls;
    }


    return cls;
}

function jnew() {
    var l = arguments.length,i = 0;
    if (l == 0) return {};

    var args = Array.prototype.slice.call(arguments, 1);

    var name = arguments[0];

    var cls;
    if (Js5.isString(name)) {
        if (__cpackage__ && __cpackage__[name]) {
            cls = __cpackage__[name];
        }

        if (!cls) {
            cls = Js5.importclass(name);
        }
        if (!cls) {
            throw new Error("[jnew] unrecognized  class");
        }
    } else {
        cls = name;
    }


    /*var temp = function() {
     };

     var constructor = cls.prototype.constructor;
     var instanceCls = function() {
     return constructor.apply(this, args);
     };

     temp.prototype = cls.prototype;
     instanceCls.prototype = new temp();
     instanceCls.prototype.constructor = instanceCls;

     return new instanceCls();*/

    var obj = {};
    Js5.override(obj, cls);
    obj.__proto__ = cls.prototype;
    cls.apply(obj, args);
    return obj;


}

 

例子:

  var jui = {};

  jpackage("jui", function() {

    jclass("Component", function() {
      return {
        constructor:function(x) {
          console.log("Component:" + x);
        },
        show:function() {
          console.log("Component");
        }
      }
    });

    jclass("Container", "Component", function(_supr) {
      return {
        constructor:function(x) {
          console.log("Container:" + x);
          _supr.constructor.call(this, x);
        }
      };
    });

  });

  jpackage("jui", function() {

    jclass("Window", "Container", function(_supr) {
      return {
        show:function() {
          console.log("Window");
        }
      }
    });

  });

  jpackage("jui.form", function() {

    jimport("jui.*");

    jclass("TextField", "Component", function(_supr) {
      return {
        show:function() {
          console.log("TextField");
        }
      }
    });


  });

  jpackage("js5.util", function() {

    jclass("Observable", function(_supr) {
      return {
        constructor:function() {
          console.log("Observable.constructor");
        },
        on:function() {
          console.log("Observable.on");
        },
        show:function() {
          console.log("Observable.show");
        }
      }
    });

  });

  jpackage("jui.ex", jimport("jui.Window;jui.*;jui.form.*"), function(_W, j) {

    jclass("Window", "jui.Window", "js5.util.Observable", function(_supr, _ob) {
      return {
        constructor:function(x) {
          console.log("jui.ex.Window.constructor");
          _supr.constructor.call(this, x);
          _ob.constructor.call(this);
        },
        show:function() {
          console.log("Window Ex");
          _supr.show();
        }
      }
    });

    var MyWindow = jclass("", "jui.Window", function() {

      return {
        show:function() {
          console.log("anonymous myWindow");
        }
      }
    });

    var x = jnew("Window", "package jui.ex.Window");
    x.show();
    x.on();

    x = new MyWindow();
    x.show();

    jclass("jui.Window").superclass.constructor.call(this, "111111111111")


    x = jnew(jui.Window, "jui.Window : new in package, use complete class path");
    x.show();

    x = new jui.Window("jui.Window : new in package, use complete class path");
    x.show();

    x = jnew("jui.Window", "jui.Window: new in package, use complete class path");
    x.show();

    x = new j["Window"]("jui.Window: new in package, use import jui.*");
    x.show();

    x = new _W("jui.Window:  new in package, use import jui.Window");
    x.show();

    for (var i = 1; i <= 5; i++) {
      x = jnew("TextField", "jui.form.TextField  new in package,use import jui.form.*");
      x.show();
    }


  });

  var x = jnew("jui.ex.Window", "global jui.ex.Window");
  x.show();
 
JavaScript基础语法学习总结(完结) 一、初识JavaScript 1. JavaScript概述 Java是世界上最流行的语言之一,是一种运行在客户端的脚本语言(Script是脚本的意思) 脚本语言:不需要编译,运行过程中由js解释器(js引擎)逐行来进行解释并执行 现在也可以基于Node.js技术进行服务器编程 2. JavaScript的作用 表单动态校验(密码强度检测)(JS产生最初的目的) 网页特效 服务端开发(Node.js) 桌面程序(Electron) App(Cordova) 控制硬件-物联网(Ruff) 游戏开发(co 阅读详情

相关推荐

【进阶】【JS逆向爬虫】【1.JavaScript 基础语法】初始JavaScript

初始JavaScript 1.JavaScript 概述 2.JavaScript 的作用 3.浏览器执行 JS 简介 4.JS 的组成 ECMAScript DOM ——文档对象模型 BOM ——浏览器对象模型 5.JavaScript 运行过程

weixin_43612602的博客 1531

[原创]类似Java语法的Javascript框架js5,实现jpackage,jimport,jextends,jclass,jnew

终于到java的关键字package,import,extends,class,new实现了一遍。 代码为证:     var Js5 = {version:"5.0.0"}; var __cpackage__; var __gclasses__ = {}; var __iclasses__ = {}; var __imports__ = []; Js5.apply = ...

ESR 研发中心 222

Clang Static Analyzer 使用教程:本地 + CMake + GitHub Actions 自动静态分析实战

本文介绍了ClangStaticAnalyzer静态代码分析工具的使用方法。该工具基于Clang/LLVM,可检测C/C++代码中的内存泄漏、空指针等常见错误。主要内容包括:安装指南(Ubuntu/macOS/Windows)、命令行使用方法、CMake项目集成方案、GitHub Actions自动化分析配置,以及HTML报告生成与查看。文章还提供了官方资源链接,帮助开发者系统掌握从本地调试到持续集成的完整静态分析工作流,提升代码质量保障能力。适用于需要在开发过程中实施静态分析的C/C++项目。

u014358031的博客 2158

JS中和java语法相近的用法和语句

Js 的引入方式 <!—[1]JS 引入的方式一--> <script type="text/javascript"> /*网页中的弹框*/ alert("js 的学习课程"); </script> <!--[2]js引入的方式二 type:引入文件的类型 src: 引 入文件的路径 charset:指定引入的编码--&gt...

赵广陆 1098

Amesim(五):单个悬架系统搭建

一、组成 单个悬架系统组成包括:端子,质量块*2,弹簧,阻尼器,速度路面反馈,路面激励。 二、搭建 打开Amesim,在 library 选择 1D Mechanical 选择质量模块,添加到skech中,并按 ctrl+r 旋转质量块,将箭头朝上,设置规定的力传递正方向 添加弹簧阻尼器,与质量块连接 添加VX模块,将路面的激励传递转化为速度和位移,传递给悬架系统 在...

林小川的博客 7169

matlab电偶极子源码,电偶极子的MATLAB场模拟

电偶极子周围电场电势分布的MATLAB三维模拟Matlab可以用于模拟四维场的效果,本文以电偶极子的电场和电势场为例展示MATLAB在该方面领域的应用。摘要电偶极子由一个正电荷和一个负电荷组成,其电场和空间电势分布与单电荷相比具有一些重要的特性。本文将给出电场和电势场的近似表达式。这两个量的精确表达式是复杂的,不太常用,因此 MATLAB 被采用来操作精确值和绘制三维分布的远区域, 近区域和一侧区...

weixin_35135480的博客 3150

JavaScript基础语法入门

介绍JavaScript的基础语法, 包含变量, 运算符, 数据类型, 数组, 函数,对象等内容, 主要是基于Java/C基础进行的扫盲学习.

trong_ 的烂笔头 3975

《AI大模型评测与智能测试》

第三篇“实践蓝图”(第6-7章)着眼于测试领域AI应用,重点介绍了RAG、AI Agent开发及构建端到端智能测试系统的方法。本书聚焦AI时代的“质量”核心,以“AI赋能测试”(AI For Testing)与“AI模型评测”(Testing For AI)为双轮驱动。内容不仅深入剖析如何科学度量AI大模型的内在质量,还系统讲解如何利用AI赋能传统软件测试,帮助读者贯通从模型原理、评测到应用开发的全链路知识。

酌沧 1140

[原创]类似Java语法的Javascript框架js5

最近闲来无事,写一个类似Java的语法的Javascript框架js5,欢迎大家指正:   已出第二版本:http://openxtiger.iteye.com/blog/1707172   主代码:     var Js5 = {version:"5.0.0"}; var __cpackage__; var __classes__ = {}; var __imports__ ...

ESR 研发中心 216

InTouch历史报警与操作记录高效查询控件V4.0实战指南(一键下载即用)

本文详细介绍了InTouch历史报警与操作记录高效查询控件V4.0的实战应用。该控件针对原生AlmDbViewCtrl控件的查询效率低下、功能单一等问题,提供了智能查询、可视化统计、视图定制和一键导出Excel等强大功能,旨在帮助工程师快速处理海量历史数据,大幅提升工控运维效率。

g9h0i1的博客 960

银行监管报送系统介绍(十五):金融审计平台

金审平台主要包括基础、财务、结算、信贷和中间业务五大板块,主要服务于审计署对中国银行的各项审计任务,同时也可为行内审计、稽核检查、数据分析、总分行提供基础数据服务,为实现基础数据共享提供了有力的数据保障。2019年1月某全国性股份制商业银行收到审计署2019-23号文,文中指出为进一步提高审计数据质量,审计署审计组派员前往9家重点商业银行,就完善标准化数据的相关情况与各银行有关部门进行讨论协商。关于数据报送频率及报送内容:数据从2019年4月开始,按月报送,即于每月25日之前报送上月数据;

银行信息系统应用架构详解 2055

D3.js的v5版本入门教程(第一章)—— 如何在项目中使用D3.js

D3.js的v5版本入门教程(第一章)     1、需要的一些工具         这个其实随便!最简单的就是建一个.txt文件就可以敲起代码来!作者本人用的是myeclipse(主要需要安装tomcat),因为写的是前端,一个浏览器查看效果当然是不可少的,建议使用chrome 浏览器,其强大的调试功能可以让你事半功倍!     2、需要预备的知识         如果你是编程小白,那么这...

数星星等天明的博客 2万+

069、PCIE属性字段:缓存、顺序与安全

上个月调试一块自研的PCIE采集卡,遇到了一个诡异的问题:主机通过DMA从设备读取图像数据,大部分帧正常,但偶尔会出现局部数据错位,像是缓存没刷干净。用逻辑分析仪抓链路层报文,发现TLP(事务层包)本身完好,但内存中的数据就是不对。排查三天后,终于锁定在设备端TLP的**属性字段(Attribute Field)**配置上——那几位看似不起眼的缓存、顺序控制位,差点让项目延期。今天我们就拆解PCIE事务头中的这个关键区域,看看它如何影响系统性能与数据安全。

z534437748的博客 50

JavaScript基础语法 JavaScript 的对象和 Java 的对象的区别

JavaScript基础语法1.初始JavaScript1.1 简单介绍1.2 JS 能做的事情1.3 JS 、HTML 和 CSS 的关系1.4 JS运行过程2. JavaScript的组成3.基于JavaScript 实例3.1 用 JavaScript 输出文本3.2 用 JavaScript 改变HTML元素3.3 JavaScript 用法3.3.1 1.初始JavaScript 1.1 简单介绍 简称 JS 是世界上最流行的编程语言之一 是一个脚本语言,通过解释器运行 主要是在客户端(浏

weixin_45939887的博客 3387

[明道云] -基础教学1- 创建第一个工作表:从 0 到实用

明道云工作表相当于数据库表,是存储业务数据的核心组件。创建工作表主要有两种方式:1)从空白新建,通过添加字段(最多200个)、设置属性、配置表单样式;2)从Excel导入,需选择sheet、配置字段映射。创建后系统自动生成默认视图,支持多种视图形式(看板/日历等)。建议设置合适的标题字段和关联关系,初学者可在一小时内完成基础应用搭建。后续可扩展权限控制、工作流自动化等功能。

每日出拳老爷子的博客 556

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Node.js详解(二):Node.js与JS的关系

是 Node 选择了 JavaScript,不是 JavaScript 发展出来了一个 Node。 NodeJS的作者说,他创造NodeJS的目的是为了实现高性能Web服务器,他首先看重的是事件机制和异步IO模型的优越性,而不是JS。但是他需要选择一种编程语言实现他的想法,这种编程语言不能自带IO功能,并且需要能良好支持事件机制。JS没有自带IO功能,天生就用于处理浏览器中的DOM事件,并且拥有一大群程序员,因此就成为了天然的选择。

Java+GO+JS全栈工程师-鹤冲天的博客:编程辅导~商务合作~技术交流 3869

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Electron学习一:Electron、Node.js、JavaScript、JQuery、Vue.js、Angular.js的不同

结论 这些技术,成就JavaScript大法,全面实现JavaScript语言在Web、桌面、移动、服务器等领域应用。 JavaScript是一种脚本编程语言,常用在浏览器前端页面动态效果实现,而Node.js提供一整套服务器端JavaScript运行时环境,使JavaScript语言可以实现类似PHP的服务器端编程。 Electron是跨平台的桌面应用开发框架,编程语言是JavaS

壹零Boy-MePlusPlus(米加加)的博客 5091

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【前端】5. JavaScript(基础语法)

对JavaScript的基础语法的学习,包括发展历史,js/css/html三者的关系,组成,书写形式,注释,输入,输出,变量,运算符,条件,循环,数组,函数,对象等内容。快来看看吧!

哈茶的博客 1058

JavaScript系列之JS入门基本语法

JavaScript系列之JS入门/基本语法 01 JavaScript入门 JavaScript是一门基于对象和事件驱动的,并具有安全性能的脚本语言 常见误区:我们通常见名猜意会认为JavaScript与Java有所联系,而事实上,JavaScript除了语法上有点像Java,其他部分基本上没啥关系。 JavaScript发展过程中的关键节点 1995年,网景公司的Brendan Eich只...

DOGIOOH的博客 357

es、js、nodejs傻傻分不清楚?(ECMAScript、JavaScript、nodejs的区别和联系)

目录ECMAScript、JavaScript、nodejs的区别和联系ECMAScriptJavaScriptNode.js联系js与nodejs的区别js引擎简单介绍 ECMAScript、JavaScript、nodejs的区别和联系 首先简单介绍一下: ECMAScript 定义了语法,这是写JavaScript和nodejs都必须遵守的 语法包含变量定义、循环、判断、函数,原型和原型链、作用域和闭包、异步 不能操作DOM,不能监听click事件,不能发送ajax请求 不能处理http请求,

BIGDgreen 2120

【前端】JavaScript(基础语法)

如果一个变量没有被初始化过,结果就是underlined,是underlined类型。var a;underlined和字符串进行相加,结果进行字符串拼接。underlined和数字进行相加,结果为NaN。

2301_79719531的博客 1897

nodejs和js的关系

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,是一个让 JavaScript 运行在服务端的开发平台,它让 JavaScript 成为与PHP、Python、Perl、Ruby 等服务端语言平起平坐的脚本语言。 JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言。js(JavaScript)是一种高级的、解释型的编程语言;它是一门基于原型、函数先行的语言,是一门多范式的语言,它支持面向对象编程,命令式编程,以及函数式编程。更多Java学

m0_67659981的博客 2022
上一篇: [原创]类似Java语法的Javascript框架js5
下一篇: [原创]类似Java语法的Javascript框架js5,实现jpackage,jimport,jextends,jclass,jnew
staffrobot
博客等级 码龄19年 6粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值