-let -const
用于es6,主要是有块级作用域,用let修饰的变量只存在于块级作用域,用const修饰的变量只能在声明的时候完成初始化,后续不能被修改
1.不能先使用在声明
2.不能重复声明
3.有块级作用域
{
let a=20
var b=30
}
console.log(b) //30
console.log(a) //报错
var 修饰的变量相当于在全局中声明,但是let修饰的变量只存在于当前作用域,所以无法访问到.
var arr = [{
name: "karen"
}, {
name: "jack"
}, {
name: "marry"
}]
for (var i = 0; i < arr.length; i++) {
(function(index) {
arr[index].onclick1 = function() {
console.log(index)
console.log(arr[index].name)
}(i)
})(i)
}
做出函数来遍历数组里面的变量,因为for中的i是用var来修饰的,所以只能做成闭包的形式,如果不这样,在函数外部访问就访问不到里面的i,但是如果使用let,就可以很好的解决这个情况
for (let i = 0; i < arr.length; i++) {
arr[i].onclick1 = function() {
console.log(i)
console.log(arr[i].name)
}(i)
}
用let修饰的变量很像函数的变量,里面代码块能够访问到外面代码块的变量,但是外面访问不到里面变量的值
const a =20;
a=100;
console.log(a);
这样会报错,因为a是由const修饰的,所以是不能修改的,他和之前的直接修改object的__proto__属性不同,后者不会报错,但是没有用,用const直接就会报错
var flag=true
if(flag){
var a=20
const b=30
}
console.log(a) //20
console.log(b) //报错
const也是有块级作用域的,他只在声明直接的作用域有效,很好的避免的全局变量被污染的情况(使用块级作用域后),但是虽然说不能被改变,但是如果他是一个数组,一个对象,可以添加属性进去,只是地址不被改变,里面的属性是可以改变的
const a=[]
a.push(100)
console.log(a)
const obj={}
obj.age=18
console.log(obj)
拷贝的区别:深拷贝和浅拷贝
深拷贝相当于重新开拓一块空间,在这空间里面讲要拷贝的数据原模原样的添加进去,浅拷贝只是申明一个变量,让这个变量的指针指向这块空间
浅
var a=[]
var b=a
b[100]=100
console.log(a)
深
var a=[1900,200,3004]
var b=[]//[...a]
a.forEach(function(el) {
b.push(el)
})
b.push(999)
console.log(a,b)
解构赋值
var {
name1
} = {
name1: "karen"
}
console.log(name1)
打印出来的结果是name1所带的值karen
var arr={a:[10,203,0]}
var {a:[b]}=arr;
console.log(b); //10
将要解构的对象放在等号后面,将要取的值放在前面,属性名必须要对,要去的值用变量表示,打印这个变量就是打印出来这个值
var arr=[{name:"karen",age:"18",its:[{name:"css",age:59},{name:"js",age:99}] } ]
let[{name,age,its}]=arr
{
let[{name,age}]=its
console.log(name)
}
console.log(name)
要想学好这个,就去网上拿一个大数据,将里面的属性全部解构出来,
map
var arr = [100, 20]
var m1 = new Map()
m1.set(999,arr )
console.log(m1)
set方法,将括号里面的arr set进去,然后如果需要访问他,他的keys是999
get方法,将set进去的值取出来
m1.set("name","karen")
console.log(m1.get("name")) //karen
for ([k,v] of m1) {
// console.log(s[0],s[1])
console.log(k,v)
}
这段代码就是将解构和map结合在一起,map中有一个属性[[Entries]],他是一个数组,将我们存的keys和value存在里面
for ([k,v] of m1) {
console.log(k,v)
}
console.log(m1.entries())
for ([k,v] of m1.entries()) {
console.log(k,v)
}
console.log(m1.keys())
console.log(m1.values())
var arr=[["name","karen"],["name1","karen1"],["name2","karen2"]]
var m2=new Map(arr)
console.log(m2)
map会帮我们把数组解析出来,前面的值为keys,后面的值为value,如果,有3个,那么后面的不会被放入value,
var m2=new Map()
m2.set("name","karen")
m2.set("name2","karen2")
m2.set("name3","karen3")
var arr=Array.from(m2)//把容器转化为真数组
console.log(arr)
Array.from会将()的东西转化为真数组
重点 …xx
2个用法
…xx xx是已知的容器名字:把容器中数据取出来: var arr=[1,2,2,1,3];var arr2=[…arr]
…xx xx是自己取的名字 在解构赋值中把容器中剩余数据取出来,给剩余数据去个xx的名字
let {name,…xx}={name:“karen”,age:18,rank:580};
function log(num1,…arg) {
console.log(num1,arg)
}
log(100,200,300,400)
set
set容器可以看做数学里面的集合,集合里面的数据不会重复,
var s1=new Set()
s1.add(100)
s1.add(100)
s1.add(200)
console.log(s1)
var arr=[1090,20,30,405,0,0,0,0,0,0,0]
var s2=new Set(arr)
console.log(Array.from(s2))
将数组中重复的值去除
var a = new Set([1, 2, 3]);
var b = new Set([4, 3, 2]);
var union = new Set([...a, ...b]); // {1, 2, 3, 4}
console.log(union);
取数组的并集
取数组的交集
var a=new Set([1,2,3,4,5])
var b=new Set([2,9,3,10])
var arr=[...a].filter(function(x) {
return b.has(x)
})
console.log(arr)
filter会通过返回值,如果true,将这个value放入容器,如果为false则不放入,has函数是判断后面的值是否在前面的容器中有,
字符串
var str1="6480950"
var re=str1.padStart(11,"0991")
console.log(re) //099106480950
var re=str.repeat(10)
console.log(re)
//重复10次
String.prototype.mypadStart=function(count,str) {
var arr=this.split("")
var dataArr=str.split("")//["a","b","c","d","e"]
var index=0
while(true){
index%=dataArr.length
// console.log(index)
arr.splice(index,0,dataArr[index])
index++
if(arr.length==count){break;}
}
return arr.join("")
}
var str="hello"
var re=str.mypadStart(20,"abcde")
console.log(re)
设计一个工具,让一个字符串被填充到20位,以abcde来填充
math
var re=Math.cbrt(27)
console.log(re)
取立方根
var a=-10
var b=-20
var re=Math.imul(a,b)
console.log(re)
乘法