ExtJS4.2 MVC
ExtJS是一个富客户端开发框架,用它做出来的用户界面风格很统一。对于美工不好的的后端开发人员来说,用这个东西做界面,完全就不需要考虑美工了,它内置的样式模板显示的效果还是非常好的。 现代工程应用的开发量,无论是后端逻辑,还是前端的界面展示,代码量都会非常大,如何保持代码的结构逻辑清晰,非常必要。在后端有MVC(Model View Controller)代码分层结构,ExtJS如今也引入了该设计方法,使前端代码看起来也结构规整、逻辑清晰,增强了前端代码的可读性、可维护性。 下面将通过一个例子来看看ExtJS的MVC是怎么回事。 在MVC的布局模式中,所有的类都放置在app文件夹中,这个文件夹还包含了一些子文件夹用于命名你的models,views,controllers,stores.下图为goods这个应用程序的文件夹结构。 Ext工程,必须在应用程序入口(app.html)引入ExtJS的2个文件,一个是SDK核心js类库ext-all.js(也可以是ext-all-debug.js或者bootstrap.js;第一个是服务部署版本,第二个是开发阶段版本,第三个会运行环境调用第一或第二个)、一个是核心样式表ext-theme-classic-all.css(有很多套样式,可以自行选择)。在app.html中,仅需要下面这段代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<!DOCTYPEhtml> <html> <head> <metahttp-equiv="Content-Type"content="text/html; charset=utf-8"/> <title>inv</title> <scriptsrc="http://cdn.sencha.com/ext/gpl/4.2.1/ext-all.js"></script> <linkrel="stylesheet"href="http://cdn.sencha.com/ext/gpl/4.2.1/resources/ext-theme-classic/ext-theme-classic-all.css"> <scripttype="text/javascript"src="app.js"></script> </head> <body></body> </html> |
一、定义应用 每一个ExtJS应用程序都由一个Application类作为开始,这个Application包含了全局设置,比如应用程序的名称,以及需要引用到的所有的models,views,controllers。下面我们创建一个商品模块应用,来管理商品信息。app.js中的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
//覆盖父级包设置 Ext.Loader.setConfig({ enabled: true }); Ext.application({ autoCreateViewport: true, controllers: [ 'GoodsController'//指定应用的控制器 ], name: 'Inv'//设置应用命名空间 }); |
首先,我们调用Ext.application去创建一个Application类,传递一个名字叫Inv。这样它就能够自动的为我们创建一个全局的变量 Inv给我们,并将这个命名空间注册到Ext.Loader。这里还指定应用的控制器,说明这个应用使用哪个或者哪些控制器;这里还设置自动创建并加载显示师徒,也可以在代码中还创建了一个launch函数,这个函数里面创建了一个Viewport,来加载显示界面视图。 二、定义控制器 控制器是跟应用程序绑定在一起的,控制器所做的工作就是监听事件并作出相应,监听的事件通常是在views中,下面我们来创建一个控制器,在app/controller/下面新建一个GoodsController.js 里面代码如下:
1 2 3 4 5 6 7 8 9 10 |
Ext.define('Inv.controller.GoodsController', { extend: 'Ext.app.Controller', models: ['GoodsModel'],//指定模型 stores: ['GoodsStore'],//指定存储对象 views: ['GoodsGridPanel']//指定视图 }); |
控制器主要就是绑定应用的视图对象(views)和模型对象(models、stores),应用在加载的时候自动加载控制器,再由控制器来加载应用的视图和模型对象。 三、定义视图 View无非就是一个组件,通常会定义为一个Ext js component的子类。下面我们要创建一个商品列表,可以新建一个GoodsGridPanel.js,位于app/view/下。GoodsGridPanel.js代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
Ext.define('Inv.view.GoodsGridPanel', { extend: 'Ext.grid.Panel',//继承自grid.Panel title: '商品列表',//商品列表名称 store: 'GoodsStore',//存储对象,指定商品列表的数据来源 //列表组件初始化,本视图被加载的时候自动调用 initComponent: function() { var me =this; //向定义的gridPanel中注册子组件,也就是商品列表的显示列 Ext.applyIf(me, { columns: [ { xtype: 'gridcolumn', dataIndex: 'code', text: '编码' }, { xtype: 'gridcolumn', dataIndex: 'name', text: '名称' } ] }); //激活父级组件渲染到页面 me.callParent(arguments); } }); |
在app/view/还有一个Viewport.js,也是定义一个视图的,该视图继承自上面定义的GoodsGridPanel,额外定义这个视图的模板渲染显示为准和其定义相分离,以达到视图组件重用的目的。app.js中定义的自动创建视图也就是指的这个。Viewport.js的代码如下:
1 2 3 4 |
Ext.define('Inv.view.Viewport', { extend: 'Inv.view.GoodsGridPanel', renderTo: Ext.getBody() }); |
四、定义模型 数据模型其实包括两个部分,即store和model。其中model负责数据结构的定义,store负责数据的存取。 a) 数据模型定义 在app/model下创建一个GoodsModel.js,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 |
Ext.define('Inv.model.GoodsModel', { extend: 'Ext.data.Model', fields: [ {name: 'code'}, {name: 'name'} ] }); |
看上面的代码,其实很简单,就是给商品数据模型定义了2个属性:code(编码)、name(名称),就像定义数据库的字段一样。 b) 定义存储模型(静态数据) 在app/store中创建GoodsStore.js,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
Ext.define('Inv.store.GoodsStore', { extend: 'Ext.data.Store', requires: ['Inv.model.GoodsModel'], constructor: function(cfg) { var me =this; cfg =cfg || {}; me.callParent([Ext.apply({ model: 'Inv.model.GoodsModel', storeId: 'GoodsStore', data: [ { code: '00001', name: '童靴' }, { code: '00002', name: '短靴' } ] }, cfg)]); } }); |
c) 定义存储模型(从服务器获取数据) 在app/store中创建GoodsStore.js,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
Ext.define('Inv.store.GoodsStore', { extend: 'Ext.data.Store', requires: [ 'Inv.model.GoodsModel' ], constructor: function(cfg) { var me = this; cfg = cfg || {}; me.callParent([Ext.apply({ model: 'Inv.model.GoodsModel', storeId: 'GoodsStore', proxy: { type: 'ajax', url: './queryGoods', reader: { type: 'json', root: 'goodsBeanList', totalProperty: 'totalProperty' } } }, cfg)]); }, autoLoad: true //很关键 }); |
该存储模型首先调用了商品数据模型GoodsModel,然后再构造函数constructor中指定存储对象的数据模型;指定存储实例的ID;指定数据对象并在里面加了2条数据,存储模型也可以通过代理(prox)从服务端获取数据,实际工程中换一下数据来源即可。 最终页面效果 from:https://blog.csdn.net/clj198606061111/article/details/16811665
View Detailsbigdecimal 保留小数位
1 2 3 4 5 6 7 8 9 10 11 12 |
public class test1_format { public static void main(String[] args) { BigDecimal decimal = new BigDecimal("1.12345"); System.out.println(decimal); BigDecimal setScale = decimal.setScale(4,BigDecimal.ROUND_HALF_DOWN); System.out.println(setScale); BigDecimal setScale1 = decimal.setScale(4,BigDecimal.ROUND_HALF_UP); System.out.println(setScale1); } } |
参数定义 ROUND_CEILING Rounding mode to round towards positive infinity. 向正无穷方向舍入 ROUND_DOWN Rounding mode to round towards zero. 向零方向舍入 ROUND_FLOOR Rounding mode to round towards negative infinity. 向负无穷方向舍入 ROUND_HALF_DOWN Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round down. 向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5 ROUND_HALF_EVEN Rounding mode to round towards the "nearest neighbor" unless both neighbors are equidistant, in which case, round towards the even neighbor. 向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP ,如果是偶数,使用ROUND_HALF_DOWN ROUND_HALF_UP Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in […]
View DetailsJava中四舍五入
1、Math中四舍五入的方法 Math.ceil(double a)向上舍入,将数值向上舍入为最为接近的整数,返回值是double类型 Math.floor(double a)向下舍入,将数值向下舍入为最为接近的整数,返回值是double类型 Math.round(float a)标准舍入,将数值四舍五入为最为接近的整数,返回值是int类型 Math.round(double a)标准舍入,将数值四舍五入为最为接近的整数,返回值是long类型 2、Math中random生成随机数 Math.random()生成大于等于0,小于1的随机数 3、Random类生成随机数 两种构造方式:第一种使用默认的种子(当前时间作为种子),另一个使用long型整数为种子,Random类可以生成布尔型、浮点类型、整数等类型的随机数,还可以指定生成随机数的范围 4、BigDecimal处理小数 两种构造方式:第一种直接value写数字的值,第二种用String
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
import java.math.BigDecimal; import java.util.Random; import java.util.concurrent.ThreadLocalRandom; public class TestNumber { public static void main(String[] args){ //ceil返回大的值 System.out.println(Math.ceil(-10.1)); //-10.0 System.out.println(Math.ceil(10.7)); //11.0 System.out.println(Math.ceil(-0.7)); //-0.0 System.out.println(Math.ceil(0.0)); //0.0 System.out.println(Math.ceil(-0.0)); //-0.0 System.out.println(Math.ceil(-1.7)); //-1.0 //floor返回小的值 System.out.println(Math.floor(-10.1)); //-11.0 System.out.println(Math.floor(10.7)); //10.0 System.out.println(Math.floor(-0.7)); //-1.0 System.out.println(Math.floor(0.0)); //0.0 System.out.println(Math.floor(-0.0)); //-0.0 System.out.println(Math.floor(-1.7)); //-2.0 //round四舍五入,float返回int,double返回long System.out.println(Math.round(10.5)); //11 System.out.println(Math.round(-10.5)); //-10 //Math生成随机数 System.out.println(Math.random()); //Random类生成随机数 Random rand=new Random(); System.out.println(rand.nextBoolean()); System.out.println(rand.nextDouble()); System.out.println(rand.nextInt()); System.out.println(rand.nextInt(10)); //Random使用当前时间作为Random的种子 Random rand2 = new Random(System.currentTimeMillis()); System.out.println(rand2.nextBoolean()); System.out.println(rand2.nextDouble()); System.out.println(rand2.nextInt()); System.out.println(rand2.nextInt(10)); System.out.println(rand2.nextInt(5)); //ThreadLocalRandom ThreadLocalRandom rand3 = ThreadLocalRandom.current(); System.out.println(rand3.nextInt(5,10)); //BigDecimal System.out.println(0.8 - 0.7); //0.10000000000000009 BigDecimal a1=new BigDecimal(0.1); BigDecimal b1=new BigDecimal(0.9); BigDecimal c1=a1.add(b1); System.out.println("a1.add(b1)="+c1); //a1.add(b1)=1.0000000000000000277555756156289135105907917022705078125 BigDecimal a2=new BigDecimal("0.1"); BigDecimal b2=new BigDecimal("0.9"); BigDecimal c2=a2.add(b2); System.out.println("a2="+a2); //a2=0.1 System.out.println("a2.add(b2)="+c2); //a2.add(b2)=1.0 } } |
from:https://www.cnblogs.com/testerlina/p/11349456.html
View DetailsIDEA编译通过能运行但是出现红色下划线的问题
能编译通过说明SDK导入正确,但是为啥我们点击每一个Java文件会出现好多红色的下划线 ,并提示idea cant resolve symbol 原因就是可能没有清除原来的历史缓存,导致一些错误,解决方法是 File-Invalidate Caches 然后重启IDEA,OK~困扰多年的问题解决!
View Details.Net连接Mysql数据库的Convert Zero Datetime日期问题
如题,其实这已经是以前遇到过的一个问题了。在.Net中使用Mysql的组件MySql.Data(Nuget.org的链接在这里http://www.nuget.org/packages/MySql.Data/)时需要在web.config的连接字符串中配置一些额外的属性,以最大程度地契合MS SERVER的数据类型,下面我以自己在实现工作遇到的问题为例子,来说明在连接字符串中配置的作用:Web.config连接Mysql字符串:
1 |
<add key="ConnstringMySql" value="server=xxx.xxx.xxx.xxx;database=YourDatabase;uid=xxx;pwd=xxx;pooling=false;charset=utf8;Treat Tiny As Boolean=false;Convert Zero Datetime=False" /> |
1.pooling:这个键的值设置为true,当值为True时,任何一个新创建的连接都将添加到连接池中当程序被关闭时,在下次试图开启一个相同的连接时,这个连接将从连接池中取出,如果连接字符串相同,则被认为是同一个连接。如果连接字符串不相同,则认为是不同的连接。 2.charset:这个一看应该明白,设置字符编码 3.Treat Tiny As Boolean:如果设置为True,则Mysql中的tinyint类型会被转换为MS Server中的bit类型,但有时候我们是不想要这来的转换的,所以这个可以根据自己的需要来配置 4.Convert Zero Datetime:今天就遇到了这个问题,当没有设置此属性时,如果Mysql数据库中的datetime列为null的时候,.net在转换时会抛出如下异常:Unable to convert MySQL date/time value to System.DateTime at MySql.Data.Types.MySqlDateTime.GetDateTime()这是因为.net的默认最小日期和Mysql的不匹配,导致转换出错,解决办法就是以上连接串中的(设置Convert Zero Datetime=True) 这是个人在实际操作中遇到的一些关于.NET 连接Mysql的常用设置,分享给大家,希望可以对你有一些帮助。如果你有更好的解决方案,欢迎拍砖,指正。
View Details盘点你不可不知的深度学习产业应用案例
现如今,我们可以看到“AI+传统行业”,覆盖了医疗、金融、教育、文娱、零售、物流、政务、安防等诸多垂直领域。 人工智能行业应用(来源:前瞻产业研究院整理) 传统企业如何在更短的时间内利用AI助力业务突破,欢迎点击链接或扫码下方二维码,我们将为您提供免费咨询服务:https://jinshuju.net/f/zL637q 如果您希望学习更多AI与深度学习相关技术,欢迎添加小助手 gitee2013 回复关键字“AI”进群交流~我们也将提供一系列深度学习资料包! AI技术已经开始影响到我们生活的方方面面。AI技术目前分为四个大类:自然语言处理(NLP技术)、计算机视觉(CV技术)、智能语音技术(Speech)、智能推荐技术。 典型案例 计算机视觉技术(CV)应用举例 想象一下人类视觉所允许的一切,你就可以开始实现几乎无穷无尽的计算机视觉应用。 自主车辆 自动驾驶汽车需要计算机视觉。特斯拉(Tesla)、宝马(BMW)、沃尔沃(Volvo)和奥迪(Audi)等汽车制造商使用多个摄像头、激光雷达、雷达和超声波传感器从环境中获取图像,这样他们的自动驾驶汽车就能探测目标、车道标记、标志和交通信号,从而安全驾驶。 谷歌翻译软件 你所需要做的就是把手机摄像头对准这些单词,让谷歌翻译应用程序几乎立刻告诉你它在你喜欢的语言中的意思。通过光学字符识别来查看图像和增强现实来叠加一个精确的翻译,这是一个使用计算机视觉的方便工具。 面部识别 中国在使用人脸识别技术方面无疑处于领先地位,他们将其用于警察工作、支付识别、机场安检,以及其他许多应用。 北京天坛公园分发厕纸、防止厕纸被盗 医疗保健 由于90%的医疗数据都是基于图像的,因此医学中的计算机视觉有很多用途。从启用新的医疗诊断方法到分析X射线,乳房X光检查和其他扫描,以及监测患者以更早发现问题并协助手术。 实时运动跟踪 足球和冰球在电视体育节目中的跟踪已经很常见了一段时间,但计算机视觉还有助于比赛和策略分析、球员表现和评级,以及跟踪体育节目中品牌赞助的可见性。 通过训练人工智能从声音传感器阵列中筛选信号,系统可以学会分析你的动作——站立、坐着、跌倒、行走 农业 约翰迪尔(John Deere)在2019年国际消费电子展(CES 2019)上展示了一种半自动联合收割机,它利用人工智能和计算机视觉来分析收获时的粮食品质,并找出穿过作物的最佳路径。 计算机视觉识别杂草有望将所需除草剂的数量减少90% 制造业 计算机视觉实现预测性维护,在设备故障导致昂贵的停机之前,用计算机视觉对设备进行监控,以便进行干预。对包装和产品质量进行监控,并通过计算机视觉减少不合格品。 智能维护持续改善设备运维绩效。 自然语言处理技术(NLP)应用举例 下面做一些比较简单的举例: 词法分析(分词、词性、实体): 应用:优酷、YunOS、蚂蚁金服、推荐算法、资讯搜索等 句法分析: 新闻领域、商品评价、商品标题、搜索Query 应用:资讯搜索、评价情感分析 情感分析(情感对象、情感属性、情感属性关联): 应用:商品评价、商品问答、品牌舆情、互联网舆情 句子生成(句子可控改写、句子压缩): 应用:商品标题压缩,资讯标题改写,PUSH消息改写 句子相似度(浅层相似度、语义相似度): 应用:问大家相似问题、商品重发检测、影视作品相似等 文本分类/聚类(垃圾防控、信息聚合): 应用:商品类目预测、问答意图分析、文本垃圾过滤、舆情聚类、名片OCR后语义识别等 文本表示(词向量、句子向量、篇章向量、Seq2Seq): Word2Vec、LSTM、DSSM、Seq2Seq为基础进行深入研究 知识库 数据规模:电商同义词,通用同义词,电商上下位,通用上下位,领域词库(电商词、娱乐领域词、通用实体词),情感词库 应用:语义归一、语义扩展、Query理解、意图理解、情感分析 语料库 –分词、词性标注数据,依存句法标注数据 智能语音技术应用举例 智能语音主要应用于衣食住行等生活场景,包括智能家居、智能可穿戴设备、智能车载、智能手机等。其中最热门的的应用要属车载语音助理。 智能语音识别控制技术在家居、家电方面的发展机会也非常广泛。语音交互技术正在向家电市场快速渗透,越来越多的家电设备配置语音控制方案。 如何让企业业务结合AI技术 医学领域中,卫生智能服务机器人、智能病毒检测、CT影像智能分析系统、AI测温系统、智能配送机器人等人工智能技术及产品,在医院、交通枢纽、社区等人流密集地区发挥了积极的作用,引起业界广泛关注。 火车站里的红外热像仪测体温 越来越多的传统企业技术部门,开始了将AI深度学习应用于业务变革的探索。但受限于深度学习的跨学科学习门槛,较为复杂和不断更新的前沿知识,以及对工业级生产经验的高要求,传统企业如何能建立一支深度学习“正规军”,真正掌握深度学习的应用能力,学以致用,在更短的时间内产生业务突破呢? 传统企业如何在更短的时间内利用AI助力业务突破,欢迎点击链接或扫码下方二维码,我们将为您提供免费咨询服务:https://jinshuju.net/f/zL637q 如果您希望学习更多AI与深度学习相关技术,欢迎添加小助手 gitee2013 回复关键字“AI”进群交流~我们也将提供一系列深度学习资料包! from:https://my.oschina.net/u/4570368/blog/4327744
View Detailsaxios在catch中获取响应状态码
以下 是 对 axios 请求 错误的处理 ( 困扰我好长时间 的 问题 终于 解决了!)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
axios.get('/user/12345') .catch(function (error) { if (error.response) { // The request was made and the server responded with a status code // that falls out of the range of 2xx console.log(error.response.data); console.log(error.response.status); console.log(error.response.headers); } else if (error.request) { // The request was made but no response was received // `error.request` is an instance of XMLHttpRequest in the browser and an instance of // http.ClientRequest in node.js console.log(error.request); } else { // Something happened in setting up the request that triggered an Error console.log('Error', error.message); } console.log(error.config); }); |
下图控制台 打印出的 结果 : from:https://blog.csdn.net/bianliuzhu/article/details/88170549
View DetailsWeb.Config文件 httpRuntime 限制上传文件大小与时间
httpRuntime <httpRuntime executionTimeout="90" maxRequestLength="40960" useFullyQualifiedRedirectUrl="false" minFreeThreads="8" minLocalRequestFreeThreads="4" appRequestQueueLimit="100" enableVersionHeader="false"/> httpRuntime是配置asp.net http运行时设置,以确定如何处理对asp.net应用程序的请求。 executionTimeout:表示允许执行请求的最大时间限制,单位为秒 maxRequestLength:指示 ASP.NET 支持的最大文件上载大小。该限制可用于防止因用户将大量文件传递到该服务器而导致的拒绝服务攻击。指定的大小以 KB 为单位。默认值为 4096 KB (4 MB)。 useFullyQualifiedRedirectUrl:表示指示客户端重定向是否是完全限定的(采用 "http://server/path" 格式,这是某些移动控件所必需的),或者指示是否代之以将相对重定向发送到客户端。如果为 True,则所有不是完全限定的重定向都将自动转换为完全限定的格式。false 是默认选项。 minFreeThreads:表示指定允许执行新请求的自由线程的最小数目。ASP.NET 为要求附加线程来完成其处理的请求而使指定数目的线程保持自由状态。默认值为 8。 minLocalRequestFreeThreads:表示ASP.NET 保持的允许执行新本地请求的自由线程的最小数目。该线程数目是为从本地主机传入的请求而保留的,以防某些请求在其处理期间发出对本地主机的子请求。这避免了可能的因递归重新进入 Web 服务器而导致的死锁。 appRequestQueueLimit:表示ASP.NET 将为应用程序排队的请求的最大数目。当没有足够的自由线程来处理请求时,将对请求进行排队。当队列超出了该设置中指定的限制时,将通过“503 – 服务器太忙”错误信息拒绝传入的请求。 enableVersionHeader:表示指定 ASP.NET 是否应输出版本标头。Microsoft Visual Studio 2005 使用该属性来确定当前使用的 ASP.NET 版本。对于生产环境,该属性不是必需的,可以禁用。 from:https://www.cnblogs.com/tearer/archive/2012/09/16/2687833.html
View Details常见Http状态码大全详解
HTTP状态码的分类 HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP状态码共分为5种类型: 具体如下: 状态码 内容 详细内容 信息告知 – 1xx 1xx 这一类型的状态码,代表请求已被接受,需要继续处理。 100 Continue 收到请求,客户端应当继续发送请求。 101 Switching Protocols 服务器通过 Upgrade 消息头通知客户端采用不同的协议来完成这个请求。 成功 – 2xx 2xx 成功 | 这一类型的状态码,代表请求已成功被服务器接收、理解、并接受。 200 OK 请求已成功,请求的响应头或数据体将随此响应返回。 201 Created 请求已经被实现,而且有一个新的资源已经依据请求的需要而创建,且其 URI 已经随 Location 头信息返回。 202 Accepted 服务器已接受请求,但尚未处理。正如它可能被拒绝一样,最终该请求可能会也可能不会被执行。 203 Non-Authoritative Information 服务器已成功处理了请求,但返回的实体头部元信息不是在原始服务器上有效的确定集合,而是来自本地或者第三方的拷贝。 204 No Content 服务器成功处理了请求,但没有返回任何实体内容。 205 Reset Content 服务器成功处理了请求,且没有返回任何内容。但是与204响应不同,返回此状态码的响应要求请求者重置文档视图。 […]
View DetailsJavascript两个感叹号的用法(!!)
1 2 3 4 5 6 7 8 9 10 |
var foo; alert(!foo);//undefind情况下或者null,一个感叹号返回的是true; alert(!goo);//undefind情况下,一个感叹号返回的也是true; 但是这里会报undefind的错误 var o={flag:true}; var test=!!o.flag;//等效于var test=o.flag||false; alert(test); //返回true var test2=!!o.flag1;//当里面没有对象时 alert(test2);//返回false var test3=!!b.flag;//当连b这个对象都没有时 alert(test3);//返回false |
from:https://www.cnblogs.com/EasonJim/p/6239087.html
View Details