1.在if的條件中不能直接使用未申明的變量
要點:typeof對未申明的變量返回“undefined”澎现。
//若DEBUG在開發(fā)和測試中才會有,生產(chǎn)環(huán)境沒有
//這樣會ReferenceError
if (DEBUG) {
console.log("開始調(diào)試");
}
//使用typeof的安全防范機制使其安全
if (typeof DEBUG !== "undefined") {
console.log("開始調(diào)試");
}
//使用對象.屬性的方式訪問避免錯誤
if (window.DEBUG) {
console.log("開始調(diào)試");
}
2.字符串的不可變性
要點,雖然可以以數(shù)組的方式訪問每辟,但是仍為不可變剑辫。
let a = 'foo';
console.log(a[1]);// o
a[1] = 'x';
console.log(a[1]);// o
3.判斷NaN使用Number.isNaN()
window.isNaN("foo");//true
Number.isNaN("foo");//false
4.對基本類型封裝與拆封
let a = 'abc';
let b = new String( a );
let c = new Object( a );
typeof a;// "string"
typeof b;// "object"
typeof c;// "object"
//使用valueOf()對包裝類型進行拆封
a.valueOf();// "abc"
5.ToNumber
Number(undefined); // undefined
Number(null); // 0
Number(""); //0
Number([]); //0
Number([ "abc"]); //NaN
6.ToBoolean
一、除了以下值渠欺,強制類型轉(zhuǎn)換是false妹蔽,其他都為true
1.undefined
2.null
3.false
4.+0,-0挠将,NaN
5.""http://空字符串
二胳岂、包裝類型都為true
例1:
let a = new Boolean( false );
let b = new Number( 0 );
let c = new String( "" );
let d = Boolean( a && b && c);// true
例2:
let a = [];
let b = {};
let c = function(){};
let d = Boolean( a && b && c);// true
三、if使用的是toBoolean()來轉(zhuǎn)換為Boolean類型
if([]) console.log('true'); // true
[] == true; //false
7.顯式強制類型轉(zhuǎn)換
一舔稀、字符串轉(zhuǎn)數(shù)字
1. +"42" //42
2. "42" * 1 //42
二乳丰、日期轉(zhuǎn)數(shù)字
1. + new Date(); //1562722522069
2. Date.now(); //1562722786254
8.隱式類型轉(zhuǎn)換
==允許在相等比較中進行強制類型轉(zhuǎn)換,而===不允許
// +操作會被轉(zhuǎn)換為字符串
1. [1, 2] + [3, 4] // "1,23,4"
// * / - 會被轉(zhuǎn)換為數(shù)字
2. [2] * 1 // 2
// &&與||應(yīng)該稱作選擇器運算符
3. 42 && 33 // 33
true || 33 //true
9.“内贮!”操作符會顯式地將值強制轉(zhuǎn)換為布爾值
[] == ![] //true
右邊:![]會變?yōu)?Boolean([])产园,其結(jié)果為!true,最終為false。
最后變?yōu)閇] == false夜郁。成立
1. [] == false // true
2. !![] == true // true
10.switch要點case 后的結(jié)果會和switch的條件進行===比較
let a = 'hello world';
let b = 10;
switch (true) {
case (a || b == 10):
//永遠不會執(zhí)行到這里
break;
default:
console.log( "Oops" );
}
//Oops
原因:a || b == 10 的結(jié)果為'hello world', 'hello world' === true //false
11.變量與值:在賦值時只是賦給了形參對參數(shù)的引用什燕,而形參與原參數(shù)沒有關(guān)系,理解變量與值之間的關(guān)系竞端。
function setName(obj) {
obj.name = 'Nicholas';
obj = new Object();
obj.name = 'Greg';
}
let person = new Object();
setName(person);
alert(person.name); //'Nicholas'