System.out.println(a == b);//1 Integer c = 100, d = 100; System.out.println(c == d);//2 你会得到以下运行结果: false...因此,结果就会出现false。 这是非常有趣的地方。如果你查看Integer.java类,你会找到IntegerCache.java这个内部私有类,它为-128到127之间的所有整数对象提供缓存。...return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } 如果值在 -128 到 127 之间,它就会返回该缓存的实例...这就是为什么这段代码的结果为true了: System.out.println(c == d); 现在你可能会问,为什么会为-128到127之间的所有整数设置缓存?
奇怪的Java题:为什么128 == 128返回为false,而127 == 127会返回为true? 在回答这个问题之前,我们先来看看int和Integer的对比,一步步揭开问题的答案。...基本类型(原始数据类型)在传递参数时都是按值传递,而封装类型是按引用传递的(其实“引用也是按值传递的”,传递的是对象的地址)。 由于包装类型都是不可变量,因此没有提供改变它值的方法。...Integer i = new Integer(100); Integer j = 100; System.out.print(i == j); //false 在JDK 5.0之前,你从未见过Integer...而java API中对Integer类型的valueOf的定义如下,对于-128到127之间的数,会进行缓存,Integer i = 127时,会将127进行缓存,下次再写Integer j = 127...而如果超过了从–128到127之间的值,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个 Integer对象。
因为前面我们说过,浏览器受同源策略的影响,不是同源的脚本不能操作其他源下面的对象,而如果想要操作另一个源下的对象时就需要授权了。 3.浏览器为什么一定要有同源策略呢?...Main.html 主要poc,这里是漏洞触发的对象performance. getEntriesByType,在Edge浏览器中是performance.getEntries,下面会有详细介绍: setTimeout...此时通过history.html重新刷新页面,也就是htstory.back()返回一步,这里接下来会重新跳转回blog.tepsec.com.cn/?...Main.html 这里修改的地方有两处,一处是getEntriesByType变成getEntries,另一处角标由[0]变成了[2]: setTimeout(function(){alert(performance...最后,我们再来看看关键的performance.getEntries这个api有哪些属性,从下图可以看到有四个属性,目前能被用上的就是url信息也就是name属性。 ?
1.即时运行错误:代码错误 try...catch window.onerror (也可以用 DOM2事件监听) 2.资源加载错误 object.onerror: dom对象的 onerror事件 performance.getEntries...() Error事件捕获 3.使用 performance.getEntries()获取网页图片加载错误 varallImgs=document.getElementsByTagName('image'...) varloadedImgs=performance.getEntries().filter(i=>i.initiatorType==='img') 最后 allIms和 loadedImgs对比即可找出图片资源未加载项目...global : typeof window !== 'undefined' ?...,最终返回是后者,也就是 new __() // 比如 (typeof null, 1) 返回的是1 // 如果 b === null 用Object.create(b) 创建 ,也就是一个不含原型链等信息的空对象
(...args) { let event = null; if (typeof Event === "function") { event = new Event("pushState...我们主要在重写方法里触发了自定义的事件 pushState 和 replaceState 只是为了监听到这两个行为,而监听他们也是为了完成和 popstate 同样的事情 所以监听就变成 function...如果是单页,页面切换没有刷新,所有时间都基于页面开始,那这个时间可就大了去了 比如 从 performance.getEntries 获取的资源,因为从页面加载开始算,所以时间非常大 虽然取 duration...所以我们需要在保证 MutationObserver 监听单例,在 spa 切换的时候,重置 MutationObserver ,结束上一个监听 具体处理可以看后面贴出的代码仓库 Demo 4、过滤资源重复 performance.getEntries...因为我们监听DOM时会额外存一份首屏内的 img 数组 所以最后我们会对 img 分类一下(通过 img 元素上的 complete 属性) 已经加载完成的从 performance.getEntries
良好的性能更容易好的用户体验,而好的用户体验更能留住用户。 研究表明,由于性能问题,在88%的在线消费者对用户体验不满意后,他们不太可能会二次使用。 这也是为什么要提高性能的一个重要原因。...performance.measure(name, startMark, endMark); 计算两个mark之间的时长,创建一个DOMHighResTimeStamp保存在资源缓存数据中,可通过performance.getEntries...performance API有3个函数可以用来访问该数据: performance.getEntries() 获取一组当前页面已经加载的资源PerformanceEntry对象。...解决一个方法是,使用上面提到的这些函数来测量它,而不是胡乱猜测代码的哪一部分比较慢。 要对其进行跟踪,首先将console.time语句放在执行比较慢的代码块周围。 然后测量它们不同部分的表现。...这是为什么要在多个引擎中进行测量的一个很好的例子。 如果仅使用Chrome进行测量,你可能会得出结论,与for相比,forEach并不那么糟糕。
loadEventStart:返回当前网页load事件的回调函数开始时的Unix毫秒时间戳。如果该事件还没有发生,返回0。...setTimeout(function() { // 标志时间的结束。 performance.mark('mySetTimeout-end'); // 测量两个不同的标志。...measure.duration) // 清除存储的标志位 performance.clearMarks(); performance.clearMeasures(); }, 1000); 3、performance.getEntries...performance.getEntries方法以数组形式,返回这些请求的时间统计信息,有多少个请求,返回数组就会有多少个成员。 由于该方法与浏览器处理网页的过程相关,所以只能在浏览器中使用。...@file: performance.js * @author: Tiffany * @description: 页面性能统计 */ var getPerformanceTiming = function
performance.now() 在chrome浏览器中返回的时间是以毫秒为单位的,更精确。...performance.now() 与 Date.now() 不同的是,返回了以微秒(百万分之一秒)为单位的时间,更加精准。...window.performance.getEntries() window.performance.getEntries 是一个方法,方法调用后可以获取一个包含了页面中所有的 HTTP 请求的时间数据的数组....这个数组是一个按startTime排序的对象数组,数组成员除了会自动根据所请求资源的变化而改变以外,还可以用mark(),measure()方法自定义添加。...获取所有的 img dom 节点 const images = document.getElementsByTagName('img'); const imageEntries = performance.getEntries
前言:为什么需要监控? web 的性能一定程度上影响了用户留存率,Google DoubleClick 研究表明:如果一个移动端页面加载时长超过 3 秒,用户就会放弃而离开。...基本方法 performance.getEntries() 通过这个方法可以获取到所有的 performance 实体对象,通过 getEntriesByName 和 getEntriesByType...方法可对所有的 performance 实体对象 进行过滤,返回特定类型的实体。...但是还有首屏内图片的加载时间需要考虑,遍历 performance.getEntries() 拿到的所有图片实体对象,根据图片的初始加载时间和加载完成时间去更新首屏渲染时间。...window.onerror 事件 2)promise reject 的异常 监听 unhandledrejection 事件 window.addEventListener("unhandledrejection", function
常用性能数据指标计算 [02.png] 封装常用性能指标统计函数 // 计算加载时间 function getPerformanceTiming () { var performance =...其他 api 3.1 performance.getEntries() 返回值为所有资源的加载情况的数组,除了 performance.timing 中包含的部分属性,新增四个属性: name: "http...entry.duration; return times; } 3.2 performance.now() / performance.mark() 精确计算程序执行时间,performance.now() 返回以微秒为单位的时间...,更加精准,而且 Date.now() 可能受系统时间影响且可能阻塞,而 performance.now() 输出的是相对于 performance.timing.navigationStart (页面初始化...) 的时间,而 performance.mark() 则可以在程序中进行时间打点存储,以便后面分析。
如果该属性不可用,则返回undefined。...这里我们只介绍performance.getEntries方法,它可以获取页面中每个静态资源的请求,如下: ?...可以看到performance.getEntries返回一个数组,数组的每个元素代表对应的静态资源的信息,比如上图展示的第一个元素对应的资源类型initiatorType是图片img,请求花费的时间就是...只有一个稍微有价值的信息Script error,其他什么信息都没有,为什么会这样呢? 我们都知道浏览器有同源资源限制,常规状态下是无法进行跨域请求的。...而script、img、iframe标签的src属性是没有这种限制的,这也是很多跨域方案的基础。
2.1. performance.now()方法 performance.now()返回performance.navigationStart至当前的毫秒数。...2.2. performance.timing 2.3. performance.getEntries()方法 浏览器获取网页时,会对网页中每一个对象(脚本文件、样式表、图片文件等等)发出一个 HTTP...performance.getEntries() 方法以数组形式,返回一个 PerformanceEntry 列表,这些请求的时间统计信息,有多少个请求,返回数组就会有多少个成员。...页面在加载过程中,是线性的,元素是一个一个渲染到屏幕上的,而不是一瞬间全渲染到屏幕上,所以“渲染面积”最大的元素随时在发生变化。...LCP: const observer = new PerformanceObserver((entryList) => { const entries = entryList.getEntries
图1 performance API关键时间点记录 function performanceTest() { let timing = performance.timing, readyStart...performance.memory // 内存占用的具体数据 performance.now() // performance.now()方法返回当前网页自performance.timing到现在的时间...performance.getEntries() // 获取页面所有加载资源的performance timing情况。...performance.getEntries方法以数组形式返回所有请求的时间统计信息。...let timeList = []; function addTime(tag) { timeList.push({ "tag": tag, "time": +new Date }); } addTime
CDN (function() { var scp = document.createElement('script'); // 加载最新的mdebug版本 scp.src = ... scp.onerror = function() {}; document.getElementsByTagName('head')[0].appendChild(scp); })()...; 4. exportLog /* @returned { type: '' // 日志类型 source: [], // 原始日志 } @params type // type等于log, 返回所有的...console日志 // type等于net, 返回所有的net日志 */ mdebug.exportLog(type); 5. on mdebug.on(eventName, callback); 6...(2) 静态资源加载 通过 performance.getEntries 来获取页面静态资源加载情况,并通过事件机制通知到 mdebug network 面板。
DNS Prefetching 是让具有此属性的域名不需要用户点击链接就在后台解析,而域名解析和内容载入是串行的网络操作,所以这个方式能减少用户的等待时间,提升用户体验 。...defer 和 async 的区别就是 defer 是有序的,代码的执行按在html中的先后顺序,而 async 是无序的,只要下载完毕就会立即执行。...performance.getEntries()方法,包含了所有静态资源的数组列表;每一项是一个请求的相关参数有name,type,时间等等。下图是chrome显示腾讯网的相关资源列表。 ?...或者资源服务器开启响应头Timing-Allow-Origin,添加指定来源站点,如下所示: Timing-Allow-Origin: https://qq.com 方法集合 除了performance.getEntries...function buffer_full(event) { console.log("WARNING: Resource Timing Buffer is FULL!")
而Performance API除了简单易用对前端工程师极其友好的特点之外,还有能提供高精确度的时间测量(千分之一毫秒)这个特点。...() //清除标记 performance.getEntries() //对网页发起的所有HTTP请求耗时信息统计后,以数组方式返回 2.Performance属性 Performance.timing...secureConnectionStart:返回浏览器与服务器开始安全链接的握手时的Unix毫秒时间戳。如果当前网页不要求安全连接,则返回0。...loadEventStart:返回当前网页load事件的回调函数开始时的Unix毫秒时间戳。如果该事件还没有发生,返回0。...loadEventEnd:返回当前网页load事件的回调函数运行结束时的Unix毫秒时间戳。如果该事件还没有发生,返回0。
例如,函数greetObject()创建对象,但是在无法创建对象时也可以返回null: function greetObject(who) { if (!...有趣的是,type null的结果是什么 typeof null; // => 'object' 为什么是'object',typoef null为object是早期 JS 实现中的一个错误。...如果我们想使用typeof运算符检查变量是否是对象,还需要排除null值: function isObject(object) { return typeof object === 'object'...尝试避免返回 null 的做法: 返回默认对象而不是null 抛出错误而不是返回null 回到开始返回greeting对象的greetObject()函数。...缺少参数时,可以返回一个默认对象,而不是返回null: function greetObject(who) { if (!
Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "...如果是就返回它的类型(也就是返回 "symbol"),如果不是,就返回 typeof obj 的计算结果。...为什么要使用 void 0 而不是 undefined 呢?因为非严格模式下 undefined 可能会被重写,这里使用 void 0 更加保险。...Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "...为什么不设置 enumerable: false 呢?因为默认就是不可枚举的,不设置也行。