美文网首页
52.4-运算符三目运算符逗号表达式生成器

52.4-运算符三目运算符逗号表达式生成器

作者: BeautifulSoulpy | 来源:发表于2020-05-15 11:25 被阅读0次

    岁月一半是生活的温暖,一半是世态的薄凉;人生一半是心底的笑容,一半是旅程的艰辛!


    总结:

    1. ++(先加后用、先用后加),自增在C、JAVA、 Python 中的效率问题;
    2. 如果不知道类型是否一致,但是就是要求一定相等,那么使用 === 和 !==;
    3. 函数里面应该用 var 或 let 定义;不能直接定义
    4. 逗号运算符的 优先级 是最低的;
    5. instanceof 要求必须明确使用类型定义变量,就是对象必须是new关键字声明创建的。它可以用于继承关系的判断。

    1. 运算符

    双目运算符 优先级高于 单目运算符;

    算术运算符

    + - * / % 等运算符和Python一样

    console.log(1/2) // 0.5自然除
    console.log(1/0) // 无异常,返回无穷
    console.log(5 % 3)
    console.log(parseInt(1/2)) // 0
    console.log(parseInt(3/2)) // 1
    console.log(Math.floor(3/2)) // 1
    console.log(Math.ceil(3/2)) // 2
    console.log(Math.round(3/2)) // 2
    console.log(Math.round(1/2)) // 1
    

    ++ 和 --
    单目运算符,代表变量自增、自减
    i++ 先用i,用完之后i再自增加1(先用后加)
    ++i i先自增,再使用i(先加后用)

    let i = 0
    let a = i++  
    console.log(a, i)     // 0 1
    console.log(a, i++)   // 0  1
    a = ++i    // a=3
    console.log(a, ++i)  // 3  4
    

    挑战题

    i = 0;
    let a = ++i+i+++i+++i;
    console.log(a); // 答案是几?
    
    比较运算符

    注意: 隐式类型转换
    >、<、>=、<= 没有什么区别
    !=、==
    !==、===(恒等,推荐使用)
    == 宽松相等,进行类型转换,
    === 严格相等,不进行类型转换

    console.log(100 > '200') // false
    console.log(300 > '200') // true
    console.log(300 > '2000') // false
    console.log(3000 > '2a') // false
    console.log('3000' > '2000') // true
    // 宽松比较
    console.log(300 == '300') // true
    console.log('200' == '200') // true
    // 严格比较 ===
    console.log(300 === '300') // false
    console.log('200' === '200') // true
    

    从上面的比较中,我们起先以为前几行是隐式转换为字符串的,但是后来发现转换为数字,当3000>'2a'比较是犯难了;

    使用宽松比较的时候,尽可能确保比较的类型相同,否则会引起隐式类型转换,而且隐式转换的规则很复杂不好把控,
    如果不知道类型是否一致,但是就是要求一定相等,那么使用 === 和 !==;
    建议比较的时候,一律使用 === 和 !==;

    逻辑运算符

    &&、||、! 与、或、非
    这些运算符和其他高级语言都一样,支持短路;

    位运算

    & | ^ ~ << >> 位与、位或、异或、取反、左移、右移,和Python一样

    三元运算符
    条件表达式?真值:假值
    等价于简单的if...else结构
    if (条件表达式) {
    真值
    }
    else {
    假值
    }
    console.log(('3' > 30)?'真':'假')
    
    逗号表达式

    逗号(最低)的优先级 低于 = ;逗号表达式的 值 等于最后一次计算的值;

    a = 100
    b = 200
    x = a, b, a>b ? a+b : b++
    console.log(x,b)  // 100 201
    
    function add(){
        return a+b, b;    // 最后一次计算的值;
    
    }
    
    console.log(add())  // 201
    
    其他
    名称 说明
    instanceof 判断是否属于指定类型,对象必须是new关键字声明创建的
    typeof 返回类型字符串
    delete delete 操作符,删除一个对象(an object)或一个对象的属性(an object's property)或者一个数组中的某一个键值,let、 var 定义的属性不能随便删除,隐式声明可以删除;
    in 如果指定的属性在对象内,则返回true,索引(数字)是它的属性
    console.log('a' instanceof String)  // false
    console.log(1 instance Number) // false
    a = new String('b')
    console.log(a instanceof String) // true
    console.log(new Number(1) instanceof Number) // true
    console.log(a instanceof Object) // true
    console.log(typeof('a')) //string
    console.log(typeof 'a') //string
    console.log(typeof a) //object
    

    instanceof 要求必须明确使用类型定义变量,就是对象必须是new关键字声明创建的。它可以用于继承关系的判断。
    typeof 就是返回对象的类型字符串; 如果是 new String,就是object;
    delete 删除对象、属性、数组元素;let、 var 定义的属性不能随便删除,隐式声明可以删除;

    x = 42;
    var y = 43;
    let z = 60;
    myobj = new Number();
    myobj.h = 4;             // create property h
    console.log(delete x);   // returns true (can delete if declared implicitly)
    console.log(delete y);   // returns false (cannot delete if declared with var)
    console.log(delete z);   // returns false
    console.log(delete Math.PI); // returns false (cannot delete predefined properties)
    console.log(delete myobj.h); // returns true (can delete user-defined properties)
    console.log(delete myobj);   // returns true (can delete if declared implicitly)
    console.log('~~~~~~~~~~~~~~~~~~~~')
    var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
    for (var i = 0; i < trees.length; i++)
        console.log(trees[i])
    console.log('==================')
    delete trees[3]; // 数组中元素被删除,但空着的位置是undefined
    for (var i = 0; i < trees.length; i++)
        console.log(trees[i])
    

    in 判断属性是否在对象内
    注意:索引(数字)是它的属性

    let trees = new Array("redwood", "bay", "cedar", "oak", "maple");
    console.log(0 in trees);     // true ,索引0
    console.log(3 in trees);     // true ,索引3
    console.log(6 in trees);     // false ,索引6
    console.log("bay" in trees);    // returns false ,bay 是值 ,不是属性;
    console.log("length" in trees); // returns true ,0在数组对象的index中
    
    delete trees[3];
    console.log(3 in trees);    // false
    
    ### 判断属性
    // Custom objects
    let mycar = {
        color: "red",
        year: 1998
    };
    console.log("color" in mycar); // returns true
    console.log("model" in mycar); // returns false
    console.log('year' in mycar) // true
    

    运算符优先级

    • 一元运算符里面的逻辑非优先级很高
    • 逻辑与比逻辑或优先级高

    逗号预算法优先级最低,比赋值语句还低。
    记不住,就使用括号。

    2. 表达式

    基本表达式,和Python差不多
    解析式也和Python的相似,但在ES6中非标准不推荐使用
    生成器推荐使用生成器函数,ES6开始支持

    
    function* inc() {
        let i = 0;
        let j = 7;
        while (true) {
            yield i++;
            if (!j--) return 100;
        }
    }
    let gen = inc()
    for (let i = 0; i < 10; i++)
        console.log(gen.next());
    #--------------------------------------------------
    { value: 0, done: false }
    { value: 1, done: false }
    { value: 2, done: false }
    { value: 3, done: false }
    { value: 4, done: false }
    { value: 5, done: false }
    { value: 6, done: false }
    { value: 7, done: false }
    { value: 100, done: true }
    { value: undefined, done: true }
    

    相关文章

      网友评论

          本文标题:52.4-运算符三目运算符逗号表达式生成器

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