每日思考(2019/12/16)

题目概览

  • 浏览器内多个标签页之间的通信方式有哪些
  • 简述下你理解的优雅降级和渐进增强
  • 写一个判断数据类型的方法

题目解答

浏览器内多个标签页之间的通信方式有哪些

简述下你理解的优雅降级和渐进增强

  • 渐进增强(Progressive Enhancement):一开始就针对低版本浏览器进行构建页面,完成基本的功能,然后再针对高级浏览器进行效果、交互、追加功能达到更好的体验;渐进增强的写法,优先考虑老版本浏览器的可用性,最后才考虑新版本的可用性。而在现在前缀CSS3和正常CSS3都可用的情况下,正常CSS3会覆盖前缀CSS3
  • 优雅降级(Graceful Degradation):一开始就构建站点的完整功能,然后再针对低版本浏览器进行兼容。比如一开始使用 CSS3 的特性构建了一个应用,然后逐步针对各大浏览器进行 hack 使其可以在低版本浏览器上正常浏览;优雅降级的写法,优先考虑新版本浏览器的可用性,最后才考虑老版本的可用性。而在现在前缀CSS3和正常CSS3都可用的情况下,前缀CSS3会覆盖正常的CSS3
  • 如何选择:若低版本用户居多,则优先采用渐进增强的开发流程;若高版本用户居多,则为了提高大多数用户的使用体验,那当然优先采用优雅降级的开发流程;业务优先,提升用户体验永远不会排在最前面;最重要的还是保证尽可能多的用户可以正常访问网站,在此之后再考虑降级的极端情形和现代浏览器的体验增强

写一个判断数据类型的方法

  • 简易写法

    function type(obj) {
        return Object.prototype.toString.call(obj).replace(/\[object\s|\]/g, '');
    }
  • 精细封装
    /*支持
    number, boolean, string, undefined, null, symbol
    array, object, set, weakset, map, weakmap
    function, class
    regexp, date, math, promise
    */
    const _toString = Object.prototype.toString
    const NULL = 'null'
    const OBJECT = 'object'
    const NUMBER = 'number'
    const BOOLEAN = 'boolean'
    const STRING = 'string'
    const UNKNOW = 'unknow'
    
    /**
     *
     * @param {*} element 任意类型的变量
     * @param {Boolean} strict [default: false] 是否为严格模式
     * @return {String} 变量的真实类型
     */
    export default function type (element, strict = false) {
      strict = !!strict
    
      // #1 fix typeof null === 'object'
      if (element === null) {
        return NULL
      }
    
      const eleType = typeof element
    
      // #2 return [number string boolean undefined symbol]
      if (eleType !== OBJECT) {
        return eleType
      }
    
      let eleRealType
      let eleRealTypeLower
    
      try {
        eleRealType = _toString.call(element).slice(8, -1)
        eleRealTypeLower = eleRealType.toLowerCase()
      } catch (e) {
        // #3 IE activie 对象
        return OBJECT
      }
    
      // #4 fix typeof new String('') === 'object' , expect 'string'
      if (eleRealTypeLower !== OBJECT) {
        // 严格模式下 会严格区分`number、string、boolean`的原始值和对象值
        // example `new String('') => 'String'`、`String('') => 'string'`
        if (strict && (eleRealTypeLower === NUMBER || eleRealTypeLower === BOOLEAN || eleRealTypeLower === STRING)) {
          return eleRealType
        }
        return eleRealTypeLower
      }
    
      if (element.constructor == Object) {
        return eleRealTypeLower
      }
    
      // #5 Object.create(null)
      try {
        // __proto__ 为部分早期浏览器
        if (Object.getPrototypeOf(element) === NULL || element.__proto__ === NULL) {
          return OBJECT
        }
      } catch (e) {
        // IE 无 Object.getPrototypeOf
      }
    
      // #6 function A () {}; new A
      try {
        const constructorName = element.constructor.name
        if (typeof constructorName === STRING) {
          return constructorName
        }
      } catch (e) {
        // No constructor
      }
    
      // function A() {}; A.prototype.constructor = null; new A
      return UNKNOW
    }

原文地址:https://www.cnblogs.com/EricZLin/p/12051977.html

时间: 2024-10-29 13:55:14

每日思考(2019/12/16)的相关文章

解题报告-2019.12.16

