object.png
一、 運算符分類
- 一元運算符
注意:先運算再賦值還是先賦值再運算。
var a = -1;
//隱式將條件轉(zhuǎn)為布爾值
var b = a++ ? ++a : a++;
console.log(b); //1
- 二元運算符
- 基本運算符
+= -= *=
涉及隱式數(shù)據(jù)類型轉(zhuǎn)換:
- +運算 針對字符串而言举庶,優(yōu)先拼接字符串
- 非+運算 優(yōu)先轉(zhuǎn)為數(shù)字
- 三目運算符
//當obj對象不存在時,創(chuàng)建新對象。
obj = obj ? obj : {};
if(!obj) obj = {}
obj = obj || {};(較常用)
關(guān)系運算符
var a = 5;
var b = a > 3;
console.log(b); //true
var a ;
console.log(!a); //true a為undefined
//undefined == null;
// 0 == false == "";
console.log(undefined==null); //true
console.log(null==0); //false
//要比較相等性之前琳轿,不能將 null 和 undefined 轉(zhuǎn)換成其他任何值,并且規(guī)定null 和 undefined 是相等的耿芹。null 和 undefined都代表著無效的值崭篡。
console.log(typeof undefined); //undefined
console.log(typeof null); //object
// NaN != NaN;
var a="b";
console.log(Number("a")); //NaN
console.log(Number("a")==NaN); //false
if(a==false){
// 0 false ""
}
if(a===false){
// false
}
if(!a){
// 0 false "" undefined null NaN
}
var a = "a";
a++;
console.log(a); //NaN
var b = "b";
b += 1;
console.log(b); //b1
算術(shù)運算
var a="5a";
var b=3;
var s=a-b;
console.log(s); //NaN
位運算符
- 左移
console.log(2<<2); //8(一般不超過32,否則會溢出)
- 右移
console.log(2>>2); //0
- 位與運算
console.log(5&6); //7 (101&110=>100)
- 位或運算
console.log(5|6); //7 (101|110=>111)
- 異或運算 (相同為0,不同為1 )
console.log(5^6); //3 (101^110=>011)
- 位非運算 (取反再+1)
var a=4;
console.log(~a); //-5
var str="abcdef";
console.log(str.indexOf("d"));
if(~str.indexOf("g")){ //或者 if(str.indexOf("g")>-1){
//當數(shù)組中不存在某項時吧秕,執(zhí)行該操作
}
二琉闪、程序三大結(jié)構(gòu)
1. 順序結(jié)構(gòu)
2. 選擇結(jié)構(gòu)
-
分支語句if-else
非布爾類型的條件判斷 :
true=>1 false=>0
if(5 == true){ //console.log("此時這里不執(zhí)行。"); } if(1 == true){ console.log("這里執(zhí)行了砸彬。"); }
if("abc") string類型 -------> 所有的非空字符串都代表 true颠毙, "" 代表false
if(obj) object類型 -------->所有的非null的對象都代表true,null代表false
if(undefined) -------> 代表false砂碉,
if(NaN) --------> 代表false
if( function ) ---------> 如果函數(shù)存在蛀蜜,代表true
-
switch
var num = 3; switch(num) { default : alert("不知道!"); break; //這里也需要break case 1 : alert("星期一"); break; case 2 : alert("星期二"); break; }
//通過switch判斷是否全等 var grade = "100"; switch(true){ case grade === 100: console.log("A");break; case grade > 90: console.log("B");break; //B default:console.log("C");break; }
3.循環(huán)結(jié)構(gòu)
while循環(huán)
do-while循環(huán)
for循環(huán)
-
跳出循環(huán)
-
continue
通常在使用continue時增蹭,在它之前使變量自增滴某。
var i = 1, s = 1; while(i < 10){ if(i % 5 === 0) continue; s *= i; i++; //死循環(huán) }
-
break
可以跳出到指定位置
// break只會終止當前循環(huán),距離它最近的循環(huán) x1: for (var i = 0; i < 3; i++) { for (var k = 0; k < 3; k++) { console.log(i, k); if (k === 1 && i === 1) { break x1; } } } 輸出結(jié)果: 0 0 0 1 0 2 1 0 1 1
-
三滋迈、 對象
變量:儲存數(shù)據(jù)的位置霎奢,key可以是自定義的任意值(無序列表)
對象:儲存數(shù)據(jù)的結(jié)構(gòu)
var arr = [];
arr._proto_ = Object //此時數(shù)組的原產(chǎn)地已經(jīng)變成Object
obj.a = 10 <=>obj["a"] = 10;
obj.a不能使用變量代替屬性;obj["a"]可以使用變量代替屬性饼灿。
//需要使用變量來作為屬性名時,使用[]將變量放入
var s = "h";
var obj = {
a:1,
b:2,
c:"s1",
[s]:3
};
console.log(obj.h); //3
設(shè)置對象屬性值時椰憋,默認將屬性名隱式轉(zhuǎn)換成字符串。
var s = 1;
obj[s] = 10; //此時的s為字符串"1"
console.log(obj);
數(shù)組會隱式轉(zhuǎn)換為字符串
var obj = {};
var arr = [1,2,3];
var arr1 = [];
obj[arr] = 10;
console.log(obj, obj[arr1]) //{1,2,3: 10} undefined
//查找obj[arr1]時赔退,實際查找的是obj[],所以是undefined
var obj = {};
var o = {a:1};
var o1 = {a:2};
obj[o] = 10; //此時的o橙依,會默認轉(zhuǎn)換為[object Object]
console.log(obj[o1]); //此時的o1,也會隱式轉(zhuǎn)換為[object Object]硕旗,所以結(jié)果為:10
對象隱式轉(zhuǎn)為布爾值
console.log({} == {}); //false
console.log({} == 0); //false
console.log([] == []); //false 兩遍類型相等窗骑,不進行轉(zhuǎn)化,比較的是地址
console.log([] == true); //false ""=>flase和true比較
console.log(![] == false); //true; 先轉(zhuǎn)布爾漆枚,[]為true,取反為false,
console.log([] == false); //true; 先轉(zhuǎn)字符串创译,再轉(zhuǎn)為0,和0比較
遍歷對象時墙基,只有可枚舉屬性是可以遍歷的
__proto__
是不可枚舉屬性软族。
判斷一個值刷喜,是否在對象中存在
//對象是以鍵值對存儲,因此查找速度最快立砸,且必須使用鍵來查找值
console.log("d" in obj);
刪除屬性和值
var obj={a:1, b:2, c:3, d:undefined, e:{x:1}};
obj.e = null; //刪除對象之前掖疮,必須要設(shè)置為null,否則內(nèi)存無法回收
delete obj.e;
console.log(obj);
- 將對象變?yōu)樽址?/li>
var obj = {a:1, b:2, c:3, d:undefined};
//轉(zhuǎn)換為 a=1&b=2&c=3&d=undefined;
var str = "";
var len = 0,l;
for(var s in obj){
len++;
}
for(var prop in obj){
l++;
str += prop + "=" + obj[prop];
if(l < len)
str += "&";
}
console.log(str);
//轉(zhuǎn)換為 {a:1,b:2,c:3,d:undefined}
var str = "{";
for(var prop in obj){
str += prop + ":" + obj[prop] + ",";
}
str = str.slice(0, -1);
str += "}";
console.log(str);
利用JSON字符串
var obj={a:1,b:2,c:3,d:undefined};
var str = JSON.stringify(obj);
console.log(str);
- 字符串 => 對象
var str = '{"a":1, "b":2, "c":3}';
var obj1 = JSON.parse(str);
console.log(obj1);
- 一行代碼實現(xiàn)克隆對象(缺點:不能復制undefined)
var obj = {a:1, b:2, c:3, d:undefined, e:{}};
var obj1 = JSON.parse(JSON.stringify(obj));
console.log(obj1);//{a: 1,b: 2,c: 3,e: {}}
- ES6淺復制
var o = {a:1, b:2, c:3};
var o1 = {c:5, d:10, e:20};
var obj = {};
Object.assign(obj, o, o1);
//或 var obj = Object.assign({},o,o1);
console.log(obj);
- Object.assign應(yīng)用
var div = document.getElementById("box");
Object.assign(div.style,{
width:"50px",
height:"50px",
backgroundColor:"red"
});