javascriptのビット操作子変換推論
2875 ワード
var a = "10" | 0;
alert(a);
alert (typeof a);
結果は10、numberです.つまり、この文は文字列をnumberに変換することができます.
もし:
var a = "sss" | 0;
alert(a);
結果は0ですparseInt(「sss」)はNaNに戻ります.
これは強すぎます.つまり何でもnumberに変えられます.
たとえば:
(function (){})| 0;
({})| 0;
([])| 0;
私は行きました.変態です.これは決して常識ではないですよ.
ビット演算はオペレータの両方の内容のバイナリ値で計算されます.
Stringでいえば、文字列「1」と数値1のバイナリは同じですか?ありえない
そのfunctionとobjectはもっと説明できません.
行ってきます.それともjavaを作ってみます.
public class aaa {
public String toBinary(String str){
char[] strChar = str.toCharArray();
String result = "";
for(int i = 0; i < strChar.length; i++){
result += Integer.toBinaryString(strChar[i]);
}
return result;
}
public static void main(String[] args) {
String s = "1";
int n = 1;
System.out.println(Integer.toBinaryString(n));
System.out.println(new aaa().toBinary(s));
}
出力結果:
1010
110001 110000
説明1のバイナリ値は1010で、「1」は110100000です.彼らはビットまたは演算によってバイナリの値が全く違っていることは明らかです.
運転を再開したらnumberに戻ります.結果は必ず違います.
jsのカーネルはどうやって実現されますか?
ここで推測するだけで、次のような方法があります.
public class aaa {
private int _OR_ (String s1, String s2){
int result1,result2;
try {
result1 = Integer.parseInt(s1);
}catch(Exception e){
result1 = 0;
}
try {
result2 = Integer.parseInt(s2);
}catch(Exception e){
result2 = 0;
}
return result1 | result2;
}
private int _OR_ (String s1, int s2){
int result1,result2;
try {
result1 = Integer.parseInt(s1);
}catch(Exception e){
result1 = 0;
}
return result1 | s2;
}
private int _OR_ (int s1, String s2){
int result2;
try {
result2 = Integer.parseInt(s2);
}catch(Exception e){
result2 = 0;
}
return s1 | result2;
}
private int _OR_ (int n1, int n2){
return n1 | n2;
}
public static void main(String[] args) {
System.out.println(new aaa()._OR_("10","1"));
}
}
強いタイプの言語では、ビット演算子はintとlongタイプのみに使用できます.推測が正しいなら、jsは弱いタイプで、すべての内容はビット演算操作前にjsエンジンで内部統一を実現してintまたはlongに変換する必要があります.
変換できない場合はデフォルトで0になります.最後に行のビット演算を行います.この「変態」現象が発生しました.