1 |
|
for
forEach
1 |
|
注意的点
- 循环不能被中断(for 循环可以)
- 属性会被忽略掉
- 循环得到的第一个参数是value,第二个参数是key
forin
1 |
|
注意的点
- 循环可以被中断(for 循环可以)
- 属性会被循环出来
- 循环得到的是key
forof(与forEach类似,区别在于forof可以break)
1 |
|
注意的点
- 循环可以被中断(for 循环可以)
- 属性不会被循环出来
- 循环得到的是value
class类.md
1 | class Persion{ |
原型及原型链
原型概述
当谈到继承时,JavaScript 只有一种结构:对象。每个实例对象(object )都有一个私有属性(称之为proto)指向它的原型对象(prototype)。该原型对象也有一个自己的原型对象(proto) ,层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型链中的最后一个环节。
几乎所有 JavaScript 中的对象都是位于原型链顶端的Object的实例。
1 | var a = {} |
性能优化
性能优化
网络请求优化
DNS Lookup,减少重定向,避免 JS、CSS 阻塞,并行请求,代码压缩,缓存,按需加载,前端模块化
前端渲染的优化
在改变文档根元素的字体颜色等视觉性信息时,会触发整个文档的重绘,而改变某元素的字体颜色则只触发特定元素的重绘;改变元素的位置信息会同时触发此元素(可能还包括其兄弟元素或子级元素)的布局和重绘。某些重大改变,如更改文档根元素的字体尺寸,则会触发整个文档的重新布局和重绘,据此及上文所述,推荐以下优化和实践:
- HTML文档结构层次尽量少,最好不深于六层;
- 脚本尽量后放,放在前即可;
- 少量首屏样式内联放在标签内;
- 样式结构层次尽量简单;
- 在脚本中尽量减少DOM操作,尽量缓存访问DOM的样式信息,避免过度触发回流;
- 减少通过JavaScript代码修改元素样式,尽量使用修改class名方式操作样式或动画;
- 动画尽量使用在绝对定位或固定定位的元素上;
- 隐藏在屏幕外,或在页面滚动时,尽量停止动画;
- 尽量缓存DOM查找,查找器尽量简洁;
- 涉及多域名的网站,可以开启域名预解析
new的作用
new 的作用
1 | function Test(name){ |
从代码中我们可以知道,new的作用
- 通过构造函数Test创建出来的实例可以访问到构造函数中的属性
- 通过构造函数Test创建出来的实例可以访问到构造函数原型链中的属性,也就是说通过new操作符实例与构造函数通过原型链连接了起来
JS空值
null,undefined
- null是一个表示”无”的对象,转为数值时为0
- undefined是一个表示”无”的原始值,转为数值时为NaN
1 | Number(null) //0 |
- null 表示一个值被定义了,定义为“空值”;
- undefined 表示根本不存在定义。
所以设置一个值为 null 是合理的,如objA.valueA = null;但设置一个值为 undefined 是不合理的
null针对的是对象,表示一个未分配内存指针的对象,undefined针对原始类型,就是变量存放值的那个盒子里是空的
跨域
跨域
1、JSONP实现
优缺点
- 优点: 无兼容性问题
- 缺点: 只能发送get请求(如果要实现post,参考下边文章)
[‘https://segmentfault.com/a/1190000015597029#articleHeader5']
JSONP实现方式
它的基本思想是,网页通过添加一个
<script>
元素,向服务器请求JSON数据,这种做法不受同源政策限制;服务器收到请求后,将数据放在一个指定名字的回调函数里传回来。
首先,网页动态插入<script>
元素,由它向跨源网址发出请求。(客户端代码)
1 | <!DOCTYPE html> |
上面代码通过动态添加<script>
元素,向服务器localhost:3000发出请求。注意,该请求的查询字符串有一个callback参数,用来指定回调函数的名字,这对于JSONP是必需的。
服务器端代码
1 | const http = require('http') |
服务器收到这个请求以后,会将数据放在回调函数的参数位置返回。1
foo({name: 'uthus'});
由于<script>
元素请求的脚本,直接作为代码运行。这时,只要浏览器定义了foo函数,该函数就会立即调用。作为参数的JSON数据被视为JavaScript对象,而不是字符串,因此避免了使用JSON.parse的步骤。
基于Promise,封装一个jsonp工具
1 | /** |
2、通过CORS 设置Access-Control-Allow-Origin为’*’
3、Nginx反向代理
参考文章
[‘https://segmentfault.com/a/1190000015597029#articleHeader5']
浏览器同源政策及其规避方法[‘http://www.ruanyifeng.com/blog/2016/04/same-origin-policy.html']
跨域资源共享 CORS 详解[‘http://www.ruanyifeng.com/blog/2016/04/cors.html']
面向对象编程
面向对象编程
面向对象的两个基本概念:
- 类:类是对象的类型模板,例如,定义Student类来表示学生,类本身是一种类型,Student表示学生类型,但不表示任何具体的某个学生;
- 实例:实例是根据类创建的对象,例如,根据Student类可以创建出xiaoming、xiaohong、xiaojun等多个实例,每个实例表示一个具体的学生,他们全都属于Student类型。
在JS中不区分类和实例的概念,,而是通过原型(prototype)来实现面向对象编程。
创建一个xiaoming对象(通过obj.proto去改变一个对象的原型)
obj.proto去改变一个对象的原型(低版本的IE也无法使用
__proto__
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 //先创建一个原型对象
var Student = {
name: 'Robot',
height: 1.2,
run: function () {
console.log(this.name + ' is running...');
}
};
//再创建一个xiaoming对象,目前该对象只有name属性
var xiaoming = {
name: '小明'
};
//把xiaoming的原型指向了对象Student,看上去xiaoming仿佛是从Student继承下来的:
//xiaoming现在拥有Student的属性和方法
xiaoming.__proto__ = Student;
// xiaoming.name //'小明'
// Student.name //'Robot'
编写一个函数来创建xiaoming对象(基于Object.create()方法)
Object.create()方法可以传入一个原型对象,并创建一个基于该原型的新对象,但是新对象什么属性都没有
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 // 原型对象:
var Student = {
name: 'Robot',
height: 1.2,
run: function () {
console.log(this.name + ' is running...');
}
};
function createStudent(name) {
// 基于Student原型创建一个新对象:
var s = Object.create(Student);
// 初始化新对象:
s.name = name;
return s;
}
var xiaoming = createStudent('小明');
xiaoming.run(); // 小明 is running...
xiaoming.__proto__ === Student; // true