从后端走向前端 Web 发展初期 在 Web 发展初期,前后端是如何协作的呢? 纵观 Web 发展史,从模板引擎到 ajax、从后端路由到前端路由,这一路走来,技术重心已逐渐转移到前端。 从前端走向全端 Node.js 2009年2月,一位名叫 Ryan Dahl 的开发者在博客上宣布准备基于 Google V8 引擎创建一个轻量级的 Web 服务,并为之提供一套组件库。 小程序 这几年来,随着各种 小程序 的问世,Web 前端技术早已超脱了浏览器和 Hybrid 应用的范围。前端工程师很容易基于已有技术栈快速上手和开发小程序类微应用。 electron 在移动端进行布局的同时,前端工作者们还把目光放到了桌面客户端上。
比如说思考一下这个问题:前端到底是个什么神仙工作,说起来也从事前端开发好几年了,但是真正在这里面收获的有什么东西么? 好像有,又好像没有。 再后来,移动互联网兴起之后,又出现了大前端的概念。 而泛前端是我早上出门的时候忽然想起来的一个词。刚才搜索了一下,其实网上也有这个概念,这里只谈一下我对它的理解。 前端的概念不在仅仅局限于我们日常开发中的网站,管理后台,小程序,游戏等等,其他的软件以及硬件设备,都可以称之为前端。 从而沉淀出一些对项目的日后的发展有借鉴意义的技术,这个也可以理解为前端的范畴。 前端只是前端,大前端可以理解为全端,而泛前端则是对前端以及大前端的深化。
泛函编程和数学方程式解题相似;用某种方式找出问题的答案。泛函编程通用的方式包括了模式匹配(pattern matching)以及递归思维(Recursive thinking)。 | case 2 => "Error number 2." 4 | case 3 => "Error number 3." 5 | case _ => "Unknown error! 看看引用情况: 1 reportError(2) 2 res3: String = Error number 2. 3 4 scala> reportError(-1) 5 res4: String * (2 * factorial(1))) 5 4 * (3 * (2 * 1)) = 24 可以得出预料的答案。 虽然从表达形式上失去了泛函编程的优雅,但除了可以解决堆栈溢出问题外,运行效率也比递归方式优化。但这并不意味着完全违背了“不可改变性”(Immutability)。因为变量是锁定在函数内部的。
参考文章:Java 中的泛型(两万字超全详解)_java 泛型-CSDN博客 泛型绝对要注意的一点 在java中,我们无法直接实例化泛型的类型参数对象. 1.当我们在创建一个 ArrayList< Integer > 泛型集合的时候,ArrayList 可以看作是演唱会场馆,而< T >就是场馆的验票系统,Integer 是验票系统设置的门票类型; 2. arrayInteger.get(0);// 这条代码底层如下: //(1)get() 方法的返回值返回的是 Object 类型 Object object = arrayInteger.get(0); //(2) ,其内的所有泛型信息都会被擦除,并且类型参数 T 会被统一替换为其原始类型(默认是 Object 类,若有 extends 或者 super 则另外分析); 2.在泛型信息被擦除后,若还需要使用到对象相关的泛型信息 这是因为Java的泛型是在编译时期进行类型擦除的,即在运行时泛型信息被擦除,只保留原始类型,我们不清楚其原本的具体类型。因此,编译器不允许直接创建泛型对象。
泛型 Generic 泛型类 写一个泛型类 语法:类名 T就代表数据类型的占位符 运行的时候要表示一种引用类型,不可以是实际类型,同时可以写多个占位符,用逗号隔开即可。 使用泛型创建变量 还可以添加方法作为方法的参数 还可以使用泛型作为方法的返回值 需要注意 的是不同泛型对象不能相互 复制。 写一个泛型接口 是不能使用泛型创建 静态常量的,即不能new这个泛型。 由于接口是不能实例化的,所以需要写一个实现类。 在实现接口的时候必须在使用的 时候必须写清楚什么类。 联动泛型类和泛型接口。 泛型方法 如果是T那么就是就是返回T 类型的,void就不返回 就可以了。 泛型好处 泛型集合 参数化的类型、类型安全的集合,强制集合元素的类型必须一致。
2、泛型初体验:一个被举了无数次的栗子 List arrayList = new ArrayList(); arrayList.add("aaaa"); arrayList.add(100); for * 2)只有声明了<T>的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法。 * 3)<T>表明该方法将使用泛型类型T,此时才可以在方法中使用泛型类型T。 2,"ds"); // 1 // 2 // ds } static class B <T>{ T t; public void go () <Integer>泛型类型的,只能存储整数,最后,我们通过list1对象和list2对象的getClass()方法获取他们的类的信息,最后发现结果为true。 2、类型擦除后保留的原始类型 原始类型 就是擦除去了泛型信息,最后在字节码中的类型变量的真正类型,无论何时定义一个泛型,相应的原始类型都会被自动提供,类型变量擦除,并使用其限定类型(无限定的变量用Object
相关博客: Web前端学习笔记【1】 ---- 1. this在 JavaScript 中主要有以下五种使用场景 ---- 在全局函数调用中,this 绑定全局对象,浏览器环境全局对象为 window = { test: 'obj2test', getAge2: function () { console.log(this.test) } } return obj2; } }; obj.getAge().getAge2() // 'obj2test' // ============== var obj = { birth :@&=+$#")); 输出: http%3A%2F%2Fwww.w3school.com.cn http%3A%2F%2Fwww.w3school.com.cn%2Fp%201%2F %2C%2F globalStorage 使用于Firefox2+的火狐浏览器,类似于IE的userData。 缺点:IE不支持。
使用path来匹配路由,然后通过query来传递参数,这种情况下 query传递的参数会显示在url路由的两种模式 hash与history 对于Vue 这类渐进式前端开发框架,为了构建SPA(单页面应用 ),需要引入前端路由系统,这也就是Vue-router存在的意义。 前端路由的核心,就在于改变视图的同时不会向后端发出请求。 添加验证码2. 日常工作中用的最对的跨域方案是CORS和Nginx反向代理前端工程化webpack配置,webpack4.0有哪些优化点module.exports={entry: {},output: {},plugins
不论是什么样的前端面试,总会问到的一个问题:前端性能优化。相信如果这个问题没有答好,在面试中会很被动。于是,趁着这个天天宅的时期,好好的整理了一番。 、CSS代码可以内嵌在HTML中,比如:rem动态等5、避免使用iFrame6、使用骨架屏二、CSS优化加载优化1、避免使用css的@import2、避免使用通配符3、避免使用! 1、选择器嵌套尽量不要超过三层2、id选择器尽量不要嵌套3、使用继承体积优化1、提取公共CSS三、JS优化运行速度1、如果没有兼容问题,尽量使用原生方法2、根据兼容浏览器的最低版本,考虑是否使用polyfill3 (Webpack拆包)减少加载体积1、压缩图片2、压缩HTML、CSS、JS代码3、开启网络压缩,如:GZIP参考 前端进阶面试题详细解答减少加载次数1、制作精灵图2、将小图片转换为base64字符串3 、使用浏览器缓存4、使用前端缓存,如: LocalStorage、Cookie、SessionStorage等5、减少重定向请求,比如:nginx反向代理的重定向6、避免使用服务端字体五、React性能优化
boy1.arr.push(2); console.log(boy1.arr,boy2.arr);// [1,2] [1] // 缺点1:方法不能复用 console.log(boy1.say == = boy2.say) // false (说明,boy1和boy2 的say方法是独立,不是共享的) // 缺点2:不能继承父类原型上的方法 Parent.prototype.walk = function 实现步骤: Step1: 创建 callback 方法 Step2: 插入 script 标签 Step3: 后台接受到请求,解析前端传过去的 callback 方法,返回该方法的调用,并且数据作为参数传入该方法 Step4: 前端执行服务端返回的方法调用。 原因就在于 f1 是 f2 的父函数,而 f2 被赋给了一个全局变量,这导致 f2 始终在内存中,而 f2 的存在依赖于 f1,因此 f1 也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage
child: Child } data = { list: [{id: 1, title: 'title1'}, {id: 2, title: 'title2'}] } } </script> data = { a: 1 } //计算属性aPlus,在脚本中可通过this.aPlus来引用,在模板中可通过 { components = {}; data = {}; methods = {}; events = { 'some-event': (p1, p2,
(这是当今较常见的定义) 2.在程序编码中一些包含参数的类。其参数可以代表类或对象等等。 2.创建泛型类,可在编译时创建类型安全的集合 3.避免装箱和拆箱操作降低性能,在大型集合中装箱和拆箱的影响非常大. list1.Add(3); list1.Add(105); System.Collections.ArrayList list2 = new System.Collections.ArrayList(); list2.Add("科比"); list2.Add("詹姆斯"); ArrayList 下面是一些基础的泛型类型 1.泛型类 class MyGenericClass<T> { //...... } 2.泛型接口
Student<Int> = Student(18) student2.log() } 执行结果 : item : Tom item : 18 二、泛型参数 ---- 通常情况下 , 泛型参数 Student<Int> = Student(18) student2.log() } 执行结果 : item : Tom item : 18 三、泛型函数 ---- 函数 的 参数 或 返回值 Student<Int> = Student(18) println(student2.logT(student2.item)) } 执行结果 : item : Tom Tom item : Student<Int> = Student(18) println(student2.logT {true}) } 执行结果 : student 实例对象中 , 泛型 T 的实际类型是 String 类型 , 在 logT 中 泛型 R 的类型是 Double 类型 ; student2 实例对象中 , 泛型 T 的实际类型是 Int 类型 , 在 logT 中 泛型 R 的类型是 Boolean
这个文件就是我们一会要写的样式文件,为了展示不带样式的页面,我先把这行注释掉了,那这段代码用chrome打开截图如下: 那接下来我们完成样式文件的编写,首先我们完成的任务如下: 1、设置背景颜色浅蓝色 2、 给h1字体加一个边框,设置h2字体颜色 3、设置div中p段落背景颜色 4、设置表单边框,指定宽度和长度 5、设置超链接颜色和一些文字装饰 基本就这些吧,我们直接上代码: /*背景色*/ body{ background-color : #a8e6ff; } /*h1的边框*/ h1{ border: 1px solid black; } /*h2颜色*/ h2{ color: purple; } /*段落背景色,注意是div下的p : 5px solid gray; width: 400px; height: 200px; } /*超链接红色*/ a{ color: red; } /*表单边框*/ input{ border: 2px
> 四、泛型安全检查 五、完整代码示例 1、泛型类 / 方法 2、main 函数 一、泛型类用法 ---- 泛型类用法 : 使用时先声明泛型 , 如果不声明泛型 , 则表示该类的泛型是 Object getData2(T arg){ T data = arg; return data; } 指定泛型的方法 : 指定 泛型方法 的泛型类 , 泛型方法 的泛型声明 <String, Integer>getData2("Mouse"); 不指定泛型的方法 : 泛型方法 中 也可以不声明泛型类型 , 传入的参数是 泛型 T 类型 , 如果给传入参数设置 String 如果给传入参数设置 String , 隐含将泛型 T 设置为 String 类型 String data2 = student.getData2("Mouse"); 三、泛型通配符 <? = (String) student1.getData(); 四、泛型安全检查 ---- 注意下面 2 种泛型的用法 , 推荐使用第一种方法 ; // 泛型的安全检查
的性能 ; 二、泛型类 ---- 泛型类 : 在 类名后面 使用 <T> 声明泛型 , 则在该类中 , 可以使用该泛型类型 T 类型 ; 特别注意 , 该类中的 如下 2 个方法 不是 泛型方法 ---- 泛型方法 : 在方法的 返回值前 , 使用 <T> 声明泛型的方法 , 是泛型方法 ; 将某个类型作为参数传入 ; 泛型个数 : 该方法是泛型方法 , 且指定了 2 个泛型 , 泛型的个数可以有很多个 , 是将某个类型作为参数传入 * 方法指定泛型 , 写法如下 * * 该方法是泛型方法 * 方法指定了 2 个泛型 * return */ public <T, A> T getData2(T arg){ T data = arg; return data; } , 是将某个类型作为参数传入 * 方法指定泛型 , 写法如下 ; * * 该方法是泛型方法 * 方法指定了 2 个泛型 *
link和:visited伪类的书写顺序 作业 写满足以下条件的选择器 类名不为not-normal-input的文本框(<input type="text">)元素的获得焦点状态 在父元素中倒数第2个
确切的讲,列表通常允许满足 e1.equals(e2) 的元素对 e1 和 e2,并且如果列表本身允许 null 元素的话,通常它们允许多个 null 元素。 ; System.out.print("指定角标2删除:\n\t"+a1+"\n"); System.out.print("指定角标2查询:\n\t : [List01, List02, List04] 指定角标2查询: List04 用迭代器查询全部元素: List01,List02,List04 在上面我们可以根据角标来增加(add 2、记住并发修改异常 java.util.ConcurrentModificationException ,优先考虑ArrayList,除非你在使用多线程所需。 2、于新增和删除操作add和remove,LinedList比较占优势,ArrayList要移动数据。
,默认为Object类型 2.泛型父类传入类型实参,子类既可以是泛型类,也可以不是 3.泛型父类传入类型实参,则子类必须是泛型类,且子类的类型形参列表必须包含父类的类型形参列表 泛型类的定义和实例化 = new test01<>(); gt2.sex ="男"; gt2.a("abc"); gt2.b(new String[]{"a","b","A"} ,那么子类在实例化的时候需要指定 static class SubGeneric2<e> extends test01<e>{ } 泛型类可以定义多个参数类型 t){ } static class Demo{ public static void main(String[] args) { test02<String> t2 = new test02(); t2.a("1"); t2.b("abc"); } } 泛型参数存在继承的情况 前面两个引用类型,都可以赋值,为什么list不行?
1.3 泛型定义(泛型类、泛型方法(泛型方法返回值是泛型的,泛型方法在普通类和泛型类里)): 1.4特点: 对于泛型特点(1)举个例子 : 没有使用泛型时的异常抛出 对于泛型特点(2)访问时不需要类型转换 (拆箱),举例子List list = new ArrayList(); 对于泛型特点(3)不同泛型之间不能相互赋值,举例 对于泛型特点(3)泛型不存在多态,举例 2.泛型类、泛型接口、泛型方法 不能存储基本类型int,double… 5.泛型擦除 5.1 泛型擦除概念: 5.2 由于泛型擦除出现的错误举例: ---- ---- 1.什么是泛型 1.1泛型概念: Java泛型是J2 SE1.5 定义一个泛型方法(不在泛型类里):publilc <T> void testMethod() { } 或定义一个返回值类型是泛型的方法(不在泛型类里): public <T> T testMethod2 (所以人家的真心不允许被辜负,就没多态了) 2.泛型类、泛型接口、泛型方法 2.1泛型类 语法:类名<T,……..> 举例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16