zoukankan      html  css  js  c++  java
  • typeof的使用技巧

     typeof  对于基本类型,除了  null  都可以显示正确的类型

    <template>
      <section class="p-10">
        <el-button type="danger" @click="get()">点击</el-button>
      </section>
    </template>
    <script>
      export default {
        methods: {
          get() {
            console.log(typeof '666');          // string
            console.log(typeof 66);             // number
            console.log(typeof true);           // boolean
            console.log(Symbol());              // Symbol()
            console.log(typeof undefined);      // undefined
            console.log(typeof b);              // undefined (没有声明,但是还是会显示undefined)
          }
        }
      };
    </script>

     

     typeof  对于对象,除了函数都会显示  object 

    <template>
      <section class="p-10">
        <el-button type="danger" @click="get()">点击</el-button>
      </section>
    </template>
    <script>
      export default {
        methods: {
          get() {
            console.log(typeof {key: 1});       // object
            console.log(typeof null);           // object
            console.log(typeof []);             // object
            console.log(typeof function () {    // function
            });
          }
        }
      };
    </script>

     

    对于  null  来说,虽然它是基本类型,但是会显示  object ,这是一个存在很久了的 Bug

    PS:为什么会出现这种情况呢?因为在 JS 的最初版本中,使用的是 32 位系统,为了性能考虑使用低位存储了变量的类型信息,000 开头代表是对象,然而  null  表示为全零,所以将它错误的判断为  object  。虽然现在的内部类型判断代码已经改变了,但是对于这个 Bug 却是一直流传下来。

     

     

    如果我们想获得一个变量的正确类型,可以通过  Object.prototype.toString.call(xx) 。这样我们就可以获得类似  [object Type] 的字符串。

    <template>
      <section class="p-10">
        <el-button type="danger" @click="get()">点击</el-button>
      </section>
    </template>
    <script>
      export default {
        methods: {
          get() {
            console.log(Object.prototype.toString.call([1]));
            console.log(Object.prototype.toString.call(1));
            console.log(Object.prototype.toString.call('1'));
            console.log(Object.prototype.toString.call({}));
            console.log(Object.prototype.toString.call(true));
            console.log(Object.prototype.toString.call(null));
            console.log(Object.prototype.toString.call(Symbol()));
            console.log(Object.prototype.toString.call(function () {
            }));
          }
        }
      };
    </script>

     

     判断Array的的时候,我们可以使用 instanceof 来判断,但是这里还要区别 object 

    <template>
      <section class="p-10">
        <el-button type="danger" @click="get()">点击</el-button>
      </section>
    </template>
    <script>
      export default {
        methods: {
          get() {
            let a = [1,2];
            console.log(a instanceof Array);
            console.log(a instanceof Object);
          }
        }
      };
    </script>

     

     

     

    判断undefined的时候,有时候我们需要留意一下,undefined 不是保留字,能够在低版本浏览器被赋值,这样判断就会出错

     

    <template>
      <section class="p-10">
        <el-button type="danger" @click="get()">点击</el-button>
      </section>
    </template>
    <script>
      export default {
        methods: {
          get() {
            let a;
            if (a === undefined) {
              console.log(6);
            }
            let undefined = 2;
            console.log(undefined);
            if (a === undefined) {
              console.log(66);
            }
          }
        }
      };
    </script>

    所以可以用下面的方式来判断,并且代码量更少,因为 void 后面随便跟上一个组成表达式,返回就是 undefined

    <template>
      <section class="p-10">
        <el-button type="danger" @click="get()">点击</el-button>
      </section>
    </template>
    <script>
      export default {
        methods: {
          get() {
            let a;
            if (a === void 0) {
              console.log(66);
            }
          }
        }
      };
    </script>

     

     

     

    嗯,就酱~

    https://www.cnblogs.com/chuhui/archive/2018/12/03/10060071.html

  • 相关阅读:
    vs里替换的正则表达式引用
    javascript学习
    filter用法(使静态页面和js通过iis的asp.net过滤器)
    表格的交替选择行【jquery中siblings的用法】
    表格的cell固定宽度,当内容达到宽度时换行
    collection模块(具名元组、队列、有序字典、默认值字典)、time 模块、随机模块:random、os模块、sys模块、序列化模块
    继承的用法、属性的查找顺序、组合、新式类与经典类、菱形继承等
    多态、以及常用的关于类的方法(isinstance、issubclass、slots等)运算符重载的实现、上下文管理等
    封装、prorerty装饰器、python实现封装的原理等
    面向对象、类和对象、__dict__方法、__init__方法、对象绑定方法、类绑定方法、对象交互
  • 原文地址:https://www.cnblogs.com/jin-zhe/p/10069767.html
Copyright © 2011-2022 走看看