美文网首页
《数据类型&&变量》笔记

《数据类型&&变量》笔记

作者: HelloAndyZhang | 来源:发表于2018-08-18 22:05 被阅读0次

    数据类型&&变量

    数据类型

    JavaScript共有六种数据类型(ES6新增Symbol类型的值)

    • 数值(number)
    • 字符串(String)
    • 布尔类型(Boolean)
    • undefined:
    • null
    • 对象(Object)

    原始数据类型(值类型)

    他们是最基本的数据类型,不能再细分了。

    1. Number
    2. String
    3. Boolean
    4. Null
      • 表示一个空对象指针,使用typeof操作符检测null时会返回object。
    5. Undefined
      • 表示一个未声明的变量,或已声明但没有赋值的变量,或一个并不存在的对象属性,函数没有返回值时,默认返回undefined。

    合成数据类型(引用类型)

    对象是合成类型的统称,一个对象有多个原始类型的值合成,可以看做是一个存放各种值的容器。undefined和null是两个特殊的值。对象是最复杂的数据类型,可以分为三个子类

    1. Object(狭义的对象)
      • 对象是一组属性与方法的集合。
    2. Array
      • 数组的每一项可以用来保存任何类型的数据,数组的大小是可以动态调整的。
    3. Function
      • 函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法。 创建函数方式

    数据类型检测

    • typeof

      1. Number String Boolean undefined function 可以用typeof 运算符检测出来。
      2. {} [] window null 则会返回object;
    • instanceof

      该运算符可以区分对象和数组

    null&&undefined

    null是一个表示“空”的对象,转为数值时为0;undefined是一个表示”此处无定义”的原始值,转为数值时为NaN
    

    变量

    函数及变量的声明都将被提升到函数的最顶部。变量可以在使用后声明,也就是变量可以先使用再声明。

    变量计算

    • 字符串拼接
    • ==运算符
    • if语句
    • 逻辑运算
        //字符串拼接
        var a = 100 + 10 // 110
        var b = 100 + '10' // '10010'
    
        //==运算符
        100 == '100' // true (把数字100转化为字符串‘100’进行比较)
        0 == '' // true (把数字0转化为false, 把空字符串转化为false 进行比较)
        null == undefined // true (null、undefined转化为false相比)
    
        //if语句
        var a = true
        if(a){
            // 可以进入if语句
        }
        var b = 100
        if(b){
            // 可以进入if语句, b=100转化为了true
        }
        var c = ''
        if(c){
            // 无法进入if语句, 因为c=''转化为了false
        }
    
        //逻辑运算
        console.log(10 && 0) //0
        console.log('' || 'abc') //'abc'
        console.log(!window.abc) //true
        var a = 100
        console.log(!!a) // true
    
    
    

    字符串

    • 字符串转义
    一个普通标题 一个普通标题
    \0 null(\u0000)
    \b 后退键(\u0008)
    \b 后退键(\u0008)
    \f 换页符(\u000C)
    \n 换行符(\u000A)
    \r 回车键(\u000D)
    \t 制表符(\u0009)
    \v 垂直制表符(\u000B)
    ' 单引号(\u0027)
    " 双引号(\u0022)
    \ 反斜杠(\u005C)
    • 反斜杠

      1. \HHH

      反斜杠后面紧跟三个八进制数(000到377),代表一个字符。HHH对应该字符的 Unicode 码点,比如\251表示版权符号。显然,这种方法只能输出256种字符。

      1. \xHH

      \x后面紧跟两个十六进制数(00到FF),代表一个字符。HH对应该字符的 Unicode 码点,比如\xA9表示版权符号。这种方法也只能输出256种字符。

      1. \uXXXX

      \u后面紧跟四个十六进制数(0000到FFFF),代表一个字符。XXXX对应该字符的 Unicode 码点,比如\u00A9表示版权符号。

    • 字符串与数组

    字符串可以被视为字符数组,可以使用数组的方括号运算符,用来返回某个位置的字符(位置编号从0开始)

    • 字符集

    JavaScript 使用Unicode字符集。JavaScript 引擎内部,所有字符都用 Unicode 表示。JavaScript 不仅以 Unicode 储存字符,还允许直接在程序中使用 Unicode 码点表示字符,即将字符写成\uxxxx的形式,其中xxxx代表该字符的 Unicode 码点。比如,\u00A9代表版权符号。每个字符在 JavaScript 内部都是以16位(即2个字节)的 UTF-16 格式储存。也就是说,JavaScript 的单位字符长度固定为16位长度,即2个字节。
    但是,UTF-16 有两种长度:对于码点在U+0000到U+FFFF之间的字符,长度为16位(即2个字节);对于码点在U+10000到U+10FFFF之间的字符,长度为32位(即4个字节),而且前两个字节在0xD800到0xDBFF之间,后两个字节在0xDC00到0xDFFF之间。举例来说,码点U+1D306对应的字符为𝌆,它写成 UTF-16 就是0xD834 0xDF06。

    • Base64 转码

    文本里面包含一些不可打印的符号,比如 ASCII 码0到31的符号都无法打印出来,这时可以使用 Base64 编码,将它们转成可以打印的字符。另一个场景是,有时需要以文本格式传递二进制数据,那么也可以使用 Base64 编码。所谓 Base64 就是一种编码方法,可以将任意值转成 0~9、A~Z、a-z、+和/这64个字符组成的可打印字符。使用它的主要目的,不是为了加密,而是为了不出现特殊字符,简化程序的处理。

    1. JavaScript 原生提供两个 Base64 相关的方法。
      //  btoa():任意值转为 Base64 编码
      //  atob():Base64 编码转为原来的值
      let text = 'Hello World!';
      btoa(text) // "SGVsbG8gV29ybGQh"
      atob('SGVsbG8gV29ybGQh') // "Hello World!"
    
    
    1. 不适合非 ASCII 码的字符(中文),中文需要特殊处理
      function b64Encode(str) {
          return btoa(encodeURIComponent(str));
      }
    
      function b64Decode(str) {
          return decodeURIComponent(atob(str));
      }
    
      b64Encode('你好') // "JUU0JUJEJUEwJUU1JUE1JUJE"
      b64Decode('JUU0JUJEJUEwJUU1JUE1JUJE') // "你好"
    
    

    数值

    JavaScript 内部,所有数字都是以64位浮点数形式储存,即使整数也是如此。所以,1与1.0是相同的,是同一个数。

    • 数值范围

      根据标准,64位浮点数的指数部分的长度是11个二进制位,意味着指数部分的最大值是2047(2的11次方减1)。也就是说,64位浮点数的指数部分的值最大为2047,分出一半表示负数,则 JavaScript 能够表示的数值范围为21024到2-1023(开区间),超出这个范围的数无法表示。如果一个数大于等于2的1024次方,那么就会发生“正向溢出”,即 JavaScript 无法表示这么大的数,这时就会返回Infinity。

    Math.pow(2, 1024) // Infinity
    
    

    如果一个数小于等于2的-1075次方(指数部分最小值-1023,再加上小数部分的52位),那么就会发生为“负向溢出”,即 JavaScript 无法表示这么小的数,这时会直接返回0。

    Math.pow(2, -1075) // 0
    

    JavaScript 提供Number对象的MAX_VALUE和MIN_VALUE属性,返回可以表示的具体的最大值和最小值。

        Number.MAX_VALUE // 1.7976931348623157e+308
        Number.MIN_VALUE // 5e-324
    
    
    • 数值的表示法

      可以用字面形式直接表示,比如35(十进制)和0xFF(十六进制)。

    • 数值的进制

      使用字面量(literal)直接表示一个数值时,JavaScript 对整数提供四种进制的表示方法:十进制、十六进制、八进制、二进制。

    | 进制 | 解释 |
    | ------ | ------ | ------ |
    | 十进制:| 没有前导0的数值。|
    | 八进制:| 有前缀0o或0O的数值,或者有前导0、且只用到0-7的八个阿拉伯数字的数值。|
    | 十六进制:| 有前缀0x或0X的数值。|
    | 二进制:| 有前缀0b或0B的数值。|

    对象

    对象就是“键值对”(key-value)的集合,是一种无序的复合数据集合。

    对象的引用

    不同的变量名指向同一个对象,那么它们都是这个对象的引用,也就是说指向同一个内存地址。修改其中一个变量,会影响到其他所有变量。

    • 浅拷贝
    • 深拷贝

    https://www.jianshu.com/p/f0a53b76ffbd

    对象的操作

    • 枚举自身属性(键)返回数组
    Object.keys(obj)
    
    • 删除对象属性 返回 true||fasle
    delete obj.a
    

    delete命令只能删除对象本身的属性,无法删除继承的属性;

    • in 运算符

    in运算符用于检查对象是否包含某个属性(注意,检查的是键名,不是键值),如果包含就返回true,否则返回false。不能识别哪些属性是对象自身的,哪些属性是继承的。

    • for…in 循环

    遍历一个对象的全部属性。

    它遍历的是对象所有可遍历(enumerable)的属性,会跳过不可遍历的属性。

    它不仅遍历对象自身的属性,还遍历继承的属性。(前提是继承属性默认是否允许遍历)

    //hasOwnProperty() 判断属性是来自自身还是原型
    
    var obj = { Id: '12313' };
    
    for (var key in obj) {
      if (obj.hasOwnProperty(key)) {
        console.log(key);
      }
    }
    
    
    

    函数

    函数声明

    1. 函数声明
    2. 函数表达式
    3. 构造函数

    函数属性和方法

    name 返回函数名字 函数表达式则返回变量名

    length 返回函数预期传入的参数个数。

    // length属性提供了一种机制,判断定义时和调用时参数的差异,以便实现面向对象编程的”方法重载“(overload)。
    tostring 返回一个字符串 内容是函数源码

    函数作用域

    作用域(scope)指的是变量存在的范围。在 ES5 的规范中,Javascript 只有两种作用域:一种是全局作用域,变量在整个程序中一直存在,所有地方都可以读取;另一种是函数作用域,变量只在函数内部存在。ES6 又新增了块级作用域.

    函数执行时所在的作用域,是定义时的作用域,而不是调用时所在的作用域。函数体内部声明的函数,作用域绑定函数体内部。所以引入闭包,闭包就是通过函数外部可访问函数内部变量

    arguments对象

    arguments对象是一个伪数组,可以通过下标访问,但是不能使用数组方法,需要使用call apply方法进行绑定才能继承数组的方法。

    Array.prototype.slice.call(arguments)
    
    
    1. callee 属性

    返回他所对应的原函数

    闭包

    作用:1. 一个是可以读取函数内部的变量
    2.封装对象的私有属性和私有方法

    http://www.cnblogs.com/wangfupeng1988/p/3994065.html

    自执行函数

    JavaScript 引擎规定,如果function关键字出现在行首,一律解释成语句。因此,JavaScript引擎看到行首是function关键字之后,认为这一段都是函数的定义。不要让function出现在行首,让引擎将其理解成一个表达式。最简单的处理,就是将其放在一个圆括号里面。

    
    (function(){ /* code */ }())
    
    (function(){ /* code */ }())
    
    
    
    eval 命令

    eval命令的作用是,将字符串当作语句执行。

    数据类型转换

    强制转换

    强制转换主要指使用Number、String和Boolean三个函数,手动将各种类型的值,分布转换成数字、字符串或者布尔值。

    Number()
    1. 原始类型值
    Number(123) 123
    Number('123') // 123
    Number('123a') // NaN
    Number('') // 0
    Number(true) // 1
    Number(false) // 0
    Number(undefined) // NaN
    Number(null) // 0
    
    

    parseInt&& Number

    parseInt('123a') // 123
    
    Number('123a') // NaN
    
    
    1. 对象
    
    Number({name: "zhang"}) // NaN
    Number([1, 2, 3]) // NaN
    Number([1]) // 1
    
    
    转换规则
    1. 调用对象自身的valueOf方法。如果返回原始类型的值,则直接对该值使用Number函数。
    2. 如果valueOf方法返回的还是对象,则改为调用对象自身的toString方法。如果toString方法返回原始类型的值,则对该值使用Number函数。
    3. 如果toString方法返回的是对象,就报错。
    String()
    1. 原始类型值
    String(123) // "123"
    String('abc') // "abc"
    String(true) // "true"
    String(undefined) // "undefined"
    String(null) // "null"
    
    
    1. 对象
    
    String({name: "zhang"}) // "[object Object]"
    String([1, 2, 3]) // "1,2,3"
    
    
    • 先调用对象自身的toString方法。如果返回原始类型的值,则对该值使用String函数。

    • 如果toString方法返回的是对象,再调用原对象的valueOf方法。如果valueOf方法返回原始类型的值,则对该值使用String函数。

    • 如果valueOf方法返回的是对象,报错。

    1. Boolean()
    Boolean(undefined) // false
    Boolean(null) // false
    Boolean(0) // false (+0 -0)都返回false
    Boolean(NaN) // false
    Boolean('') // false
    // 其他全返回true  
    

    自动转换

    1. 不同类型的数据互相运算。
    123 + 'abc' // "123abc"
    
    1. 对非布尔值类型的数据求布尔值
    if ('a') {
      console.log('hello')
    }  // "hello"
    
    
    
    1. 对非数值类型的值使用一元运算符(即+和-)
    
    + {name: 'zhang'} // NaN
    - [1, 2, 3] // NaN
    

    相关文章

      网友评论

          本文标题:《数据类型&&变量》笔记

          本文链接:https://www.haomeiwen.com/subject/izlqiftx.html