ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的一种实现(另外的 ECMAScript 方言还有 Jscript 和 ActionScript)。日常场合,这两个词是可以互换的。
声明方式 - let / const
- let - 变量不允许重复声明 允许重复赋值 可以防治变量泄露
- const - 常量 变量不允许重复声明,也不允许重复赋值
编码
- charCodeAt 获取编码
- String.fromCharCode(编码) 能让编码转成字符
字符串
repeat和includes
repeat 接受1个参数 参数就是重复几次咱们的字符串
includes 有点像indexOf
查找会返回 布尔值
第一个参数 是要找的内容
【第二个参数】 从第几位开始,默认从0开始startsWith 起始
开头如果是你放入的第一个参数 就是true 不是就false
【第二个参数】 从第几位开始,默认从0开始endsWith 结束位置
第二个参数 从第几位结束
模板字符串
传统js语言
1
2
3
4
5
6
7
8
9
10
11
12$('#result').append(
'There are <b>' + basket.count + '</b> ' +
'items in your basket, ' +
'<em>' + basket.onSale +
'</em> are on sale!'
);
$('#result').append(`
There are <b>${basket.count}</b> items
in your basket, <em>${basket.onSale}</em>
are on sale!
`);${}字符串
1
2
3let a = '5';
let b = '10';
console.log(`${a + b}`)
数组find
find 第一个参数 循环出来 数组所有的内容
第二个参数 循环出来 下标
第三个参数 循环出来 数组本身
find(x)
1
2
3
4
5
6
7[1, 4, -5, 10].find(function(x) {
console.log(x);
});
// 1 4 -5 10
[1, 4, -5, 10].find(x => {
console.log(x);
});find(x, y)
1
2
3
4
5
6
7
8
9
10
11[1, 4, -5, 10].find(function(x, y) {
console.log(x, y);
});
//1 0
//4 1
//-5 2
//10 3
[1, 4, -5, 10].find((x, y) => {
console.log(x, y);
});find(x, y, z)
1
2
3
4
5
6
7
8[1, 4, -5, 10].find(function(x, y, z) {
console.log(z[y]);
});
// 1 4 -5 10
[1, 4, -5, 10].find((x, y, z) => {
console.log(x, y, z);
});
函数
函数一
1
2
3
4
5
6x = x => x;
//如上表达式相当于如下方法
var x = function(x){
return x;
};
// 如上两种写法,都不能再定义前去调用函数二
1
2
3
4
5
6
7document.onclick = function(){
document.body.style.background = 'black';
}
document['onclick'] = () => {
document.body.style.background = 'black';
}函数三
1
2
3
4
5
6
7
8(function(){
alert(1);
})()
let x = 10;
((x)=>{
console.log(x)
})(x)
延展参数
延展参数 如果传了参数 那么就执行传入的参数 如果没传参数 那么参数就为延展的值
延展参数一(概念同PHP方法)
1
2
3
4function show(x=5,y=[1,2,3]){
console.log(y)
};
show();延展参数二
1
2
3
4
5
6var obj = {a : 3}
function show(x={a:5,b:3}){
//var x = x || 5;
console.log(x.b)
};
show();
- 延展参数 可以延展任何类型 array string number json
扩展运算符
扩展运算符一
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22function show(){
console.log(arguments); // [1, 2, 3, 4]
};
function show(...x){
console.log(x) // [1, 2, 3, 4]
};
function show(...x){
//arguments.push(5); 报错
x.push(5); // 正确
console.log(x) // [1, 2, 3, 4, 5]
};
function show(y,...x){
console.log(x) // [2, 3, 4]
};
function show(y=[1,23,3],...x){
console.log(x) // [2, 3, 4]
};
show(1,2,3,4);扩展运算符二
1
2
3
4
5var a = [1,3,4,4];
var b = [2];
var c = [3];
console.log(a.concat(b.concat(c)));
console.log([...a,...b,...c]);扩展运算符三
1
2
3
4
5
6
7
8
9
10
11
12
13
14// 输出重复的5个<div></div>
let a = '<div></div>';
document.write(a.repeat(5));
// 实现如上功能方法一
var c = [];
var d = document.getElementsByTagName('div');
for(var i = 0;i < d.length; i++) {
c.push(d[i]);
};
console.log(c);
// 实现如上功能方法二
console.log([...document.querySelectorAll('div')])
生成器函数
function* 函数名(){
}
- 函数名.next();
1 | function* show(){ |
yield 有点类似于return
1
2
3
4
5
6function* show(){
yield function() {
console.log(1)
}
};
show().next().value(); // 1yield 有点类似于return
1
2
3
4
5
6
7
8
9
10
11
12function* show(){
yield function() {
console.log(1)
}
yield function() {
console.log(1)
}
};
var k = show();
k.next().value(); // 1
k.next().value(); // 2yield 有点类似于return
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19function* show() {
yield ()=> {
console.log(1)
}
yield function() {
console.log(2);
}
yield ()=> {
document.body.style.background = 'black';
}
};
var k = show();
document.onclick = x => {
k.next().value(); // 1 2 背景变黑
}
Json中的get和set方法
set
1
2
3
4
5
6json = {
a(){
console.log(1);
}
};
json.a(); // 1set和get
1
2
3
4
5
6
7
8
9
10
11var json = {};
json = {
set Leo(x){
console.log(x)
},
get Leo(){
console.log(3);
}
};
json.Leo; // Leo赋值输出给的值,反之是输出get中的方法
console.log(json)set和get
1
2
3
4
5
6
7
8
9
10
11
12
13
14var json = {};
json = {
set Leo(x){
console.log(x)
},
get Leo(){
return {
get name(){
console.log(3);
}
}
}
};
console.log(json.Leo.name); // 3
块级作用域
块级作用域一({}块状 块级作用域 可以解决 密封空间问题)
1
2
3
4
5
6
7
8let allInput = document.getElementsByTagName('input');
for(var i = 0;i < allInput.length;i++){
allInput[i].onclick = function(){
alert(i)
}
}
// 只输出3块级作用域二
1
2
3
4
5
6
7
8
9
10let allInput = document.getElementsByTagName('input');
for(var i = 0;i < allInput.length;i++){
(function(x){
allInput[x].onclick = function(){
alert(x);
}
})(i)
}
// 输出0 1 2块级作用域三(用let可以解决块级作用域的问题)
1
2
3
4
5
6
7
8
9
10
11
12
13//<input value='1' type='button' class='active'>
// <input value='2' type='button'>
// <input value='3' type='button'>
let allInput = document.getElementsByTagName('input');
for(let i = 0;i < allInput.length;i++){
allInput[i].onclick = function(){
for(var j = 0;j < allInput.length;j++){
allInput[j].className = '';
}
allInput[i].className = 'active';
}
}
结果赋值(值和结构一样就可以)
数组结果赋值一
1
2
3//var a = 10,b = 20,c = 30;
let [a,b,c] = [10,20,30];
console.log(a,b,c);数组结果赋值二
1
2
3//var a = 10,b = 20,c = 30;
let [a,[b,f],c] = [10,[20,40],30];
console.log(a,b,c,f) // 10 20 30 40json结果赋值
1
2
3var json = {'a':20,'b':[30,20]};
let {a,b} = json;
console.log(a,b); // 20 [30, 20]结果集赋值(简化代码结构)
1
2
3
4
5
6
7
8
9
10
11
12
13function show(a=[30,50,80,100]){
//console.log(a);
/*
var b = a[0];
var c = a[1];
var d = a[2];
var e = a[3];
*/
var [b,c,d,e] = a;
console.log(b,c,d,e)
};
show()结构赋值函数
1
2
3
4
5
6
7
8
9
10var data = {
'ok':1,
'data':{
'top':[1,2,3],
'center':[2,3,4]
},
'mis':'请求成功'
};
let {ok, data, mis} = data;
bind
jquery -> bind 绑定事件 addevent
bind -> call
任何函数都可以用 call 调用自己 call 的第一个参数 就是 函数的this 第二个参数之后就是函数的行参call
1
alert.call(window,1) // 1
call
1
2
3setTimeout.call(window,()=>{
alert.call(window,1) // 1
},1000);bind
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18function show() {
console.log(1);
}
console.log(show);
/*
输出:
function show() {
console.log(1);
}
*/
// 同上
function show() {
console.log(1);
}
console.log(show.bind(1));bind
1
2
3
4
5function show() {
console.log(this); // this = 1
}
show.bind(1)(); // 1bind
1
2
3
4
5function show(x, y, z) {
console.log(this+x);
}
show.bind(1, 2, 3, 4)(); // 3bind
1
2
3
4
5function show(x, y, z) {
console.log(x);
}
show.bind(1)(1); // 1bind
1
2
3
4
5function show(x, y, z) {
console.log(x);
}
show.bind(1, 2)(1); // 2bind
1
2
3
4
5function show(x, y, z) {
console.log(x, y);
}
show.bind(1, 2)(1); // 2 1 参数先执行(1, 2)后执行(1)
- 任何函数都可以用
bind
调用自己,bind
的第一个参数就是函数的this
第二个参数之后就是函数的行参 但是不会调用自己 - constructor 可以精准的确定是什么类
对象的扩展
JS面向对象
- 原型:为每一个实例对象存储共享的方法和属性,每一个函数都有一个prototype原型属性,这个属性是一个指针,指向一个对象。
原型链:让一个引用类型继承另一个引用类型的属性和方法。
自定义原型方法
1
2
3
4
5
6
7
8
9
10function show(){
//console.log(1)
};
show.prototype.a = function(){
alert(1);
}
var c = new show()
c.a();
//var c = show;
//console.log(c.prototype)
ES6面向对象
语法
1
2
3
4
5class functionName {
constructor(){
}
}传参规则
1
2
3
4
5
6
7class a {
constructor(x,y,z){
console.log(x,y,z) //11,[1,2,3],{a:50}
}
};
new a(11,[1,2,3],{a:50});定义方法
1
2
3
4
5
6
7
8
9
10class a {
constructor(x,y,z){
console.log(x,y,z)
}
getNum(){
console.log(1); // 1
}
};
new a(11,[1,2,3],{a:50}).getNum();定义方法传参
1
2
3
4
5
6
7
8
9
10class a {
constructor(x,y,z){
console.log(x,y,z)
}
getNum(x){
console.log(x); // 1
}
};
new a(11,[1,2,3],{a:50}).getNum(1);his指向
1
2
3
4
5
6
7
8
9
10
11
12class a {
constructor(x,y,z){
console.log(x,y,z)
this.x = 10;
//console.log(this.x)
}
ffff(x){
console.log(this.x); // 10 this=a
}
};
//new a(11,[1,2,3],{a:50}).ffff(1);
Demo
1 | <!-- <body> |
面向对象继承
继承一
1
2
3
4
5
6
7
8
9
10class show {
constructor(l) {
this.x = l;
}
getNum(){
alert(this.x);
}
};
new show(1).getNum(); //1继承二
1
aaa.prototype = new bbb();
继承三
1
2
3
4
5
6
7
8
9
10
11
12
13
14class show {
constructor(l) {
this.x = l;
}
getNum(){
alert(this.x);
}
};
class sub extends show {
constructor(l){
super(l) //相当于拿到父级的this
}
}
new sub(1).getNum(); // 1
CSS JQuery
jquery
1
2
3
4
5$(‘.div’).addClass();
$(‘#div’).removeClass();
$(‘div’).bind(‘click’,function(){
})ES6
1
2
3
4
5
6$('#div1').css({
'width':'300px',
'height':'100px',
'transition':'1s',
'background':'green'
})
模版(k可以放入函数及传参)
1 | function show(n){ |
map
map 一
1
2
3
4
5
6
7
8
9
10let arr = [1, 10, 99];
arr.find((x, y, z) => {
console.log(x, y, z);
});
// 输出:
// 1 0
// 10 1
// 99 2
// 返回:
// undefinedmap 二(同上)
1
2
3
4
5
6
7
8
9
10let arr = [1, 10, 99];
arr.find((x, y, z) => {
console.log(x, y, z);
});
// 输出:
// 1 0
// 10 1
// 99 2
// 返回:
// -1map 三
1
2
3
4
5
6
7
8
9
10let arr = [1, 10, 99];
arr.find((x, y, z) => {
console.log(x, y, z);
});
// 输出:
// 1 0
// 10 1
// 99 2
// 返回:
// [undefined, undefined, undefined]
- map 用法和find findindex一样,只不过返回的值不同,是一个大的数组
标签模板
标签模板一
1
alert`1`;
标签模板二
1
2
3
4
5
6
7
8
9
10
11
12
13var jsonData = {
'topValue':['李万宇','申瑞','王凯'],
'bottomInner':['瘦了','美了','挣钱了']
}
createNode = json => `<div class=outNode>
${json.topValue.map((v)=>
`<input type=button value=${v}>`).join('')}
${json.bottomInner.map((v)=>
`<div>${v}</div>`).join('')}
</div>`;
document.body.innerHTML = createNode(jsonData)
String.raw``(可以取消转义)
1 | console.log('L\\nE\\nO') |
number
判断整数 true false
1
2
3
4
5
6var number = 1.00001
var string = String(number);
console.log(string.indexOf('.')!=-1?'不是整数':'是整数')
//实现如上功能
console.log(Number.isInteger(1.1+2.2)?'是整数':'不是整数');isNaN parseInt parseFloat
1
2
3console.log(Number.isNaN('218s0')); //false
console.log(Number.parseInt == parseInt) // trueMath
1
console.log(Math.pow(4,4)) //64
常用方法
in (‘属性’ 是否在 该对象上)
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
26var json = {
'leo':18,
'hehe':3
};
console.log('o' in json); //true
document.addEventListener('click',function(){
alert(1);
},false); // 1 IE不支持
// 兼容IE方法修改如下
function addEvent(obj,event,fn){
'attachEvent' in window?obj.attachEvent('on'+event,fn):obj.addEventListener(event,fn);
/*
if(obj.attachEvent){
obj.attachEvent('on'+event,fn);
}
else{
obj.addEventListener(event,fn);
}
*/
}
addEvent(document,'click',function(){
alert(1);
})in
1
2
3
4
5
6
7var arr = [5,6,9,4];
<!-- arr[0]
arr[1]
arr[2]
arr[3] -->
console.log(0 in arr); // true
console.log(4 in arr); // falsefor in (下表)
1
2
3
4
5
6
7
8
9
10
11
12var arr = [5,6,9,4];
for(var i in arr){
console.log(i)
}
// 0 1 2 3
var json = {a : 10};
for(var i in json){
console.log(i)
}
// afor of (值)
1
2
3
4
5var arr = [5,6,9,4];
for(var i of arr){
console.log(i)
}
// 5 6 9 4set(元素不重复)
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114var set = new Set();
set.add(1); // 添加数据
set.add(2);
set.add(3);
set.add(4);
set.add(4);
set.add(4);
set.add(4);
set.add(4);
console.log(set)
//console.log(Set.prototype) //查看所有的方法
// {1, 2, 3, 4}
// has查找数据
var set = new Set();
set.add(1);
set.add(2);
set.add(3);
set.add(4);
set.add(4);
set.add(4);
set.add(4);
set.add(4);
console.log(set.has(5)) // false
// keys
var set = new Set();
set.add(1);
set.add(2);
set.add(3);
set.add(4);
set.add(4);
set.add(4);
set.add(4);
set.add(4);
console.log(set.keys()) // [0:1, 1:2, 2:3, 3:4]
console.log(set.values()) // {1, 2, 3, 4}
for(var i of set.values()){
console.log(i)
}
// 1 2 3 4
// size 类似于length 指的是长度
var set = new Set();
set.add(1);
set.add(2);
set.add(3);
set.add(4);
set.add(4);
set.add(4);
set.add(4);
set.add(4);
console.log(set.size) // 4
// delete 放入你删除的值
var set = new Set();
set.add(1);
set.add(2);
set.add(3);
set.add(4);
set.add(4);
set.add(4);
set.add(4);
set.add(4);
set.delete(4);
console.log(set.values()) //
for(var i of set.values()){
console.log(i)
}
// 1 2 3
// clear 直接清除
var set = new Set();
set.add(1);
set.add(2);
set.add(3);
set.add(4);
set.add(4);
set.add(4);
set.add(4);
set.add(4);
set.delete(4);
set.clear();
console.log(set.values())
for(var i of set.values()){
console.log(i)
}
// clear
// entries
var set = new Set();
set.add(1);
set.add(2);
set.add(3);
set.add(4);
set.add(window);
set.add(4);
set.add(4);
set.add(4);
console.log(set.entries()); // {[1, 1], [2, 2], [3, 3], [4, 4]}
//array
var arr = [1,2,3,4,5];
var arr2 = [1,2,3,4,5,6,7,7];
var set = new Set([...arr,...arr2]);
var arr3 = [...set];
console.log(arr3); // 1 2 3 4 5 6 7
Map (不允许重复存key)
1 | let arr = ['button','text','button']; |
Promise
- Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。
1 | new Promise(function(Resolved,reject) { |
- one 只执行一次
- then(成功函数 , 失败的函数)
- then(成功函数).catch( 失败的函数)
1 | // 1 |
- promise 厉害之处就是能无限的回调
Demo
1
2
3
4
5
6
7
8
9
10
11
12
13
14//<input id='ipt' type='button' value='dddd'>
//<div id='div1'></div>
let index = 0;
ipt.onclick = x =>{
index++;
new Promise((succ,error)=>{
index%2==1?succ():error();
}).then(()=>{
div1.style.display = 'none';
},()=>{
div1.style.display = 'block';
})
};catch
1
2
3
4
5
6
7
8new Promise((succ,error)=>{
error('asdasda');
}).then(()=>{}).catch((x)=>{
console.log(x); // asdasda
return 'asdjkas';
}).then((f)=>{
console.log(f); //asdjkas
});error warn
1
2console.error();
console.warn();throw
1
2
3
4
5
6
7
8
9
10new Promise((succ,error)=>{
succ('123');
}).then((x)=>{
throw x; // 抛出异常 下面的代码不执行
return x+1
}).then((f)=>{
console.log(f);
}).then(()=>{
})race 竞速方法
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
27Promise.race([new Promise((succ,error)=>{
setTimeout(succ,1000,'1');
}),new Promise((succ,error)=>{
setTimeout(succ,1200,'2');
}),new Promise((succ,error)=>{
setTimeout(succ,1400,'3');
})]).then((x)=>{
console.log(x+'suss'); // 1succ
},(x)=>{
console.log(x+'error')
})
Promise.race([new Promise((succ,error)=>{
setTimeout(succ,1000,'1');
}),new Promise((error,error)=>{
setTimeout(succ,1200,'2');
}),new Promise((succ,error)=>{
setTimeout(succ,1400,'3');
})]).then((x)=>{
console.log(x+'suss');
},(x)=>{
console.log(x+'error') // 1error
})
- race ->只看第一个promise 成功就成功 ,失败就失败
- all 规整方法
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
38Promise.all([new Promise((succ,error)=>{
setTimeout(succ,1000);
}),new Promise((succ,error)=>{
setTimeout(succ,2000);
}),new Promise((succ,error)=>{
setTimeout(succ,1000);
})]).then(()=>{
console.log(1) // 1
}).catch(()=>{
console.log(2)
})
Promise.all([new Promise((succ,error)=>{
setTimeout(succ,1000);
}),new Promise((succ,error)=>{
setTimeout(succ,2000);
}),new Promise((succ,error)=>{
setTimeout(error,1000);
})]).then(()=>{
console.log(1)
}).catch(()=>{
console.log(2) // 2
})
Promise.reject(['333333','sadasda']).then((f,x)=>{
console.log(x)
}).catch((a)=>{
console.log(a) // ['333333','sadasda']
})
Promise.resolve(['333333','sadasda']).then((f,x)=>{
console.log("success") // success
}).catch((a)=>{
console.log(a)
})
- all 要不然就是全胜 要不然就是 失败
Demo
1 | function ajax(url){ |
webWork
1 | var worker = new Worker('li.js'); |
More info: