javascript的變態位運算
?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”的是110001110000。
顯然他們按位或運算后轉換成二進制值完全不同。
運行再次還原回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。
最后再經行位運算操作。
由此也就產生了這個"變態"現象。我了個去………