Go to comments

JavaScript 三目运算符

三目运算符


三目运算符是节约我们操作的

// 形式: 条件判断? 是 : 否 并且会返回值

var num = 1 > 0 ? 2 + 2 : 1 + 1; // 如果1大于0吗?,是的话返回2+2并把结果返回,不是返回1+1并把结果返回

console.log(num); // 4

三目就是条件判定,简化版的if并且比if高端,它不仅能判定,还能把这个值返回,相等于else if里面加return


写一个复杂点的三目

var num = 1 > 0 ? ("10" > 9 ? 1 : 0) : 2; // 先算括号里的

console.log(num); // 1

字符串"10"大于数字9,字符串和数字比,会先转化成数字


字符串和数字比会先转化成数字,换一个,字符串和字符串比

var num = 1 > 0 ? ("10" > "9" ? 1 : 0) : 2;

console.log(num); // 0


/***
先算括号里的,
括号里又是一个三目,三目返回的结果,
括号里"10" > "9"吗?字符串"10"不大于字符串"9",字符串比的是诸位的ACSII码。
"10"这叫两位字符串,字符串叫"一零"不叫"十","9"这叫单位的字符串。
字符串比的是每一位的ASCII码,首先第一位"1"的ASC码就没有"9"的ACSII码大。所以字符串里面"10"是绝对不大于"9"的,在字符串里面"10"是小于"9"的。
("10" > "9" ? 1 : 0)返回0,最后最后"1 > 0"返回0
***/


接下来用三目运算符,简化一下深度拷贝

function deepClone(origin, target){
    var target = target || {},
        toStr = Object.prototype.toString,
        arrStr = "[object Array]";

    for(var prop in origin){
        if(origin.hasOwnProperty(prop)){
            if(typeof origin[prop] !== "null" && typeof origin[prop] == 'object'){

                // 1).这里简化,最后target[prop]要拿结果。
                // if(toStr.call(origin[prop]) == arrStr){
                //     target[prop] = [];
                // }else{
                //     target[prop] = {};
                // }
                
                // 2). "toStr.call(origin[prop]) == arrStr"放到问号前面,不用加括号直接问号。
                // PS: 为了避免运输符优先级发生混乱,一般长的、没自信的加一个括号
                
                target[prop] = toStr.call(origin[prop]) == arrStr ? [] : {};

                deepClone(origin[prop], target[prop]);

            }else{
                target[prop] = origin[prop];
            }
        }
    }

    return target;
}

var obj = {
    name : 'abc',
    age : 123,
    card : ['vise', 'master'],
    wife : {
        name : "bcd",
        son : {
            name : "aaa"
        }
    }
}

var objCopy = deepClone(obj);

console.log(objCopy); // {name: "abc", age: 123, card: Array(2), wife: {…}}
console.log(obj);  // {name: "abc", age: 123, card: Array(2), wife: {…}}

obj.card.push('abc');   // obj.card有两个值,再push一个abc进去

console.log(objCopy.card); // objCopy.card还是两个["vise", "master"]
console.log(obj.card); //  ["vise", "master", "abc"]



Leave a comment 0 Comments.

Leave a Reply

换一张