解题报告-2019.12 题目:6-3[拓展编程题_课后练习3][P215 习题8-三-4] 报数 (20分) 题目详情: 报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号.从第一个人开始报数,报到m(<n)的人退出圈子:下一个人从1开始报数,报到m的人退出圈子.如此下去,直到留下最后一个人. 本题要求编写函数,给出每个人的退出顺序编号. 函数接口定义:void CountOff( int n, int m, int out[] ); 其中n是初始人数:m是游戏规定的退出位次(保证为小于

2019.12.16

vim的三种常用模式 (一般模式.编辑模式.命令模式) 一般模式  定义:当我们使用命令vim filename 编辑文件时.默认进入该文件的一般模式.该模式下,可以:上下移动光标,删除某个字符.删除某行以及复制一行或者多行. h(方向键左键):光标向左移动一个字符 l(方向键右键):光标向右移动一个字符 k(方向键上键):光标向上移动一个字符 j(方向键下键):光标向下移动一个字符 Ctrl+B:文本页向前翻一页 Ctrl+F:文本页向后翻一页 数字0或者shift+6:移动到本行行首 shi

人工智能行业每日必读(01&#183;16)

北京地铁正研究「刷脸」安检方案 1 月 16 日消息,北京市人大代表.北京市地铁运营有限公司党委书记.董事长谢正光透露,正在探索基于乘客信用的智慧安检模式,加强乘客信用体系建设,建立地铁『白名单』及快速安检通道制度.」据悉,目前,「刷脸」的快捷安检方案正在研究中,将在客流量较大的车站先行试点. 来源:http://www.egsea.com/news/detail?id=553902 云测数据荣登2019「ToB行业影响力·产品价值榜」 1月14日,2019 ToB行业影响力价值榜单重磅揭晓.云

mysql练习题-2016.12.16

>>>>>>>>>> 练习时间:2016.12.16 编辑时间:2016-12-20-->22:12:08 题: 涉及:多表查询.exists.count().group by.order by 1.1 关系模式 学生student:   SNO:学号:   SNAME:姓名:   AGE:年龄 :   SEX:性别 课程course:CNO:课程代码,CNAME:课程名称,TEACHER:教师 学生成绩SC:SNO:学号,CNO:课程代码

12.16 Daily Scrum

  Today's Task Tomorrow's Task 丁辛 实现和菜谱相关的餐厅列表. 实现和菜谱相关的餐厅列表.             邓亚梅             美化搜索框UI. 美化搜索框UI. 王逸翔 测试和完善WebView. 测试和完善WebView. 赵梓皓 实现推荐菜谱. 实现推荐菜谱. 刘文乔 菜谱分类. 菜谱分类. 李靖 完善具体菜谱页面. 完善具体菜谱页面. 邹嘉欣 设计用户登录界面. 设计用户登录界面. 这是12 17截的图,所以12 16的活跃用户为1人.

12.16~12.23工作日志

12.16~12.23工作日志 2016.12.16 1.cick事件调用的函数中加入touchmove等事件会发生事件穿透,详情(http://www.tuicool.com/articles/6NfaUnM) 移动设备的click事件有300ms延迟,用于判断是否双击 2.ios设备会有一个默认的css样式,如input按钮在电脑上默认为方形,而在iPhone上默认为圆形,清除ipone默认样式方法: Input{-webkit-appearance:none;} 3.border-radi

升级centos内核从2.6.32到3.12.16

按照网上提供的教程,照着操作,最后竟然一次成功,记录如下 下载 wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.12.16.tar.xz 解压 tar -xf linux-3.12.16.tar.xz 更新 yum update 升级yum upgrade 安装软件包yum groupinstall "Development Tools" yum install ncurses-devel yum install qt

[转载]Install Opera 12.16 Web Browser in CentOS/RHEL and Fedora

FROM: http://tecadmin.net/install-opera-web-browser-in-centos-rhel-fedora/ Opera is an modern web browser with modern style with powerful features. Its Off-Road mode compresses pages for faster, all-conditions browsing. It helps you stay online when

剑指offer19:按照从外向里以顺时针的顺序依次打印出每一个数字,4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

1 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 2 思路和方法 直接定义一个矩形,在矩形的四条边取值,程序大大简化. 3 核心代码 1 class Solution { 2 public: 3 vector<int> printMatrix(vector<