zoukankan      html  css  js  c++  java
  • 权威指南学习心得之运算符和表达式

    1、数组

    数组直接量中的列表逗号之间的元素可以忽略,这是省略的空位自动填充值undefined,元素列表结尾处可以留下单个逗号,这时并不会创建一个新的值undefined

    2、操作符

    属性访问和函数调用排在最高级

    一元操作符、赋值、三元条件运算符都具有从右到左的结合特性。

    + 加法运算符的转换规则优先考虑字符串连接,如果其中一个操作数是字符串或者转换为字符串的对象,则另外一个操作数也转换为字符串,加法将进行字符串的连接操作。如果两个操作数都不是类字符串,那么将进行算术加法运算

    1、如果其中一个操作数为对象,则对象会遵循对象到原始值的转换规则转换为原始类值:日期对象通过toString()方法进行转换,其他对象则通过valueOf()方法进行转换(如果valueOf能返回一个原始值的话),由于多数对象不具有可用的valueOf方法,因此它们通过toString()方法进行转换。

    2、在进行对象到原始值的转换后,如果其中一个操作数是字符串的话,则另一个操作数也转换为字符串,然后进行字符串连接

    3、否则两个操作数都进行数字转换(或者NaN),然后进行加法操作

    1+2 //3

    "1"+"2" //"12"

    1+"2" //"12"

    1+{} //"1[object object]"

    true+true //2

    2+null //2,null转化为0 

    2+undefined //NaN undefined转化为NaN后相加

    == 相等 可以进行类型转换 对象只能等于对象本身,与其他任何对象不相等

    ===严格相等 不进行类型转换 

    1、如果两个类型不相同,则它们不相等

    2、如果两个值都是null或者都是undefined,则它们不相等

    3、如果两个值都是false或者true,则它们相等

    4、如果一个值为NaN,或者两个值都是NaN,则它们不相等,NaN与其他任何值都不相等,包括它自身,可以通过x!==x来判断NaN,只有x为NaN值,这个表达式的值才为true

    5、如果两个数都是数字且数值相等,则它们相等,如果一个为0,两一个为-0,则它们相等

    6、如果两个值都为字符串,且所含的对应位上的16位数完全相等,则它们相等,如果它们的长度或内容不同,则它们不相等,可以通过String.localeCompare()提供了另外一种比较字符串的方法

    7、如果两个引用值指向同一对象,数组或者函数,则它们是相等的,否则不相等

    三、==的比较

    1、如果两个数的类型相等,则和上面的严格相等的比较规则一样,如果严格相等,则它们相等,如果严格不相等,则它们不相等

    2、如果两个操作数类型不相等

    如果一个是null,另外一个是undefined,则它们相等

    如果一个操作数是数字,另外一个是字符串,先将字符串转换为数字,再进行比较

    如果一直操作数为true,则将其转换为1再比较,如果一个操作数为false,则将其转化为0再比较

    如果一个值为对象,两个一个值为数字或者字符串,则用转换规则将对象转换为原始值,然后再进行比较,javascript内置对象将尝试用valueOf,在尝试用toString,除了日期类,日期类只用toString转换

    "1"==true//true

    比较运算符

    1、如果操作数为对象,则按照转换规则转换为原始值:如果valueOf返回一个原始值,则直接使用这个原始值,否者使用toString的转换结果进行比较

    2、在对象转换为原始值后,如果两个操作数都是字符串,则依照字母表的顺序进行比较

    3,在转换为原始值后,如果至少一个操作数不是字符串,那么两个数都转换为数字进行比较,0与-0是相等的,Infinity比任何数都要大(除了本身),-Infinity比任何数都要小(除了本身),如果一个操作数是NaN,那总是返回false

    +偏爱字符串,如果其中一个操作数是字符串的话,则进行字符串连接操作,而比较运算符偏爱数字,只有两个操作数都是字符串的话,才进行字符串比较

    11<3 //false

    "11"<"3" //true

    "11"<3 //false

    "one"<3 //one转换为NaN,返回false

    in 运算符

    in运算符希望它的左操作数是一个字符串或者可以转换为字符串,希望它的右操作数是一个对象,如果右侧的对象用一个名为左操作数值的属性名,则返回true

    var point={x:1,y:2};
    console.log("x" in point);//true
    console.log("z" in point);//false
    console.log("toString" in point); //true
    
    var data=[7,8,9];
    
    console.log("0" in data); //true
    console.log(1 in data); //true
    console.log(3 in data); //false

    instanceof 运算符

    希望左操作数是对象,右操作数是函数,如果左边是不是对象,则返回false,如果右边不是函数,则抛出错误

    如果左边的对象是右边类的实例,则返回true,否则返回false

    var d=new Date();
    
    console.log(d instanceof Date);//true
    console.log(d instanceof Object);//true
    console.log(d instanceof Number);//false
    
    var a=[1,2,3];
    
    console.log(a instanceof Array);//true
    console.log(a instanceof Object);//true
    console.log(a instanceof RegExp);//false

    所有的对象都是Object的实例,当通过instanceof判断一个对象是否是一个类的实例,这个判断也包含对父类的检测。如果对象的原型链包含右边类,则返回true

    逻辑运算符

    &&

    假值:false null 0 -0 undefined "" NaN,其余的值包括对象都是真值

    运算符首先计算&&左侧的表达式,如果计算结果是假值,那么整个表达式的结果一定也是假值,因此&&这时简单的返回左操作数的值,而并不会对右操作数进行计算。当左操作数是真值时,&&运算符将计算有操作数的值并将其返回作为整个表达式的计算结果

    var o={x:1};
    var p=null;
    console.log(o&&o.x);//1  o是真值,返回o.x
    console.log(p&&p.x);//null p是假值,直接返回,而不去计算p.x

    ||

    首先会计算第一个操作数的值,就是说首先计算左侧的表达式,如果计算结果为真值,那么返回这个真值,否则再计算第二个操作数的值,并返回这个表达式的结果。

    主要用来在一组备选值中选出真值

    var p=p||{};

    首先将操作数转换为布尔值,然后求反,所以它总是返回true或者false,可以通过两次非运算符得到一个值的布尔值:!!x.

    三元运算符

    可以是任意类型;第一操作数当作布尔值,如果是真值,那么将计算第二个操作数,并返回计算结果;否则第一个操作数是假值,那么将计算第三个操作数,并返回计算结果

    typeof 返回操作类型的字符串

    delete运算符

    var o={x:1,y:2};
    delete o.x;

    "x" in o; //false


    var a=[7,8,9];
    delete a[2];//删除数组元素
    console.log(2 in a);//false
    console.log(a.length);//3
    console.log(a[2]);//undefined

    delete 希望他的操作数是一个左值,如果它不是左值,,那么delete将不进行任何操作同时返回true,否则,delete将试图删除这个指定的左值,如果删除成功,delete将返回true,然而并不是所有

    的属性都可以删除,一些内置核心和客户端属性是不能删除的,用户通过var语句声明的变量不能删除,同样,通过function语句定义的函数和函数参数也不能删除

    左值:变量或者对象属性

  • 相关阅读:
    aspx,ascx和ashx使用小结
    修改CKFinder上传路径
    【python】如何在某.py文件中调用其他.py内的函数
    SpringMVC+hibernate4事务处理
    Hibernate执行原生SQL返回List<Map>类型结果集
    fastjson对Date的处理
    fastjson 的简单说明及使用
    字符串作为freemarker模板的简单实现例子
    Hibernate SQL 查询
    Spring整合Hibernate,Druid(Maven)
  • 原文地址:https://www.cnblogs.com/yhf286/p/5036183.html
Copyright © 2011-2022 走看看