(a==1 && a==2 && a==3
)可能为true吗; 解法一:对象类型转换:(因为object与number比较时,会尝试调用toString、valueOf方法,如果不是toString或valueOf函数,则为false)
1 var a = {i : 1 ,toString ( ) {return a.i++}}
解法二:数组类型转换:(数组调用toString会隐式调用Array.join)
1 2 var a = [1 ,2 ,3 ];a.join = a.shift
解法三:定义get方法(获取值则会调用get方法)
1 2 3 4 var val = 0 ;Object .defineProperty(window ,'a' ,{ get ( ) {return +=val}; })
找出字符串中连续出现最多的字符和个数; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 'abcaakjbb' => {'a' :2 ,'b' :2 }'acccbbajk' => {'c' :3 }const arr = str.match(/(\w)\1*/g );const maxLen = Math .max(...arr.map(s => s.length));const result = arr.reduce((pre, curr ) => { if (curr.length === maxLen) { pre[curr[0 ]] = curr.length; } return pre; }, {}); arr.forEach(item => { obj[item] = obj[item] ? obj[item]+1 : 1 })
[‘1’,’2’,’3’].map(parseInt) //值是什么,为什么 parseInt() 传递两个参数,第一个为要转换的整数,第二个参数:一个介于2和36之间的整数,表示上述字符串的基数,默认为10,返回值是一个整数或NaN; 上题转换之后,实际上是:
1 2 3 4 5 6 7 8 9 10 11 12 13 ['1' ,'2' ,'3' ].map((item,index )=> { return parseInt (item,index) }) parseInt ('1' ,0 ) parseInt ('2' ,1 ) parseInt ('3' ,2 ) 进制中,逢三进一,parseInt (10 ,3 ) ['10' , '10' , '10' ,'10' ].map(parseInt ) parseInt ('10' ,0 ) parseInt ('10' ,1 ) parseInt ('10' ,2 ) parseInt ('10' ,3 )
用js实现一个无限累加的函数add add(1) //1
add(1)(2)(3) // 6
add(1)(2)(4)(5) //12
因为打印函数时会自动调用toString()方法,因此实现方法如下:
1 2 3 4 5 6 7 8 9 10 function add (a ) { function sum (b ) { a = a + b return sum } sum.toString = function ( ) { return a } return sum }
写一个函数,输入一个数组a,找到里面是否存在三个不同的元素,使得a[i]+a[j]==a[k],如果能找到输出true,找不到输出false 举例:
输入:var a1 = [1,5,10,25,9,17,100] 输出false
输入:var a2 = [2,99,3,5] 可以找到2+3=5,输出true
输入:var a3 = [1,50,0,5] 输出false;
1 2 3 4 5 6 7 8 function fn (arr ) { for (var i=0 ;i<arr.length;i++){ for (var j=i+1 ;j<arr.length;j++){ if (arr.findIndex(item => arr[i]+arr[j]===item) > j) return true } return false } }
第二种实现方法:
1 2 3 4 5 6 7 8 9 10 function fn (arr ) { for (let i = 0 ; i < arr.length; i++) { for (let j = i + 1 ; j < arr.length; j++) { let s = arr.indexOf(arr[i] + arr[j]); console .log(s) if (s > j) return true ; } } return false ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 let input = [ { "id" : "17" , "caption" : "颜色" , "types" : ["黑" , "棕" ] }, { "id" : "23" , "caption" : "材质" , "types" : ["牛皮" ] }, { "id" : "24" , "caption" : "尺码" , "types" : ["40" , "41" , "42" ] } ] let output = [ { "17" : "黑" , "23" : "牛皮" , "24" : "40" }, { "17" : "黑" , "23" : "牛皮" , "24" : "41" }, { "17" : "黑" , "23" : "牛皮" , "24" : "42" }, { "17" : "棕" , "23" : "牛皮" , "24" : "40" }, { "17" : "棕" , "23" : "牛皮" , "24" : "41" }, { "17" : "棕" , "23" : "牛皮" , "24" : "42" } ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 function t (input ) { return input.reduce((ret,outterItem )=> { if (!ret.length){ return outterItem.types.map(type => ({[outterItem.id]: type})) } let results = [] outterItem.types.forEach(type => { results = results.concat(ret.map(innerItem => { return { ...innerItem, [outterItem.id]: type } })) }) return results },[]) }
{1:222,2:333,5:444}放进一个12月份的数组里,没有的写null; 1 2 3 4 5 6 let obj = {1 :222 ,2 :333 ,5 :444 }function fn (obj ) { return Array .from({length :12 },(item,index )=> { return obj[index+1 ] || null }) }
深拷贝原理:(数组,对象都可用) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 function deepCopy ( obj ) { if ( Object .prototype.toString.call( obj ) === '[object Object]' ){ var result = {} }else if ( Object .prototype.toString.call( obj ) === '[object Array]' ){ var result = [] } for ( var attr in obj ){ if ( typeof obj[attr] == 'object' ){ result[attr] = deepCopy( obj[attr] ) }else { result[attr] = obj[attr] } } return result }
对象遍历方法 (1)使用for…in方法遍历
(2)使用Object.keys、Object.values方法遍历
(3)使用Object.entries、Object.fromEntries方法遍历
1 2 3 4 5 6 7 8 9 let obj={ tom : 18 , jack : 20 , xiaoh : 19 , xiaof : 21 , xiaom : 14 } let arr = Object .entries(obj).filter(([name,age] )=> age>19 )console .log(Object .fromEntries(arr))