JavaScript 三目运算符
三目运算符
形式:判断语句? 若为真,执行,并返回结果:若为假,执行,并返回结果
三目运算符其实就是简化版的if(){…}else{}语句
三目运算符是节约我们操作的
// 形式: 条件判断? 是 : 否 并且会返回值 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.
