ES6整理
1、ES6模块化:
-
JavaScript在es6加入了模块(module)体系的语法,在此之前我们编写代码时必须依靠require.js之类的工具来实现模块化加载。其实模块化的概念在其他语言中很常见,比如python/java里的import导入包,正好es6里也是用import关键字。
-
es6的模块化使用import/export关键字来实现模块的导入和导出,并且 自动采取严格模式(无论是否代码顶部是否标注了" use strict ")。考虑到未来所有的代码,其实都是运行在模块之中,所以 ES6 实际上把整个语言升级到了严格模式。-
2、禁止使用的东西:
#####禁止使用with:
区别一下with和Object.assign
3、不能对只读的属性进行赋值操作,---冻结的属性也属于只读属性
##字符串的length属性只读
##通过
Object.freeze(obj)可以实现冻结,这时候obj对象的属性值不能进行修改了
##对象中只有get方法,没有set方法,因此,也是只读属性[测试发现通过obj.a能获取值,但是不能修改]
##不允许使用八进制 065
##不可删除的属性不能被删除,例如:数组的length属性 delete arr.length
##不能删除不可配置属性
##冻结的属性不能被删除
##禁止使用eval
eval的用法有:
监听调用:
for(var i=0;i<5;i++){
eval("div"+i).addEventListener("click",clickHandler);
}
遍历对象:
var
obj1
=
{a:
1
,b:
2
};
var
obj2
=
{a:
2
,b:
2
};
var
obj3
=
{a:
3
,b:
2
};
for
(
var
i
=
1
;
i
<
4
;
i
++
){
eval
(
"obj"
+
i
).
a
+=
10
;
}
console
.
log
(
obj1
,
obj2
,
obj3
)
求和: var num1=3;
var num2=5;
var type="*";
console.log(eval(num1+type+num2))
function
getSum
(
a
,
b
){
console
.
log
(
a
+
b
);
}
eval
(
"getSum(5,8)"
);
##不可以给eval和arguments赋值
##禁止使用arguments.callee arguments.callee.caller 不使用匿名函数 使用环境函数,通过传参
##不要在顶层使用this
###增加了保留字:
protected 受保护的函数或者属性
static静态
interface 接口 类的接口
4、箭头函数
1、let定义一个有范围的变量,不是window的属性,因此不能去直接用window调用
2、let定义的变量仅限于循环及花括号语句;
3、let定义的变量仅仅作用于语句块内【如果内部和外部存在同一个变量,则结果取语句块内的】
4、如果函数的外部和内部定义了同一个变量,则结果取内部的,
/* let a=3;
function fn(){
let b=5;
console.log(a);//3
if(b<10){
let a=20;
// let定义的变量仅作用于语句块内
console.log(a);//20
}
console.log(a);//3
}
5、const常量
1、如果常用常量进行定义,引用地址不可修改,但是对象的属性可以修改
2、如果对象定义为一个常量,它是不能清除的,直接清除会报错
6、箭头函数在书写上需要注意的:
1、函数的参数,只有一个可以不用写括号
var
arr
=
a
=>
a
+
100
;
2、如果函数的参数没有或者在一个以上,就需要加括号() var arr=()=>200;
3、如果函数内容只有一句话,并且返回该一句,就不用了加{ }并且不用写return;
4、如果函数中有多句代码,或者不返回任何内容,就需要加{},这时候需要加return 或者 console.log
5、一些使用场景:
var s = arr.map(item=>item+10);
arr
=
arr
.
sort
((
a
,
b
)
=>
b
-
a
);
var
arr2
=
arr
.
filter
(
item
=>
item
>
3
)
arr
.
some
(
item
=>
item
>
5
)
setInterval
(()
=>
{
console
.
log
(
"aaa"
)},
1000
)
7、this指向
1、对象中:属性描述this时,这个时候对象还没有生成,所以this指向外层的this指向,
对象方法中的this是该对象本身 --- 由于方法是在对象执行完以后才调用的
2、当我们使用了箭头函数后,就会忽略了回调函数的this指向(默认情况下,回调函数的this指向window)
3、forEach map reduce filter 事件回调函数 等一些回调函数都遵从回调函数的this指向,指向window
4、我们在写函数的封装时,由于在一个对象的方法中函数中调用了对象的另外一个方法,肯定要加this的
5、在进行拖拽的时候,可以把mousedown的this先指向Utils,开始的时候还是要将需要移动的div 和 Utils存起来
8、解构赋值
1、数组的解构赋值
数组的解构赋值是按照顺序进行的
解构赋值可以用来做交换----冒泡排序
[
arr
[
i
],
arr
[
i
+
1
]]
=
[
arr
[
i
+
1
],
arr
[
i
]]
2、let [a,b,c]=[1,2,6];
3、解构赋值可以赋一个初始值 let [a,b=10] = [10]; 得到 a=10 b=10;
4、对象的解构赋值
1、对象的解构赋值是按照属性名来解构的,和顺序没关系
var {c,a,b}={a:1,b:2,c:3};
var
{
age
,
color
,
name
}
=
{age:
200
,name:
52
,color:
"red"
}
console
.
log
(
age
,
name
,
color
)
2、设置解构赋值的默认值
var {c,a,b=10}={a:1,c:3};
3、
如果多重对象解构时,属性名相同,可以使用
:
另外设置新变量名
在这个例子中,b的属性被解构了,因此b就不存在了,后面新加了一个b赋值
let
{
a
,
b
:{
a
:
a1
},
b
}
=
{a:
1
,b:{a:
2
}};
console
.
log
(
a
,
a1
,
b
)
4、解构字符串 数组的方法或属性
let {length} = "faejlg";
console.log(length); 可以得到字符串的长度
5、
传参时,解构赋值可以让参数传递顺序不同
6、解构JSON字符串
9、字符串的方法
1、
console.log("abcdef".includes("bc")) 判断字符串中是否有该内容
2、
console.log("abcde".startsWith("a"));//字符串是否是0开始
3、
console.log("abcde".startsWith("b",1));//字符串在第几位是否从b开始
4、
console.log("abcde".endsWith("e"));//以e为结尾
5、
console.log("abcde".endsWith("d",4));//从第四位开始是否是最尾部 --也就是第4位的前一位是不是d true
6、
console.log("abc".repeat(3));赋值几次
7、
console.log((18).toString(16).padStart(2,"0"));
如果字符串的长度不足几位,就在它的前面补充设置的字符
8、
console.log(Math.floor(Math.random()*10000000).toString().padEnd(7,"0"))
如果字符串的长度不足几位,就在它的末尾补充设置的字符
9、字符模板:
10、浅复制 ... 三个点
浅复制,其次使用...进行复制时,地址也会发生改变,形成新对象
var obj={a:1,b:2,c:{d:1}};
obj1={...obj};
console.log(obj1===obj2); false
10、symbol
1、symbol也是一种类型,独一无二 算上这个总共有7中类型了
2、如果使用symbol定义了变量,那么将无法遍历
3、消除魔术字符串
11、Set
1、列表
特点:插入、添加、删除速度快,无重复,只要值的列表(不能有键)
没有索引,不能使用for循环,也不能用下标修改或者获取
2、一些方法:
a.add() a.delete() a.has() a.clear()
3、使用forEach遍历得到的键和值完全相同
for of遍历
for value of a
for value of a.entries()
4、创建一个空的Set
5、利用new Set(arr) 可以对数组进行去重
6、数组里面可以增加对象
如果增加的是的对象,无法删除????
2、弱引用类型: