你不知道的JavaScript(中卷)笔记(一)

  1. 1. 类型
  2. 2.
    1. 2.1. 数组
      1. 2.1.1. 类数组
    2. 2.2. 字符串
    3. 2.3. 数字
    4. 2.4. 值和引用

最近在匆匆看了`webpack@4.0文档之后,又被《你不知道的JavaScript》吸引了目光。这本书针对JavaScript`中存在的一些容易出错的地方进行解答,可以夯实自己的基础。

类型

JavaScript有七种内置类型,包括null undefined number string boolean objectsymbol(ES6)

  1. JavaScript的变量是没有类型的,有类型的是值。但变量持有值的类型。类型定义了值的行为特征
  2. undefined表示声明后但未赋值的,undeclared表示未声明的。这两者有稍微的区别,但在JavaScript中并未区分
  3. 我们可以通过typeof指令来确定值的类型
    示例
    可以很清楚的发现通过typeof指令能得到大多数值的类型,然而这里没有出现null object相关代码。这是因为typeof null的结果也是object,这是JavaScript设计的错误,所以如果想判断是否类型为null,可以通过

    1
    !a&&typeof a === 'object'
  4. 我们可以使用typeof指令来检查undeclared变量,因为typeof有安全防范机制(阻止报错)

数组(array)、字符串(string)、数字(number)是JavaScript的程序基本组成部分,但在使用过程中,还是有一些坑

数组

相对于其他强类型语言来说,JavaScript中的数组是不用事先声明数组容量和类型的,所以数组可以容纳任意类型的值

  1. 可以使用delete运算符删除数组中的元素,但数组的长度并不会减少
  2. 数组是通过数字索引来获取值的,但由于数组同样是对象,所以可以通过对象的方式获取值
    1
    2
    3
    4
    5
    6
    7
    var a = []
    a[0] = 1
    a['today'] = 'sunday'

    a.length // 1
    a['today] // 'sunday'
    a.today // 'sunday'

这里有两点要注意的是,使用字符串键值来赋值的话,数组的长度并不会增加;如果字符串键值是可以被强制转换为数字的值的话,会被当做数字索引来处理

1
2
3
a['2018'] = 2018
a['2018'] // 2018
a[2018] //2018

所以通过数组来存放字符串键值/属性并不是很合适的做法,应该使用对象

类数组

类数组是具有数组的某种特性(可以通过数字索引)的值,我们可以通过某些方式,例如slice,concat等数组工具函数来实现将其转换为真正的数组

转换类数组

如上图的两种方法,都可以将类数组转换为真正的数组

字符串

字符串和数组很相似,都由length属性以及indexOf()concat()方法,但字符串不等于字符数组

  1. 字符串是不可变的,而数组是可变的。这里指的不可变是字符串的原始成员不会被改变值,而是会创建并返回一个新的字符串
    字符串不是字符数组
  2. 字符串和数组可以通过函数进行相互的处理,这在某些时候是很方便的
    字符串反转

    数字

    JavaScript只有一种数值类型:数字(number),包括整数以及带小数的十进制数。

  3. 可以使用toFixed保留小数部分位数(但有坑)

    1
    12.toFixed(3) //SyntaxError

如果直接使用值去调用数值方法,将会报错,因为解析的时候会认为12.是整体,可以通过以下方法调用数值方法
调用数值方法

  1. NaNNot a Number即不是数值,NaN不等于NaN
  2. null值空值,undefined值没有值
  3. 0值包括+0-0

    值和引用

    JavaScript中值的几种类型,在实际的赋值和参数传递中,分为值传递和引用传递

  4. 值传递是指直接复制指的方法进行赋值,简单类型的赋值都是值传递
  5. 引用传递是指将复杂类型值的存储地址赋给变量,这样相当于两者共享一个空间,都可对该地址的值做出更改,并会影响对方