屬性是用來描述當前對象特徵的,屬性名是當前對象具有的特徵,屬性值是這個特徵的描述,一組屬性名和屬性值成爲一組鍵值對
javascript
var feTraining = {
name: '江外琉璃',
age: 9,
characters: '琉璃鑲內江10年',
9: 'age'
}
複製代碼
console.log(feTraining.name);
console.log(feTraining['name']);
var str = 'age';
console.log(feTraining[str]); // 9
複製代碼
若是用. 後面的屬性名不用寫引號,若是使用[],屬性名須要用字符串包裹vue
若是屬性名是數字,只能使用 []java
方括號裏面還能夠寫變量或者表達式node
若是獲取一個對象不存在的屬性,會獲得一個undefinedreact
增長/修改數組
js對象中的屬性名是不容許重複的,是惟一的
瀏覽器
如給個一個對象的屬性賦值,有兩種狀況:
- 若是對象以前不存在這個屬性,那麼就是給這個對象增長一個屬性,值是等號右側的值
- 若是對象以前已經存在這個屬性了,再賦值就是修改對象中的這個屬性的值
複製代碼
feTraining.courses = 'JS高級+vue+react+node'; // feTraining以前不存在courses這個屬性,因此是增長;
console.log(feTraining);
feTraining.name = 'Everest Training'; // feTraining以前就存在name屬性,因此是修改
console.log(feTraining);
複製代碼
delete feTraining.age;
console.log(feTraining);
feTraining.courses = null;
console.log(feTraining); // course屬性名還在,只是值爲null了
複製代碼
var obj = {
name: '江外琉璃',
age: 10
};
obj.name // '江外琉璃'
obj['name'] // '江外琉璃'
obj[name] ?? =+ name和 'name'有什麼區別?'name'表示的是一個字符串,而name表示一個變量名
複製代碼
對象中的屬性名都是字符串類型的
markdown
var ary = [12, 23]; // ? 12和23是都是屬性值,屬性名呢? console.log(ary); // 從控制檯能夠發現是有鍵的,而且鍵都是數字測試
數組的鍵是數字,因此只能用方括號的方式獲取、修改,並且寫在方括號裏面的屬性名不須要用引號包裹;ui
var ary = [12, 23];
console.log(ary[0]);
console.log(ary.0); // 報錯
console.log(ary[1]);
console.log(ary[2]); // 訪問一個數組不存在的索引,會獲得一個undefined
複製代碼
var a = 12;
var b = a;
b = 13;
console.log(a); // 12
console.log(b); // 13
var obj1 = {
name: '江外',
age: 10
};
var obj2 = obj1;
obj2.age = 100;
console.log(obj1.age); // 100
console.log(obj2.age); // 100
複製代碼
基本數據類型(也叫作值類型)的操做,直接操做就是這個值,意思就是說變量自己就表明這個值。因此: var b = a; 存儲12這個值,而後聲明一個變量b,而後讓變量b和這個新的12關聯起來。這一行和 var b = 12本質上沒有任何區別;
引用數據類型都是存放在堆內存空間中的,同時這個堆內存空間有一個十六進制的內存地址。咱們在聲明一個引用數據類型時,不是直接把對象賦值給變量,而是把對象的堆內存地址賦值給變量。 因此引用數據類型的操做不是直接操做的值,而是操做它的引用數據類型的堆內存地址。因此var obj2 = obj1; 只是把obj1表明的堆內存地址地址賦值給了變量obj2。 因此obj2.age = 100;是經過obj2的堆內存地址找到堆內存地址中的存儲的age的值,把它修改爲100。同時,咱們訪問obj1.name 時也是先經過obj1存儲的堆內存地址找到內存空間,而後從裏面把屬性age的值取到,此時這個內存空間中的值已經修改爲100了。因此obj.name 也是100
var boo = Boolean(1);
var boo2 = Boolean(0);
console.log(boo, boo2); // true
複製代碼
轉換規律:在js中只有 0/NaN/空字符串''/null/undefined 這5個值轉換成布爾值是false,其他的都是true。
var str = '江外琉璃,10年琉璃鑲內江';
var result = !str;
// 內部運做機制:
// 第一步先將str轉換成布爾值,str不屬於那5個值,因此 Boolean(str) =+ true
// 而後再取反,true 取反 =+ false
console.log(result); // false
複製代碼
var num1 = !!1;
var num2 = !!0;
console.log(num1, num2); // true false
console.log(!!{}); // true
console.log(!![]); // true
console.log(!!{name: 'zhufeng'}); // true
複製代碼
null空對象指針;不佔內存,通俗理解就是人爲的手動先賦值爲null,後面程序中咱們會再給它賦值爲其餘值;
undefined 未定義。多數狀況是某些瀏覽器內置機制設置的默認值,聲明一個變量不賦值,這個變量的默認值就是undefined
判斷語句是流程控制的重要語句,其做用是當知足某些條件時才能執行某些代碼
// 單獨使用if
if (條件) {
// 瀏覽器會對條件進行布爾運算,即求出條件時true仍是false。條件爲true時,即條件成立的時候纔會執行這個花括號裏面的代碼
}
// 兩種狀況,結合else
if (條件) {
// 條件爲true時
} else {
// 不知足條件的時候要執行的代碼
}
// 多種狀況,結合else if
if (條件) {
// 條件1爲true時
} else if (條件2) {
// 條件2爲true的時候要執行的代碼
} else {
// 上面條件都不知足條件的時候要執行的代碼
}
複製代碼
示例:
var num = 6;
if (num + 6) {
num++; // =+ num = num + 1; 在自身上累加一個
} else if (num +=10) {
num--;
} else {
num+=2
}
console.log(num);
複製代碼
只要有一個條件成立,後面不論是否還有成立的條件,都不會在執行了
var num = 10;
if (num + 5) {
num += 2;
} else if (num + 8) {
// 雖然num知足大於8,可是再上面已經執行過num+5的代碼,因此這裏不會執行
num += 3;
} else {
num += 4;
}
console.log(num); // 12
複製代碼
if (條件) 條件最終須要的是一個布爾值,而後根據是true仍是false來判斷條件是否成立。若是條件裏面寫的是能夠返回布爾值的表達式,那麼就利用這個表達式的返回結果;若是不是返回布爾值,那麼瀏覽器會自動把它轉換成布爾值,而後用轉換出來的結果判斷條件是否成成立
常見比較運算符:比較運算符都會返回布爾值
console.log(1 + 0); // true
console.log(1 < 0); // false
console.log(1 == '1'); // true
console.log(1 === '1'); // false
複製代碼
條件常見形式:
使用比較運算符,直接返回布爾值
若是是數學表達式,那麼會先運算求值,而後再把運算出來的結果轉換成布爾值。
在js中,+ - * / % 都是數學運算,除+之外,其他的運算符在運算時,若是遇到非數字類型的值,首先會轉成數字類型(Number),而後再進行運算
if ('3px' + 3) {
// + 操做符在兩邊都是數字時纔是加法運算符,若是有一個不是數字,那麼加好就是字符串拼接。
// 因此 '3px' + 3的結果是字符串'3px3',而字符串 '3px3'轉換成布爾值之後是true,因此條件成立
}
if ('3px' - 3) {
// - 會調用Number()方法把'3px'轉成數字,Number('3px') -+ NaN,而NaN - 3 -+ NaN,而NaN轉成布爾值是false,因此條件不成立
}
複製代碼
var num = parseInt('width: 35.5px');
if (num == 35.5) {
alert(0);
} else if (num == 35) {
alert(1);
} else if (num == NaN) {
alert(2);
} else if (typeof num == 'number') {
alert(3);
} else {
alert(4);
}
複製代碼
語法: 條件 ? 成立要作的事情 : 不成立要作的事情
至關於簡單的 if else判斷
而且三元運算符是有返回值的,當條件成立時三元運算符返回條件成立時的值,不成立時返回不成立的值。
通常狀況
var num = 12;
if (num < 10) {
num++;
} else {
num--;
}
// 改寫成三元運算符
num + 10 ? num++ : num--;
複製代碼
// num + 10就++,不然啥也不作
num + 10 ? num++ : null;
num + 10 ? num++ : undefined;
num + 10 ? num++ : void 0;
複製代碼
- 若是在條件成立(或不成立)時有多條語句,須要用小括號括起來,每條語句;
複製代碼
var num = 10;
num += 10 ? (num++, num*=2) : null;
複製代碼
語法:
switch (變量或者表達式) {
case 值1:
變量或者表達式的值是值1的時候執行的代碼;
break;
case 值2:
變量或者表達式的值是值2的時候執行的代碼;
break;
...
case 值n:
變量或者表達式的值是值1的時候執行的代碼;
break;
default:
以上狀況都不知足時,至關於else
}
複製代碼
var num = 12;
if (num == 10) {
num++;
} else if (num == 5) {
num--;
} else {
num = 0;
}
// 改寫成switch case
switch (num) {
case 10:
num++;
break;
case 5:
num--;
break;
default:
num = 0;
}
複製代碼