~: 비트 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를 잘 조정할 수 있고 쿼리 결과가 판단됩니다. 너무 상쾌하고 더 이상 비듬 문제가 없습니다. . 하하!
마지막으로 효율성을 분석해 보겠습니다. 비트 연산의 효율성은 연산자의 효율성보다 높아야 한다는 것 같습니다. 다음은 코드 조각입니다.
코드 복사
코드는 다음과 같습니다.
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比较反对这种不常见的写法,毕竟这些技巧可能了给阅读代码的同文造成困扰. ,甚至让人费解。或许,直接用一些简单的逻辑및常见的运算符,会是更好的选择?你们觉得呢?
因此平时写代码的时候,用哪种写法書可以。但是希望우리는 关键时刻或许就能派上记住, 关键时就能派上这些技巧记住.