== 比较时,转换

101 阅读1分钟
1 对象==字符串
  对象.toString()变成字符串
2 null == undefined 相等,但与其他值比较不相等
3 NaN == NaN 不相登
4 其他类型都是先转换成数字

对象转数字,先toString,再转化成数字 先调valueof,在调tostring

//输出1
var a =?
if (a ==1 && a==2 && a ==3){
    console.log(1)
}

解法1:

var a = {
    i:0,
    toString:function(){
        return ++this.i
    }
}
if (a==1 && a==2 && a==3){
    console.log(1)
}

解法2:

var i = 0
Object.defineProperty(window,'a',{
    get(){
        return ++i
    }
})
if (a==1 && a==2 && a==3){
    console.log(1)
}

解法3

var a=[1,2,3]
a.toString = a.shift
if (a==1 && a==2 && a==3){
    console.log(1)
}

数组扁平化

let arr = [1, 2, 3, 4, [1, 2, 3, [1, 2, 3, [1, 2, 3]]], 5, "string", { name: "弹铁蛋同学" }]
arr = arr.flat(Infinity)
arr = arr.toString().split(',').map(item=>parseFloat(item))
arr = JSON.stringify(arr).replace('/(\[|\])/g','').split(',').map(item=>parseInt(item))

while(arr.some=>(item=>Array.isArray(item)){
   arr=[].concat(...arr)
})

斐波那契数列

解法1

function fi(n) {
    if(n<=1) return 1
    let arr = [1,1]
    let i=n+1-2 // +1是,创建比传入的多一个,比如传5,创建6个,
                //-2是指前面已经创建了[1,1]
    while(i>0){
        let a = arr[arr.length-2]
        let b = arr[arr.length-1]
        arr.push(a+b)
        i--;//加一次,减少一次循环
    }
    return arr[arr.length-1]
}

解法2

function fi(count){
    function fn(count, curr=1,next=1){
        if(count==0){
            return curr
        } else {
           return fn(count-1,next, curr+next)
        }
    }
    return fn(count)
}

输出所有和N的连续正数序列

function fn(count){
    let result = []
    let middle = Math.ceil(count/2)//求出中间值
    for(let i=1;i<=middle;i++){//从1开始累加
        for(let j=2;;j++){
            let total = (i+(i+j-1))*(j/2)
            if (total>count){
                break
            } else if (total === count){
                result.push(createArr(i,j))
                break
            }
        }
    }
    return result
}

function createArr(n,len) {
    let arr = new Array(len).fill(null)
        temp=[]
    arr[0]=n
    arr = arr.map((item,index)=>{
        if(item===null){
            item = temp[index-1]+1
        }
        temp.push(item)
        return item
    })
    return arr
}
console.log(fn(5))