// 预编译的四部曲:口诀:(变量(var a = 123) a声明提升a=undefined,函数声明整体提示)// 1.创建GO/AO对象 // GO是全局代表的window地方 AO代表啊的函数存储的地方// 2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined// 3.将实参值和形参统一(有形参先把参数赋值)// 4.在函数体里面找函数声明,值赋予函数体
console.log(a);//undefinedvar a =1;
b =2;
console.log(b);//2functionf(a){
console.log(a);//function a(){}var a =123;
console.log(a);//123 直接把AO里的a变成123functiona(){}varb=function(){};functiond(){}
console.log(b);//function(){}}f(5);
console.log(a);//1// 1,我们一步一步来先创建GO对象 2,找到 a 和 f 函数 (b不是的)//3,将实参值和形参统一 4.在函数体里面找函数声明,值赋予函数体// GO ={//GO代表就是全局的 GO = window// a:undefined,// f:function f(a){},// };// 全局执行完毕 我们执行AO// 1,我们一步一步来先创建AO对象 2,找到 a,b.d,如果重复下一个会覆盖上一个//3,将实参值和形参统一 (有参数先吧参数赋值)4.在函数体里面找函数声明,值赋予函数体//这些预编译完成,在进行代码执行// AO = {// a:function(){},// b:function(){},// d:function (){},// }
函数常用写法(匿名函数,函数表达式)
// 函数有2中写法,匿名函数 function test(){};函数表达上 var test1 = function(){}; 命名规则 小驼峰 theFirs// 函数变量 函数内部可以访问函数外部的变量,外部访问不到内部的 会报错// 2种常用的立即执行函数 (function (){}()); (function () {})(); 不常用的 var test = function(){}(); ! function(){}()vartest1=function(){//arguments a哥闷死 是一个数组,arguments是函数体自带的 arguments(形参)改变,形参(arguments)也改变
console.log(arguments);//1,2 这是一个伪类数组 可以通过[...arguments]变成数组var num =0;for(let i=0; i<arguments.length; i++){
num += arguments[i];}//函数,每一个函数都有一个return return代表着终止函数和返回函数(不写系统默认自带)return num;};var num =test1(1,2);//3 num就是函数test1 返回接收的内容
函数(生成器函数,构造函数)
// 生成器函数可以解决异步操作(不需要在ajax嵌套ajax了)functiongetUsers(){setTimeout(()=>{let data ='用户数据';//调用 next 方法, 并且将数据传入
iterator.next(data);},1000);}functiongetOrders(){setTimeout(()=>{let data ='订单数据';
iterator.next(data);},1000)}function*gen(){let users =yieldgetUsers();
console.log(users)let orders =yieldgetOrders();
console.log(orders)}//调用生成器函数let iterator =gen();
iterator.next();// 构造函数 命名规则 小驼峰 function Thefirs(){};//构造函数写法 必须带newfunctionTest(name){// 构造函数就是在函数顶部增加一个 var this = {} 对象 可以增删改查,this.name = name;this.sex ="男";this.say=function(){return"I am "+this.name;};// 这里会生成闭包// 底部最后返回这个对象 return this 返回的时候只能是对象 数组}var test =newTest("xiaozhang");//new 它就是一个构造函数 不new 它就是匿名函数var say = test.say();
test.num =100;
console.log(test.num);//100
console.log(test.sex);//男
console.log(test.name);//xiaozhang
console.log(say);//I am xiaozhang
函数(箭头函数,高级函数)
// 箭头函数(this 是静态的. this 始终指向函数声明时所在作用域下的 this 的值)varlist= n =>{//有一个形参这里的()可以省略不写
console.log(n)}list(1)varlist1=()=>{//没有形参这里的()要写
console.log(2)}list1()varlist2= n => n * n //函数内部做一条判断{}可以省略不写
console.log(list2(3))var obj ={list(){//list这里也是一个匿名函数(只不过在对象做:function可以省略不写)}}
obj.list();//高阶函数:如果一个函数符合下面2个规范中的任何一个,那该函数就是高阶函数。//1.若A函数,接收的参数是一个函数,那么A就可以称之为高阶函数。//2.若A函数,调用的返回值依然是一个函数,那么A就可以称之为高阶函数。//常见的高阶函数有:Promise、setTimeout、arr.map()等等//函数的柯里化:通过函数调用继续返回函数的方式,实现多次接收参数最后统一处理的函数编码形式。 functionsum(a){return(b)=>{return(c)=>{return a+b+c
}}}
数组常用方法,
var arry =[{name:'张三',sex:'男'},{name:'李四',sex:'女'},{name:'王二',sex:'男'}]
arry.splice(1,2)//从下标1的位置截取2个元素// 0: {name: "张三", sex: "男"}//join把数组转换成字符串//push(): 可以接收任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度。 //pop():数组末尾移除最后一项,减少数组的 length 值,然后返回移除的项。//shift():删除原数组第一项,并返回删除元素的值;如果数组为空则返回undefined 。 //unshift():将参数添加到原数组开头,并返回数组的长度 。//concat():数组合并//includes('2') 判断数组中是否有这个值var arry1 =[1,2,3,1]var arry2 =[6,9]let result =[...newSet(arry1)];// 数组去重let union =[...newSet([...arry1,...arry2])]//数组合并
对象常用方法,
var obj ={ name:"御马", sex:'男', arry:[1,2,3,4,'a','v','a']};var obj1 ={ list:'我是一个列表'};var obj2 ={};// console.log(Object.keys(obj2).length)//判断对象是否为空// Object.assign(obj2,obj1,obj);//对象合并 let obj3 = {...obj,...obj1}// console.log(delete obj.name);//删除对象// console.log('sex' in obj);//判断值是否在对象中 返回 false true
字符串常用方法,
var str ='123456';
console.log(str.slice(2,4))//从字符串的第2个位置到第4个位置直接的字符串片段: 34//concat():字符串合并//includes('2') 判断字符串中是否有这个值//indexof()判断一个字符第一次出现在某个字符串的索引,如果包含返回它的索引,如果不包含返回-1.//split() 用指定字符分割字符串,返回一个数组.对原字符串没有任何改变。