牛客小知识
2021/9/29大约 4 分钟
牛客小知识
函数声明与变量提升js中没有函数重载,其他语言中(如java)java中,可以存在同名函数,
只要传入的参数数量或者类型不同即可。在js中,定义了两个同名函数后,
后面的函数会覆盖前面定义的函数。this指向
- 函数调用时,非严格模式下,指向window,严格模式下,this 是undefined
- 以方法调用时,指向调用该方法的对象
- 使用new创建一个对象时,指向该对象
- call,apply ,bind可以改变this指向 区别,传参不同
apply,call,bind用法区别
用途: 手动改变this的指向
区别:1.apply和call会使当前函数立即执行,bind会返回一个函数,后续需要时再调用
2. call是apply的语法糖,只有传的参数不同,call中要传多个任意参数,apply只可以直接传数组 或者类数组
- bind是为函数绑定一个this上下文
规则: fn.apply(上下文环境,执行所需数组)
fn.call(上下文环境,执行所需单个参数)
fn.bind(上下文环境)
ps:如果上下文的值为null,则使用全局对象代替,相当于没传上下文还用以前的
apply可以将一个数组转换为一个参数列表([p1,p2,p3]转换为p1,p2,p3)
var arr=[1,2,3,4]
console.log (Math.max.apply(null,arr))//4
Math.max()只能传数字,可以使用apply将数组转为一个一个参数传入
Boolean(undefined), Boolean(null), Boolean(false),Boolean(0), Boolean(NaN), Boolean('')返回false
**Number([])=>0 , Number({})=>NaN , **
true和false和其他任何类型比较时都分别变成1和0
==运算符
- null == undefined // true
- 2 == "2" // true
var a=b=5等价于var a=5,b=5,b=5前没有声明var则相当于全局变量b=5
常用遍历方法:
- forEach:ES5的新语法,迭代器,遍历数组中的每一项,没有返回值,对原数组没有影响**,不支持IE。
let arr=[1,2,3,4,5]; arr.forEach((item,index,array)=>{ console.log(item,index,array); //value数组中的当前项, index当前项的索引, array原始数组 })- some:对数组中每一项运行指定函数,如果该函数对任一项返回true,则返回true。
let arr=[1,2,3,4,5]; let bool=arr.some((item,index,array)=>{ return item>3 }) consoole.log(bool); // true- filter:遍历数组,对每个元素都执行函数参数,返回一个新数组,不改变原数组。
let arr=[ {id:0, name:'zjf'}, {id:1, name:'abc'}, {id:2, name:'def'} ]; console.log(arr.filter(item => item.name)); // ['zjf', 'abc', 'def'] let arr=[1,2,3,4,5] console.log(arr.filter(item => item >3 )); // [4, 5] [1,2,3,4,5].filter((item,index,arr)=>return index % 2 === 0); // [1,3,5]- find:遍历数组,可获取到该数组原内存地址的数据并改变原数组
var students = [ { id: 1, name: '张三', age: 18, sex: 0, like: '睡觉' }, { id: 2, name: '李四', age: 35, sex: 0, like: '读书' }, ] var stu = students.find(function(item){ return item.id == 2; }) console.log(stu); //{ id: 2, name: '李四', age: 35, sex: 0, like: '读书' } stu.aaa = 100; console.log(stu); //{ id: 2, name: '李四', age: 35, sex: 0, like: '读书', aaa: 100 } console.log(students); /* [ { id: 1, name: '张三', age: 18, sex: 0, like: '睡觉' }, { id: 2, name: '李四', age: 35, sex: 0, like: '读书', aaa: 100 } ] */- reduce:遍历数组,更方便的处理数组数据(类似于迭代遍历)
arr.reduce((prev, cur, index, arr) => { }, init) //arr:表示原数组 //prev:上一次回掉时的返回值,或者初始值init //index:表示当前元素值的索引,如果init的值为0,它的值就为0,否则就为1 //cur:正在处理的数组元素 let arr = [1,2,2,3,4,5,5]; let sum = arr.reduce((pre,cur,index,arr)=>{ // 求和 return pre+=cur; },0); let moveRepeat = arr.reduce((pre,arr)=>{ // 去重 pre.indexOf(arr) === -1 && pre.push(arr); return pre; },[]); let max = arr.reduce((pre,arr)=>{ // 取最大值 return pre > arr ? pre : arr; }); console.log(sum); // 22 console.log(moveRepeat); // [1,2,3,4,5] console.log(max); // 5三目运算符
console.log('Value is' + (val!=0)? 'define' : 'unDefine'); // define +运算符优先级高于三目运算符 ? : , 括号中无论真假 加上前边的字符串都为 TRUE 三目运算为TRUE是 输出 definevar f=function g(){ return 23; }; typeof f; // function typeof f(); // number typeof g; // undefine typeof g(); // Error...的用法
展开语法:1.可以在函数调用/数组构造时,将数组表达式或者string在语法层面展开;2.可以在构造字面量对象时,将对象表达式按key-value的方式展开。
function sum(x,y,z) { return x + y + z; } const num = [1, 2, 3]; sum(...num); //**数组**表达式或者string在**语法层面展开** sum.apply(null, num); //同上 语法: 函数调用:'' myFunction(...iterableObj); 字面量数组构造或字符串: [...iterableObj, '4', ...'hello', 6]; 构造字面量对象时,进行克隆或者属性拷贝 let obj1 = { foo:'bar', x:42 }; let obj2 = { foo:'baz', y:43 }; let objClone = { ...obj1 }; //{ foo:'bar', x:42 } let obj3 = { ...obj1, ...obj2 }; //{ foo:'bar', x:42, y:43} let mergeObj = merge( obj1, obj2); //{ 0:{ foo:'bar', x:42 }, 1:{ foo:'baz', y:43 }} 没有展开语法时,只能用push,splice,concat等方法,来将已有数组变成新数组的一部分 let childArr = ['d','e']; let arr=['a', 'b', 'c', ...childArr, 'f']; //=>['a','b','c','d','e','f']