02-JS运算符和对象

object.png

一、 运算符分类

  1. 一元运算符

注意:先运算再赋值还是先赋值再运算。

var a = -1;
//隐式将条件转为布尔值
var b = a++ ? ++a : a++;
console.log(b);     //1
  1. 二元运算符
  • 基本运算符+= -= *=

涉及隐式数据类型转换:

  1. +运算 针对字符串而言,优先拼接字符串
  2. 非+运算 优先转为数字
  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"
});
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容