美文网首页
js运算符

js运算符

作者: 青春前行 | 来源:发表于2017-08-29 22:29 被阅读0次

    1、return语句:
    在js里面的return语句用来返回控制和函数结果。通常情况,return语句对于一个函数是很有必要的,因为往往需要函数在一系列的代码执行后会得到一个期望的返回值,而此值就是通过return语句返回,并且将控制权返回给主调函数。
    eg:
    function add(){
    var a=1;
    var b=2;
    return a+b;
    }
    function func(){
    console.log(add())
    }
    func();
    add()函数的返回语句通过console.log(add())返回。如果不打印出来,则看不到效果,只是把那个数字返回了,却看不到效果。
    另外:事件处理函数返回false可以组织默认事件的发生。(***重要)
    2、==和===的区别
    比较运算符:http://javascript.ruanyifeng.com/grammar/operator.html#toc6
    == 相等
    === 严格相等
    != 不相等
    !== 严格不相等
    < 小于
    <= 小于或等于

    大于
    = 大于或等于
    如果两个运算子都是字符串,则按照字典顺序比较(实际上是比较 Unicode 码点)。
    否则,将两个运算子都转成数值,再进行比较(等同于先调用Number函数)
    字符串的比较:
    按照字典的顺序来比较【Unicode】。
    非字符串的比较:
    (1)原始类型的值
    两个原始类型的值的比较,除了相等运算符(==)和严格相等运算符(===),其他比较运算符都是先转成数值再比较。
    5 > '4' // true
    // 等同于 5 > Number('4')
    // 即 5 > 4

    true > false // true
    // 等同于 Number(true) > Number(false)
    // 即 1 > 0

    2 > true // true
    // 等同于 2 > Number(true)
    // 即 2 > 1

    这里有一个特殊情况,即任何值(包括NaN本身)与NaN比较,返回的都是false。
    1 > NaN // false
    1 <= NaN // false
    '1' > NaN // false
    '1' <= NaN // false
    NaN > NaN // false
    NaN <= NaN // false
    返回的都是false。当然还有一个(NaN==NaN)以及(NaN===NaN)返回的也都是false。
    (2)对象
    如果运算子是对象,会转为原始类型的值,再进行比较。
    对象转换成原始类型的值,算法是先调用valueOf方法;如果返回的还是对象,再接着调用toString方法,详细解释参见《数据类型的转换》一节。
    var x = [2];
    x > '11' // true
    // 等同于 [2].valueOf().toString() > '11'
    // 即 '2' > '11'

    x.valueOf = function () { return '1' };
    x > '11' // false
    // 等同于 [2].valueOf() > '11'
    // 即 '1' > '11'
    这里理解是:x是一个数组对象,先调用valueOf方法,(这里一般肯定是对象调用valueOf方法肯定返回的是对象【可以用typeof([2].valueOf())】),然后再调用toString()方法。这里的toString()实质是将字符转换成了Unicode码。再比较得出结果。[这些调用都是自身内部进行的,但是我们要知道这些]。
    eg:
    [2] > [1] // true
    // 等同于 [2].valueOf().toString() > [1].valueOf().toString()
    // 即 '2' > '1'

    [2] > [11] // true
    // 等同于 [2].valueOf().toString() > [11].valueOf().toString()
    // 即 '2' > '11'

    现在再讲到相等运算符了:
    JavaScript 提供两种相等运算符:==和===。

    简单说,它们的区别是相等运算符(==)比较两个值是否相等,严格相等运算符(===)比较它们是否为“同一个值”。如果两个值不是同一类型,严格相等运算符(===)直接返回false,而相等运算符(==)会将它们转化成同一个类型,再用严格相等运算符进行比较。
    (1)不同类型:
    如果两个值的类型不同,直接返回false。
    1 === "1" // false
    true === "true" // false
    (2)同一类的原始类型值
    同一类型的原始类型的值(数值、字符串、布尔值)比较时,值相同就返回true,值不同就返回false。
    1 === 0x1 // true
    上面代码比较十进制的1与十六进制的1,因为类型和值都相同,返回true。[都是数值,并且都是1]
    需要注意的是,NaN与任何值都不相等(包括自身)。另外,正0等于负0。
    NaN === NaN // false
    +0 === -0 // true
    (3)同一类的复合类型值
    两个复合类型(对象、数组、函数)的数据比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个对象。

    {} === {} // false
    [] === [] // false
    (function (){} === function (){}) // false
    上面代码分别比较两个空对象、两个空数组、两个空函数,结果都是不相等。原因是对于复合类型的值,严格相等运算比较的是,它们是否引用同一个内存地址,而运算符两边的空对象、空数组、空函数的值,都存放在不同的内存地址,结果当然是false。
    如果两个变量引用同一个对象,则它们相等。
    var v1 = {};
    var v2 = v1;
    v1 === v2 // true,都是指向同一个对象
    注意,对于两个对象的比较,严格相等运算符比较的是地址,而大于或小于运算符比较的是值。
    new Date() > new Date() // false
    new Date() < new Date() // false
    new Date() === new Date() // false
    上面的三个表达式,前两个比较的是值,最后一个比较的是地址,所以都返回false。
    (4)undefined 和 null
    undefined和null与自身严格相等。
    undefined === undefined // true
    null === null // true
    由于变量声明后默认值是undefined,因此两个只声明未赋值的变量是相等的。
    var v1;
    var v2;
    v1 === v2 // true
    相等运算符(==):
    比较不同类型的数据时,相等运算符会先将数据进行类型转换,然后再用严格相等运算符比较。类型转换规则如下。
    (1)原始类型的值

    原始类型的数据会转换成数值类型再进行比较。

    1 == true // true
    // 等同于 1 === 1

    0 == false // true
    // 等同于 0 === 0

    2 == true // false
    // 等同于 2 === 1

    2 == false // false
    // 等同于 2 === 0

    'true' == true // false
    // 等同于 Number('true') === Number(true)
    // 等同于 NaN === 1

    '' == 0 // true
    // 等同于 Number('') === 0
    // 等同于 0 === 0

    '' == false // true
    // 等同于 Number('') === Number(false)
    // 等同于 0 === 0

    '1' == true // true
    // 等同于 Number('1') === Number(true)
    // 等同于 1 === 1

    '\n 123 \t' == 123 // true
    // 因为字符串转为数字时,省略前置和后置的空格
    (2)对象与原始类型值比较

    对象(这里指广义的对象,包括数组和函数)与原始类型的值比较时,对象转化成原始类型的值,再进行比较。

    [1] == 1 // true
    // 等同于 Number([1]) == 1

    [1] == '1' // true
    // 等同于 String([1]) == Number('1')

    [1] == true // true
    // 等同于 Number([1]) == Number(true)
    上面代码中,数组[1]分别与数值、字符串和布尔值进行比较,会先转成字符串或数值,再进行比较。比如,与数值1比较时,数组[1]会被自动转换成数值1,因此得到true。具体的对象类型转换规则,参见《数据类型转换》章节。

    (3)undefined和null

    undefined和null与其他类型的值比较时,结果都为false,它们互相比较时结果为true。

    false == null // false
    false == undefined // false

    0 == null // false
    0 == undefined // false

    undefined == null // true
    绝大多数情况下,对象与undefined和null比较,都返回false。只有在对象转为原始值得到undefined时,才会返回true,这种情况是非常罕见的。

    (4)相等运算符的缺点

    相等运算符隐藏的类型转换,会带来一些违反直觉的结果。

    '' == '0' // false
    0 == '' // true
    0 == '0' // true

    2 == true // false
    2 == false // false

    false == 'false' // false
    false == '0' // true

    false == undefined // false
    false == null // false
    null == undefined // true

    ' \t\r\n ' == 0 // true
    上面这些表达式都很容易出错,因此不要使用相等运算符(==),最好只使用严格相等运算符(===)。

    相关文章

      网友评论

          本文标题:js运算符

          本文链接:https://www.haomeiwen.com/subject/xxsadxtx.html