>  기사  >  웹 프론트엔드  >  JavaScript_Basic 지식에서 비트 NOT 연산자를 사용하는 방법

JavaScript_Basic 지식에서 비트 NOT 연산자를 사용하는 방법

WBOY
WBOY원래의
2016-05-16 17:15:191163검색

~: 비트 NOT 연산자는 물결표(~)로 표시됩니다. 비트 NOT 연산을 수행한 결과는 반환된 값의 보수입니다.

코드 복사 코드는 다음과 같습니다.

var num1 = 3; 숫자는 3
var num2 = ~(num1);
console.log(num2) // "-4"
var num3 = -3; var num4 = ~(num3);
console.log(num4) // "2"
console.log(~(0)) // "-1"

예, 이제 ~ 연산자의 원리를 알았습니다. . 당신은 행복합니까? . . . 이 장을 여러 번 읽었지만 행복하지 않습니다. . . 한번도 사용해본 적이 없어서 정말 부끄럽습니다. 이 연산자를 어디에 사용할 수 있다고 생각하시나요? 친절. . . 잠시 생각해 보고 동료의 코드를 입력하세요.

코드 복사 코드는 다음과 같습니다.
if (~ item[search_key].toLowerCase().indexOf(query)) {
                                                    ~ . 🎜>
코드 복사

코드는 다음과 같습니다.

if( str.indexOf(query) != -1 ) 또는 if( str.indexOf(query) >= 0)원리 분석: str.indexOf(query)를 통해 얻은 최종 값은 다음 두 가지 유형에 지나지 않습니다. 1. str에는 쿼리 문자 문자열이 포함되며, 이때 값은 0 또는 양의 정수입니다. !!(~str.indexOf (query)) === true (or 변환 Boolean(~str.indexOf(query)) === true) 2. srt에 쿼리 문자열이 없으면 값은 -1입니다. !!(~str.indexOf(query)) === false
그래서 ~를 추가하면 indexOf를 잘 조정할 수 있고 쿼리 결과가 판단됩니다. 너무 상쾌하고 더 이상 비듬 문제가 없습니다. . 하하!
마지막으로 효율성을 분석해 보겠습니다. 비트 연산의 효율성은 연산자의 효율성보다 높아야 한다는 것 같습니다. 다음은 코드 조각입니다.



코드 복사


코드는 다음과 같습니다.

var str = "후타오어 고고고 !!!! 내 행운의 숫자는 33!!"; var query = 33; var timeStart1 = new Date() - 0; for(var i = 0; i < 100000000; i ) {        ~str.indexOf(query)    }    var timeEnd1 = new Date() - 0;
    console.log('~ 비용 시간:' (timeEnd1 - timeStart1))
// ~ 비용 시간:9954 루프 수: 10000000
// ~ 비용 시간:104 루프 수: 100000
var timeStart2 = new Date() - 0;
for(var j = 0 ; j < 100000000; j ) {
str.indexOf(query) >= 0
}
var timeEnd2 = new Date() - 0;
console .log('>= 비용 시간:' (timeEnd2 - timeStart2));
// >= 비용 시간:10120 루프 수: 10000000


프로그램 업데이트: 원본 테스트 코드는 구분선 위에서 변경되지 않고 유지됩니다. 코드는 다음과 같습니다.




코드 복사

코드는 다음과 같습니다

    var str = "hutaoer go go go!!!!! 내 행운의 숫자는 33입니다!!";
    var query = 33;
    var timeStart1 = new Date() - 0;
    for(var i = 0; i         ~str.indexOf(query)
    }
    var timeEnd1 = new Date() - 0;
    console.log ('~ 비용 시간:' (timeEnd1 - timeStart1));
    //  循环1000000次  127ms
    var timeStart2 = new Date() - 0;
    for(var j = 0; j < 1000000 ; j ) {
        str.indexOf(query) >= 0
    }
    var timeEnd2 = new Date() - 0;
    console.log('>= 비용 시간:' ( timeEnd2 - timeStart2));
    // 循环1000000次 101ms
    var timeStart3 = new Date() - 0;
    for(var k = 0; k < 1000000; k ) {
        부울 (~str.indexOf(query))
    }
    var timeEnd3 = new Date() - 0;
    console.log('부울 비용 시간 추가:' (timeEnd3 - timeStart3));
// 循环1000000次 129ms
    var timeStart4 = new Date() - 0;
    for(var k = 0; k < 1000000; k ) {
        !!(~str.indexOf(query) )
    }
    var timeEnd4 = new Date() - 0;
    console.log('추가 !! 비용 시간:' (timeEnd4 - timeStart4));
    // 循环10000000次 103ms
   

其实,对于一次运算本身来说,差无几,只是在循环次数过大,比如超过了10000000次,效率才会有一些差距。
【更新 2013.10.27 17:28】通过修改后的测试,我们可以发现,“按位不”这中写法也许并不是效率最高 ,表现最好的居然是我以前常写法,采用比运算符。这确实让我很吃惊。有时候,人往往容易被常识,表象所迷惑,亲自去尝试后,或许会無不一样的发现或得Out其他的结果。今天,我算吸取教训了。
지금 评论中,同文们tour比较反对这种不常见的写法,毕竟这些技巧可能了给阅读代码的同文造成困扰. ,甚至让人费解。或许,直接用一些简单的逻辑및常见的运算符,会是更好的选择?你们觉得呢?
因此平时写代码的时候,用哪种写法書可以。但是希望우리는 关键时刻或许就能派上记住, 关键时就能派上这些技巧记住.
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.