運算子/優先序/寬鬆與嚴格相等/型別 - 小測驗


Posted by hoyi-23 on 2021-05-22

第一題 非物件與物件間的寬鬆相等

var a = 1; //number
var b = new Number(1); //object
console.log(a == b); //true

雖然b是物件,但當使用寬鬆相等比較物件與非物件時,物件會使用包裹物件轉換為值。
第二題非物件與物件間的嚴格相等

var a = 1; //number
var b = new Number(1); //object
console.log(a === b); //false

嚴格相等需要比較型別。a為原始,b為物件,得到的一定是false。
第三題

var a = 1;
var b = 0;
console.log(1 || 0); // 1

|| or,若今天第一個為真值就會立即回傳,若為假值,不管如何都會回傳第二個。
第四題

var a = 1;
var b = 2;
var c = 0;
console.log(a && b && c);  // 0
console.log(c || c && c || a);  // 1
console.log(a && b || c && a); //2
  1. && and,為二元運算子,因此會兩個兩個比較,若第一個為真值,不管如何都會回傳第二個。
    執行順序: 由左至右
  2. &&的優先執行序較||高
    執行順序: 先執行&&,再由左至右 執行||。
  3. 執行順序: a && b > c && a > ||

第五題

var a = 1 + 1 === 1;
console.log(a); //false

等號的優先序基本上都是最低,並且等號運算子的執行順序是由右至左,與一般不同。
第六題

console.log(1000<10000<10); //true

比對運算子,為二元運算,所以一次只會兩個比較,並且執行順序由左至右。
1000 < 10000 //true,true < 10 //true。
第七題

var a = '1'; //string
var b = 2; //number
var c = (a > b) ? a*b : sum(a,b); //三元運算
function sum(a,b){
    return a+b;
}
console.log(c); //12。a為字串。

三元運算子: 判斷式 ? 表達式 : 表達式 ;

<return a+b>字串 1 和 數字 b(2) 相加的時候瀏覽器會將數字 2 轉換成字串 2。
第八題 型別問題

var a = true;
var b = 'undefined';
var c = 1;
var d = null;
var e = NaN;
var f = undefined;
console.log(typeof(a)); // boolean
console.log(typeof(b)); // string
console.log(typeof(c)); //number
console.log(typeof(d)); //object
console.log(typeof(e)); //number
console.log(typeof(f)); //undefined

第九題
new Number() 建立資料後後,此時使用 typeof() 會出現什麼型別?
Answer: 陣列。
第十題

var a = new Object(); //object
var b = a; //object
console.log(a === b); //true

第十一題

var a = new Object('1234');
var b = BigInt(1234); //1234n
console.log(a == b); //true

BigInt 是一個內建的物件,提供了表示大於253的整數的功能 (253是JavaScript原生的Number能夠表示的最大值)。
透過在一個數值後加上 n ,例如 10n ,或呼叫 BigInt() 所生成的。
但是在這邊還是要注意 BigInt 目前還是一個「實驗中的功能」,因此未來或許會再做調整唷。
第十二題

var a = new Object();
if(a){ //true
    console.log('執行');
}elses{
    console.log('Else');
} // 執行

第十三題

console.log(10 + 10 - 10 * 2) //0

第十四題

var a = 10;
console.log(++a * a); //++a 因為+號在前面所以會先變成 11,最後的 a 也會變成 11 ,11乘11 所以會變成 121 
a=10;
console.log(--a * a); //--a 因為 - 號在前面所以會先變成 9,最後的 a 也會變成 9 ,9乘9 所以會變成 81 
console.log(a++ * a); //因為++ 在後面所以第一個 a++ 還是 10,到了 執行第二個乘 a 此時 a 變成 11 了!所以是 10 * 11 = 110
console.log(a-- * a); //因為 -- 在後面所以第一個 a-- 還是 10,到了 執行第二個乘 a 此時 a 變成 9 了!所以是 10 * 9 = 90

++1 符號放前面數值會立刻在這個階段就被增加
1++ 符號放後面數值會在下一個階段才增加

第十五題
底下程式碼是否會出現ASI 機制錯誤呢?

var a = 10
(a + 10).toString();   //10 is not a function

實際執行結果是 var a = 10(a + 10).toString();
var a = 10 後方要加入分號

補充1: 運算優先權 網站

 補充2: TypeError: X is not a function 是哪裡出錯了?

問題出在你試圖去调用一个像函數一样的值,但是该值實際上不是函數。
以下為錯誤的例子:

  1. 函式名稱錯誤
     var x = document.getElementByID("foo");
     // TypeError: document.getElementByID is not a function
    
    是document.getElementById
  2. 調用Object類型中不存在的方法
     var obj = { a: 13, b: 37, c: 42 };
     obj.map(function(num) {
           return num * 2;
     });
     // TypeError: obj.map is not a function
    
    map()只能被 Array 所調用。
  3. 使用括號進行乘法運算
     const sixteen = 2(3 + 5);
     alert('2 x (3 + 5) is ' + String(sixteen));
     //Uncaught TypeError: 2 is not a function
    
    上方TypeError的錯誤正是此種。









Related Posts

Day 128

Day 128

用 DDS 開發 ROS 2.0

用 DDS 開發 ROS 2.0

gulp

gulp


Comments