//全局作用域
//函数作用域
//块级作用域 用花括号{}
//在块级作用域内使用let const定义的变量,外部是无法访问的
//举例 解决for循环中计数器
// for(let i= 0;i<3;i++){//慎用,同名后期不好维护
// for(let i= 0; i<3; i++){
// console.log(i);
// }
// }
// var arr = [{},{},{}]
// for(let i=0;i<arr.length;i++){//使用let
// // arr[i].onclick = (function(i){//闭包解决,思想是用函数作用域解决全局作用域
// // return function() {
// // console.log(i);
// // }
// // })(i)
// arr[i].onclick = function(){//闭包解决,思想是用函数作用域解决全局作用域
// console.log(i);
// }
// }
// arr[2].onclick()
//const 恒量及常量,声明和赋值必须同时进行,不然会报错;不允许后续修改声明的变量;
//使用习惯:不用var ,多用const,配合用let
//数组的结构
// const arr = [100,200,300]
// const [,,baz] = arr;//一一对应提取数组成员
// const [foo, ...rest] = arr;//。。。表示提取剩余的全部数组成员,只能在最后一个参数使用
// const [foo1, a,b,c=5] = arr;
// //提取的成员大于数组成员,置为undefind,可以使用默认值
// const path = '/path/bar/baz';
// const [...root] = path.split('/')
// console.log(root);
// //对象的解构
// const name = '11'
// const obj = {'name':'zce',age:18}
// const {name:objName = 'jack'} = obj;
// console.log(objName);
//模板字符串
// const names ='tom';
// const msg = hey, ${names} --- ${1 +2 }
;
//方法能接收表达式的返回值
// const names ='deng';
// const gender = true;
// function myTagFunc (string) {
// console.log(string);
// return string[0] + names + string[1] + gender + string[2]
// }
// const result = myTagFunchey, ${names} is a ${gender}.
// console.log(result);
//字符串扩展方法: startWith、endsWith、includes
//参数默认值 function(bar ,enable = true)注意带参数的放最后
//剩余参数 function foo(...args){},放在形参的最后一位,只能出现一次//替代arguments
//展开数组 console.log.apply(console,arr),console.log(...arr)
//箭头函数 const nc =(n,m) => { console.log(111),return n+1 },,当始终使用调用者的this
//对象字面量
// const obj = { foo:123,bar,method(){},[Math.random]:123}
//对象扩展方法 assign(目标对象,源对象,源对象):复制会产生一个新的对象,值改变不会影响复制源对象
//判断两个指是否相等 object.is(+0,-0)
//代理对象proxy
// const person = {
// name:'zce',
// age: 20
// }
// const personProxy = new Proxy(person,{
// get(target,property){
// return property in target ? target[property] :'default'
// },
// set(target,property,value){
// if(property ==='age'){
// if(!Number.isInteger(value)){
// throw new TypeError(${value} is not an int
)
// }
// }
// }
// })
// console.log(personProxy.name);
// personProxy.age = 111;
//Proxy vs Object.defineProperty()
//后者只能监视属性的读写,前者可以监视更多对象操作
//前者更好的对数组对象的监视
//统一的对象操作API:Reflect--属于一个静态类 13个静态方法,与对象的一模一样
//proxy的默认实现
// const personProxy = new Proxy(person,{
// get(target,property){
// return Reflect.get(target,property))
// },
// })
//Promise
//类 class
//静态方法 static ,this不指向实例对象,指向类型
//类的继承 extends,其中super指向父类,调用父类的构造方法
//Set数据结构,集合对象,可链式使用,不允许重复数据,
//示例数据去重 const result = Array.form(new Set([1,2,3,3,3,4]))或[...new Set[arr]] =>[1,2,3,4]
//Map对象,普通对象只能存放(非字符串会toString)字符串的键,而Map可以使用对象等任意类型的值作为键
//Symbol 中文:符号,为对象创建独一无二的值,可作为对象的私有成员
// const name_= Symbol(); const person = {
// [name_] : '123',
// say(){
// console.log(this[name_]);
// }
// }
// person.say()
//for of循环是一种数据统一遍历方式
//可迭代接口 iterable
//生成器
//模块化开发