三种方法进行查找
第一种是左开右开,找到就返回mid,未找到就返回-1
定义两个变量,分别为F(first) = 0 ,L(last) = nums.lenth,表示数组的下标两端
每次获取中间下标,let mid = Math.floor((f+l)/2) 
如果target > nums[mid] 则目标是一定在mid的右边,即让 F  = mid + 1
如果target < nums[mid] 则目标是一定在mid的左边,即让 L  = mid - 1
如果 target  === musp[mid] 则返回 mid 
遍历数组,用 L = nums.length - 1 ,是为了避免目标在最左边情况,如【1,2,...】,1
遍历数组,用 i <= nums.length -1,是为了避免目标在最右边情况,如【1,2】,2
function search( nums ,  target ) {
    // write code here 
    let F= 0, L= nums .length - 1
    for(let i = 0; i <= L; i++){
        let mid = Math.floor((F+L)/2)
        if(nums[mid] > target){
            L = mid - 1
        }else if(nums[mid] < target){
            f = mid + 1
        }else{
            return mid
        }
    }
    return -1
} 


第二种是左开右闭,目标值是跳出循环时的索引,即nums[L](L = F)
判断 目标值是否是 nums[L], return target === nums[L] ? L : -1
function search( nums ,  target ) {
    // write code here 
    let F = 0, L= nums.length - 1
    for(let i = 0; i < L; i++){
        let mid = Math.floor((F+L)/2)
        if(nums[mid] < target){
            F= mid + 1
        }else{
            L= mid
        }
    }
    return nums[L] === target ? L: -1
}


第三种是左闭右开,和上面一样,目标值是跳出循环时的索引,即nums[L](L = F)
但是得特别注意,这种会有一种特殊情况,会一直再循环中,那就是【1,2,...】,2
所以为了处理这种特殊情况,必须得取中间值时加一,即 mid = Math.floor((F+L +1)/2)
判断 目标值是否是 nums[L], return target === nums[L] ? L : -1
function search( nums ,  target ) {
    // write code here
    let f = 0, l = nums.length - 1
    for(let i = 0; i < l; i++){
        let mid = Math.floor((f+l)/2)
        if(nums[mid] < target){
            f = mid + 1
        }else{
            l = mid
        }
    }
    returnnums[l] === target ? l : -1
}