1. 条件运算符(三目,三元)

condition ? exprIfTrue : exprIfFalse
条件(三元)运算符是 JavaScript 仅有的使用三个操作数的运算符。一个条件后面会跟一个问号(?),如果条件为 truthy ,则问号后面的表达式A将会执行;表达式A后面跟着一个冒号(:),如果条件为 falsy ,则冒号后面的表达式B将会执行。本运算符经常作为 if 语句的简捷形式来使用。

  1. var a = 5;
  2. if(a > 0) {
  3. console.log('大于0');
  4. } else {
  5. console.log('小于等于0');
  6. }
  7. a > 0 ? '大于0' : '小于等于0';
  8. //----------------------------------------------------------------------------------
  9. var a = 5,
  10. str = '';
  11. if(a > 0){
  12. if(a > 3){
  13. str = '大于3';
  14. }else{
  15. str = '小于等于3';
  16. }
  17. }else{
  18. str = '小于等于0';
  19. }
  20. a > 0 ? a > 3 ? str = '大于3'
  21. : str = '小于等于3'
  22. : str = '小于等于0';
  23. console.log(str);
  1. var str = 89 > 9 ? (
  2. '89' > '9' ? '通过了'
  3. : '内层未通过'
  4. )
  5. : '外层未通过';
  6. // 1.三元运算符
  7. // 2. 多个字符的字符串进行比较,比较Ascii,
  8. console.log(str); // '内层未通过'

2. 拷贝

  1. Object.prototype.num = 1;
  2. var person1 = {
  3. name: '张三',
  4. age: 18,
  5. sex: 'male',
  6. height: 180,
  7. weight: 140,
  8. children: {
  9. first: {
  10. name:'张小二',
  11. age: 18
  12. },
  13. second: {
  14. name: '张小三',
  15. age: 16
  16. },
  17. third: {
  18. name: '张小四',
  19. age: 10
  20. },
  21. },
  22. car: ['Benz', 'Mazda']
  23. }
  24. // 这样拷贝,改变person2,person1也会被改变
  25. var person2 = person1;
  26. person2.name = '李四';
  27. console.log(person1, person2);

1. 浅拷贝

  1. // 浅拷贝
  2. Object.prototype.num = 1;
  3. var person1 = {
  4. name: '张三',
  5. age: 18,
  6. sex: 'male',
  7. height: 180,
  8. weight: 140,
  9. children: {
  10. first: {
  11. name:'张小二',
  12. age: 18
  13. },
  14. second: {
  15. name: '张小三',
  16. age: 16
  17. },
  18. third: {
  19. name: '张小四',
  20. age: 10
  21. },
  22. },
  23. car: ['Benz', 'Mazda']
  24. }
  25. var person2 = {};
  26. for(var key in person1){
  27. person2[key] = person1[key];
  28. }
  29. person2.name = '李四';
  30. person2.car.push('Audi');
  31. console.log(person1, person2);
  32. // 浅拷贝的封装
  33. function clone(origin, target){
  34. var target = target || {};
  35. for(var key in origin){
  36. // target[key] = origin[key];
  37. if(origin.hasOwnProperty(key)){
  38. // hasOwnProperty判断属于origin自己本身的对象才进行浅拷贝
  39. target[key] = origin[key];
  40. }
  41. }
  42. return target
  43. }

image.png
2. 深拷贝

  1. // 深拷贝
  2. function deepClone(origin, target){
  3. var target = target || {},
  4. toStr = Object.prototype.toString,
  5. arrType = '[object Array]';
  6. for(var key in origin){
  7. // 1.判断该项是不是 origin本身的属性
  8. if(origin.hasOwnProperty(key)){
  9. // 2.判断该项是不是对象
  10. if(typeof(origin[key]) === 'object'){
  11. // 3. 进一步判断该项为数组还是对象
  12. if(toStr.call(origin[key]) === arrType){
  13. target[key] = [];
  14. }else{
  15. target[key] = {}
  16. }
  17. target[key] = deepClone(origin[key], target[key]);
  18. }else{
  19. target[key] = origin[key];
  20. }
  21. }
  22. }
  23. return target
  24. }
  25. var person2 = deepClone(person1);
  26. person2.car.push('Audi');
  27. person2.children.forth = {
  28. name: '张小五',
  29. age: 8
  30. }
  31. console.log(person1, person2);
  1. function deepClone(obj = {}, map = new Map()) {
  2. if (typeof obj !== "object") {
  3. return obj;
  4. }
  5. if (map.get(obj)) {
  6. return map.get(obj);
  7. }
  8. let result = {};
  9. // 初始化返回结果
  10. if (
  11. obj instanceof Array ||
  12. // 加 || 的原因是为了防止 Array 的 prototype 被重写,Array.isArray 也是如此
  13. Object.prototype.toString(obj) === "[object Array]"
  14. ) {
  15. result = [];
  16. }
  17. // 防止循环引用
  18. map.set(obj, result);
  19. for (const key in obj) {
  20. // 保证 key 不是原型属性
  21. if (obj.hasOwnProperty(key)) {
  22. // 递归调用
  23. result[key] = deepClone(obj[key], map);
  24. }
  25. }
  26. // 返回结果
  27. return result;
  28. }

3.JSON克隆

  1. // JSON克隆
  2. var str = JSON.stringify(person1);
  3. // console.log(str);
  4. var person2 = JSON.parse(str);
  5. console.log(person2);
  6. person2.car.push('Audi');
  7. person2.children.forth = {
  8. name: '张小五',
  9. age: 8
  10. }
  11. console.log(person1, person2);

3. 练习

  1. function Foo(){
  2. getName = function(){
  3. console.log(1);
  4. }
  5. return this;
  6. }
  7. Foo.getName = function(){
  8. console.log(2);
  9. }
  10. Foo.prototype.getName = function(){
  11. console.log(3);
  12. }
  13. var getName = function(){
  14. console.log(4);
  15. }
  16. function getName(){
  17. console.log(5);
  18. }
  19. Foo.getName(); // 2
  20. getName(); // 4
  21. Foo().getName(); // 1
  22. getName();// 1
  23. // .运算符优先级 高于 new 运算符
  24. new Foo.getName(); // 2
  25. // 先执行new Foo() 返回的this中没有getName, 原型上寻找
  26. new Foo().getName();// 3
  27. new new Foo().getName();// 3
  1. // 2. 请用wp接收用户输入的年份,判断是否是闰年? (请用三目运算来做)
  2. // 1. 整除4 并且 不能整除100 2. 整除400
  3. var year = window.prompt('请您输入您要确认的年份');
  4. function isLeapYear(year){
  5. ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0)
  6. ? console.log('是闰年')
  7. : console.log('不是闰年');
  8. }
  9. isLeapYear(year);

运算符优先级