一、 运算符分类
- 一元运算符
注意:先运算再赋值还是先赋值再运算。
var a = -1;
//隐式将条件转为布尔值
var b = a++ ? ++a : a++;
console.log(b); //1
- 二元运算符
- 基本运算符
+= -= *=
涉及隐式数据类型转换:
- +运算 针对字符串而言,优先拼接字符串
- 非+运算 优先转为数字
- 三目运算符
//当obj对象不存在时,创建新对象。
obj = obj ? obj : {};
if(!obj) obj = {}
obj = obj || {};(较常用)
关系运算符
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 转换成其他任何值,并且规定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
算术运算
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){
//当数组中不存在某项时,执行该操作
}
二、程序三大结构
1. 顺序结构
2. 选择结构
-
分支语句if-else
非布尔类型的条件判断 :
true=>1 false=>0
if(5 == true){ //console.log("此时这里不执行。"); } if(1 == true){ console.log("这里执行了。"); }
if("abc") string类型 -------> 所有的非空字符串都代表 true, "" 代表false
if(obj) object类型 -------->所有的非null的对象都代表true,null代表false
if(undefined) -------> 代表false,
if(NaN) --------> 代表false
if( function ) ---------> 如果函数存在,代表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.循环结构
while循环
do-while循环
for循环
-
跳出循环
-
continue
通常在使用continue时,在它之前使变量自增。
var i = 1, s = 1; while(i < 10){ if(i % 5 === 0) continue; s *= i; i++; //死循环 }
-
break
可以跳出到指定位置
// break只会终止当前循环,距离它最近的循环 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; } } } 输出结果: 0 0 0 1 0 2 1 0 1 1
-
三、 对象
变量:储存数据的位置,key可以是自定义的任意值(无序列表)
对象:储存数据的结构
var arr = [];
arr._proto_ = Object //此时数组的原产地已经变成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
设置对象属性值时,默认将属性名隐式转换成字符串。
var s = 1;
obj[s] = 10; //此时的s为字符串"1"
console.log(obj);
数组会隐式转换为字符串
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,会默认转换为[object Object]
console.log(obj[o1]); //此时的o1,也会隐式转换为[object Object],所以结果为:10
对象隐式转为布尔值
console.log({} == {}); //false
console.log({} == 0); //false
console.log([] == []); //false 两遍类型相等,不进行转化,比较的是地址
console.log([] == true); //false ""=>flase和true比较
console.log(![] == false); //true; 先转布尔,[]为true,取反为false,
console.log([] == false); //true; 先转字符串,再转为0,和0比较
遍历对象时,只有可枚举属性是可以遍历的
__proto__
是不可枚举属性。
判断一个值,是否在对象中存在
//对象是以键值对存储,因此查找速度最快,且必须使用键来查找值
console.log("d" in obj);
删除属性和值
var obj={a:1, b:2, c:3, d:undefined, e:{x:1}};
obj.e = null; //删除对象之前,必须要设置为null,否则内存无法回收
delete obj.e;
console.log(obj);
- 将对象变为字符串
var obj = {a:1, b:2, c:3, d:undefined};
//转换为 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);
//转换为 {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);
- 一行代码实现克隆对象(缺点:不能复制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应用
var div = document.getElementById("box");
Object.assign(div.style,{
width:"50px",
height:"50px",
backgroundColor:"red"
});