https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Statements
https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Guide/Expressions_and_Operators
Javascript 的語句類型,用於命令執行指定的一系列操作
最大特徵則是不會回傳結果
又可稱為表示式、運算式
經常透過一些符號結合上下語句並運算及回傳結果
所以表達式會回傳結果
陳述式不會回傳結果,不能賦值在其他變數上面
// 函式陳述式,具名函式
function callName() {
}
// 函式表達式,匿名函式
var callName = function () {
}
上面hoist 結果會不一樣
// block語句(函式陳述式)
{
const ming = '小明';
}
// const 只有在block語句內才有作用
// 物件實字(函式表達式)
var a = {
ming: '小明'
}
ASI: 當 js 語句沒有加入分號時,則會受到自動插入分號(ASI規則影響)
function callName() {
return
'叫我小明';
}
console.log(callName()); // undefined
因為return 其實後方自動加上分號,變成下面
function callName() {
return;
'叫我小明';
}
console.log(callName()); // undefined
所以正確寫法為以下
function callName() {
return '叫我小明';
}
console.log(callName()); // 叫我小明
http://www.victsao.com/blog/81-javascript/287-javascript-function-iife
https://www.udemy.com/course/javascript-adv/learn/lecture/15793656#questions
js 是動態型別
typeof可以檢查型別
var name; // hoist,創造階段準備一個空間
name = '小明'; // 賦於給小明
console.log(typeof name); // string
js 有分為顯性轉換和隱性轉換
就是變數的值直接被賦於另一個值
var num = 1;
console.log(typeof num);
num = '文字';
console.log(typeof num);
運算子就是很好的例子
var num = 1;
console.log(num, typeof num); // 1 "number"
num = num + '';
console.log(num, typeof num); // 1 string
num = num * 3;
console.log(num, typeof num); // 3 "number"
原始型別7種
String 字串
Number 數值
Boolean 布林
Null 空
Undefined 未定義
=========前面5個比較主要===========
Symbol (new) Symbol (new)
BigInt (new) 整數數值 (new )
原始型別都有方法
會有額外的包裹物件,去取得型別的方法,例如string有大小寫或者算出長度...等
new Boolean()
new String()
new Number()
Symbol()
BigInt()
原始型別要注意兩點
1.d = null; 雖然印出為 obj 物件型別,但因為官方無法修正會導致一些錯誤...等,所以這邊是原始型別
2.console.log(typeof e); // 這邊沒有宣告 e 主要是 js 的保護機制,不出現 not defined,所以才會印出 undefind
var a,
b,
c,
d;
a = 1;
a = '文字';
b = true;
c = {};
d = null; // 記住!! 雖然印出為obj 物件型別,但因為官方無法修正會導致一些錯誤...等,
// 所以這邊是原始型別
console.log(typeof e); // 這邊沒有宣告e 主要是js的保護機制,所以才會印出undefind
若是要查詢原始型別查詢有哪些方法可以用,就必須用包裹型別
a = 'ming';
console.log(a.length);
console.log(a.toLocaleUpperCase());
var e = new String(a);
console.log(a, e); // e 展開會有個_proto_ js 的方法都在裡面
介紹一元(ex: typeof...等) 二元(幾乎都是) 三元(條件) 運算子
https://www.udemy.com/course/javascript-adv/learn/lecture/15307534#questions
查看運算子優先性與相依性 ex: +*... 等
https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Operators/Operator_Precedence
決定運算子彼此之間被語法解析的方式
優先序較高的運算子會成為優先序較低運算子的運算元
相依性決定運算方向
var a = 2 * 2 + 2 * 3;
console.log(a); // 10
因為*優先性+在優先性 =
console.log(1<2<3) // true
console.log(3>2>1) // false
解析出來
3>2 = true
true > 1 true會轉型成number 1 所以1>1 就變成false
var a = 1;
var b = 2;
a = b = 3;
console.log(a, b);// 3 3
b = 3; // 觀念錯誤
a = b; // 觀念錯誤
var b = {};
Object.defineProperty(b, 'a', {
value: 2,
writable: false //無法覆寫
});
b.a = 5;
console.log(b.a); // 2
var a = 3;
a = b.a = 1;
console.log(a, b.a); // 1 2
因為b.a = 1 是表達式回傳結果是1,因為跟b.a沒有關係
所以a = 1;
Object.defineProperty(b, 'b', {
value: 3,
writable: false //無法覆寫
});
var a = 3;
a = b.b = b.a = 1;
console.log(a); // 1
解析
a = b.b = 1;
有特別情況,須注意
1.console.log( NaN === NaN ); // false
NaN 表示不是數值,所以兩個比對為 false
2.console.log( +0 === -0 ); //true
影片有許多考題可以練習!!!
https://www.udemy.com/course/javascript-adv/learn/lecture/15307538#questions
console.log(1 == '1'); // true
解析
Number('1') = 1;
console.log(1 == Number('1'));
console.log(17 == '0x11'); // true
Number('0x11') // 16 + 1
console.log( true == 'true' ); // false
Number('true') // NaN
1 == NaN 就是 false
許多考題在影片
ex: console.log(null == 0); // false
console.log([10]);
console.log(10 == [10]); // true
因為陣列是用包裹物件的Number([10]) 做轉換 等於10
console.log('A' == ['A']); // string
因為陣列是用包裹物件的String(['A']) 做轉換 等於'A'
console.log(String({A: 'A'})); // [object Object]
console.log('[object Object]' == {A: 'A'}); // true
console.log([] == []); // false
console.log({} == {}); // false
這邊後面物件會有更詳細介紹,這邊規則需要背下來
整理:
非物件與非物件比對,string and boolean 會根據Number()轉數值
null == undefined 但 === 會不一樣 ,且不會根據Number()轉數值
非物件與物件比對,物件會根據包裹物件轉換
物件與物件比對,會根據參考位置不同,所以[]==[] 為false {}=={} 為false