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

数据类型&&变量

数据类型

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容