JS 基本数据类型和引用类型
Js 基本数据类型 js基本数据类型包括:undefined
, null
, number
, boolean
, string
, symbol
, bigInt(新增)
。基本数据类型是按值访问的,就是说我们可以操作保存在变量中的实际的值
1.基本数据类型的值是不可改变的 任何方法都无法改变一个基本类型的值是不可改变的,比如一个字符串:
var name = "change" ; name.substr();console .log(name);var s = "hello" ; s.toUpperCase()console .log(s)
通过这两个例子, 我们原来发现定义的变量 name 的值始终没有发生改变,而调用 substr() 和 toUpperCase() 方法后返回的是一个新的字符串,跟原先定义的变量 name 并没有关系
按值访问 按值进行访问,操作的是保存在变量中实际的值
不可添加方法属性 基础类型的比较是值的比较 基础类型存放在栈区 变量标识符 + 变量值 引用类型 同时保存在栈区和堆区中 栈区保存变量标识符和指向堆区的方法
基本包装类型(包装对象)
Markdown 语法
This post is originated from here and is used for testing markdown style. This post contains nearly every markdown usage. Make sure all the markdown elements below show up correctly.
this
this-用于访问当前方法所属的对象 const Obj = { name : 'jack' , fn ( ) { console .log(this == Obj); } } Obj.fn();
function showThis ( ) { console .log(this ); } show(); 'use strict' ;function showThis ( ) { console .log(this ); } showThis(); setTimeout (showThis, 100 ); window .setTimeout(showThis, 100 );
每个新生成的函数内部都会新建一个 this、这个 this 在函数被调用的时候被绑定 this 在运行时进行绑定 this 提供了一种更为优雅的方式隐式传递一个对象的引用,让 API 设计更加简洁且易于复用
应用场景:
普通函数中的 this 指向全局
构造器里的 this 指向 new 返回的新对象
函数作为方法被调用时,this 指向该对象
箭头函数不会创建自己的 this,使用一个封闭上下文中的 this
改变 this 的指向:
forEach 中的 this 指向
const myForEach (cb, thisArg ) { for (let i = 0 ; i < this .length; i ++) { cb.call(thisArg, (this [i])); } }const arr = [1 , 2 , 3 ]; arr.forEach(function (item ) { console .log(this , item); })
改变 this 指向 call 里面的参数
性能优化之浏览器篇
把 Css 放在head 中加载
在浏览器解析完head 部分后、让浏览器知道需要引入哪些css文件,开始并行的去下载css资源,一边下载Css文件一边解析Html, 能够使页面更早的开始渲染
让页面更早的开始渲染、避免闪屏 (DOM 结构先加载出来,css慢了一拍 页面重新渲染)
最好能包含关键渲染路径的样式、首页的样式应该尽快的完成加载、提高用户体验
JS放在 body 标签结束前加载
js 资源的加载会阻塞 HTML 的解析 和 Css的渲染
不使用CSS 表达式 在css属性后使用 expression() 连接一段JavaScript表达式,css属性的值是JavaScript表达式的结果。
background-color : expression ((new Date ()).getHours ()%2 ?"#FFFFFF" : "#000000" );
看似强大, 实际性能开销很大,可能导致页面卡顿
表达式的问题就在于它的计算频率要比我们想象的多。不仅仅是在页面显示和缩放时,就是在页面滚动、乃至移动鼠标时都会要重新计算一次。给 CSS 表达式增加一个计数器可以跟踪表达式的计算频率。在页面中随便移动鼠标都可以轻松达到 10000 次以上的计算量。 calc() 性能待验证
移除无匹配的样式 移除无匹配的样式,有两个好处:
用外链的方式引入css 和 js
通过使用外链可以减少html 文件的体积
作为外链文件、Css/Js 可以作为静态资源、通过合理的利用浏览器的缓存对需要的文件进行缓存; 在第二次访问时可以加快页面的加载速度
不要重复加载JS
在IE中,例如在加载一个jquery以后再加载一个jquery,仍然是算作两个不同的请求,不能发挥缓存的优势
重复加载js意味着更长的JS执行时间
用 Get 方式发起 Ajax 请求
Get 方式可以缓存
如果是获取信息 Get 更加语义化
如果是提交数据 使用Post 更加语义化
组件延迟加载
规划页面中引用的姿态资源加载顺序、优先级的能力
保障关键页面资源的优先加载: 浏览器的并发数限制
在同一个域名下面,一般现代浏览器的并发数为6
按需加载 Lazyload 典型: 电商网站
在图片比较多的电商网站中,lazyload 十分实用 data-src -> src
避免在页面中使用iFrame
会阻塞父文档的 onload
事件
即使是空白iFrame 也比较耗时
减少COOKIE体积
COOKIE每次请求都会全都带上COOKIE了解更多
每次请求跟主文档相关的信息,所有的cookie都会带上
减少 JS 中的 DOM 访问
JS中对DOM 的访问是不可避免的, 但可以进行一下优化
对于查找到的元素, 先将其缓存在变量中
节点增加时合理利用 DocumentFragment
不要用JS 去频繁修改样式
使用常见的图片优化手段
相比代码, 图片的体积很大
不要在HTML中缩放图片 在实际中使用什么尺寸的图片就提供多大尺寸的图片
徒增渲染开销, 提供适当尺寸即可 不要把图片的src置空
在主流浏览器中 IE、Chrome、FireFox 都会引发指向当前主文档的额外请求
参考文档 高性能 CSS