• 一道关于面向对象面试题所引发的血案(阿里)


    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="ie=edge" />
        <meta
          name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0"
        />
        <title></title>
        <!-- IMPORT CSS -->
      </head>
    
      <body>
        <!-- IMPORT JS -->
        <script>
          function Foo() {
            getName = function () {
              console.log(1);
            };
            return this;
          }
          Foo.getName = function () {
            console.log(2);
          };
          Foo.prototype.getName = function () {
            console.log(3);
          };
          var getName = function () {
            console.log(4);
          };
    
          function getName() {
            console.log(5);
          }
          Foo.getName(); //2
          getName(); //4
          Foo().getName(); //1
          getName(); //1
          new Foo.getName();
          2;
          new Foo().getName(); //3
          new new Foo().getName(); //3
        </script>
      </body>
    </html>

     对象成员访问级别高,优先执行,new函数级别低,次之执行

    2.

          function A() {
            alert(1);
          }
          function Func() {
            A = function () {
              alert(2);
            };
            return this;
          }
          Func.A = A;
          Func.prototype = {
            A: () => {
              alert(3);
            },
          };
          A();  //1
          Func.A(); //1
          Func().A();//2
          new Func.A();//1
          new Func().A(); //3
          new new Func().A();  //报错,箭头函数没有原型链,不能new

    3.

    // TO-STRING
            // 1.手动添加一个toString方法,每次判断==都会自动调用toString方法
             var a = {
                i: 0,
                toString() {
                    return ++this.i;
                }
            };
    
            // a为什么,以下成立
            if (a == 1 && a == 2 && a == 3) {
                console.log('条件成立');
            } 
    
            /* var a = [1, 2, 3];
            a.toString = a.shift;
            if (a == 1 && a == 2 && a == 3) {
                console.log('条件成立');
            } */
    
    
            /* 2.数据劫持实现 */
            var i = 0;
            Object.defineProperty(window, 'a', {
                get() {
                    return ++i;
                }
            });
            if (a == 1 && a == 2 && a == 3) {
                console.log('条件成立');
            } 
    
            /* var a = 0;
            Object.defineProperty(window, 'a', {
                get() {
                    // Uncaught TypeError: Cannot redefine property: a
                    // defineProperty GETER拦截器中不能再次获取当前属性,会死循环
                    return ++a;
                }
            });
            console.log(a); */

    总结

    == ,数据类型不一样
    1.对象==字符串, 对象自动调用toString变成字符窜 ['a']=='a'
    2. null ==undefind相等,但是和其他值比较不在相等了
    3,NaN ==NaN,不相等
    4.剩下的都是转换成数字 '1'==true //true
    [10]==10 ,底层转换
    [10]自动调用toString为‘10’,然后自动调用number,为10
  • 相关阅读:
    命令行添加删除tomcat服务
    访问不到主页index.jsp的原因是servlet-api.jar包有冲突,删除lib的servlet-api.jar,如果报错则添加Apache Tomcat下的 servlet-api.jar 即可。
    在浏览器控制台打印信息
    android访问权限(Android permission )大全
    导入android项目后不自动生成R.java文件的解决方法
    冒泡排序算法
    文本超出div部分,使用省略(...)表示
    sql 连接
    Sprin MVC 4.0中返回 json
    spring boot 配置过程
  • 原文地址:https://www.cnblogs.com/fsg6/p/14531907.html
Copyright © 2020-2023  润新知