04ES5--基础语法(一)

基础语法

  • 基本概念:变量、标识符、注释、区块
  • 条件语句:if-else、switch、三元运算符
  • 循环语句:while、for、do-while、break和continue、标签(label)

这些语法都是完全相同的,没有必要像个初学者一个个去了解了。只需要掌握一些JS中不一样的地方即可。

1、变量提升(hoisting)

JavaScript 引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升(hoisting)

console.log(a);
var a = 1;

等价于

var a;
console.log(a);
a = 1;

2、区块(block)

区块的表达方式:JavaScript 使用大括号,将多个相关的语句组合在一起,称为“区块”(block)。

对于var命令来说,JavaScript 的区块不构成单独的作用域(scope)
ES5中的区块:

{
  var a = 1;
}

a // 1

而在js中,对象的表达方式,也是这样,不像oc中的对象都会以@开头,例如下面的写法,所以这里是需要转变过来的概念。

@{
  @"key" : @"value";
}

数据类型

JavaScript 的数据类型

1、七种数据类型

  • 数值(number):整数和小数(比如1和3.14)
  • 字符串(string):文本(比如Hello World)。
  • 布尔值(boolean):表示真伪的两个特殊值,即true(真)和false(假)
  • undefined:表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值
  • null:表示空值,即此处的值为空。
  • 对象(object):各种值组成的集合。
  • Symbol 类型:ES6 新增,后面补充

2、原始类型(primitive type)

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

  • 数值
  • 字符串
  • 布尔值

3、合成类型(complex type)

一个对象往往是多个原始类型的值的合成,可以看作是一个存放各种值的容器

  • 狭义的对象(object)
  • 数组(array)
  • 函数(function)

typeof 运算符

  • typeof 运算符:返回一个值的数据类型
  • instanceof 运算符
  • Object.prototype.toString 方法

typeof的返回值

  • 数值、字符串、布尔值分别返回number、string、boolean
  • 函数返回function
  • undefined返回undefined
  • 对象返回object,空数组([])的类型也是object,null返回object

null 和 undefined

  • 在if语句中,它们都会被自动转为false,
  • null和undefined使用相等运算符(==)甚至直接报告两者相等
  • null是一个表示“空”的对象,转为数值时为0
  • undefined是一个表示”此处无定义”的原始值,转为数值时为NaN

布尔值

相等运算符多了 ===!== 的比较,其他的都大同小异

  • 两元逻辑运算符: && (And),|| (Or)
  • 前置逻辑运算符: ! (Not)
  • 相等运算符:===,!==,==,!=
  • 比较运算符:>,>=,<,<=

转换规则是除了下面六个值被转为false,其他值都视为true

  • undefined
  • null
  • false
  • 0
  • NaN
  • ""或''(空字符串)

【注意】空数组([])和空对象({})对应的布尔值,都是true。

数值

整数和浮点数

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

  • 数值精度(浮点数的64个二进制位)

    • 第1位:符号位,0表示正数,1表示负数
    • 第2位到第12位(共11位):指数部分
    • 第13位到第64位(共52位):小数部分(即有效数字)
    • 精度最多只能到53个二进制位,这意味着,绝对值小于等于2的53次方的整数,即-2^532^53
    • “正向溢出”,即 JavaScript 无法表示这么大的数,这时就会返回Infinity
    • “负向溢出”,即 JavaScript 无法表示这么小的数,这时会直接返回0
  • 数值的表示法

    • 十进制:没有前导0的数值。
    • 八进制:有前缀0o0O的数值,或者有前导0、且只用到0-7的八个阿拉伯数字的数值。
    • 十六进制:有前缀0x0X的数值。
    • 二进制:有前缀0b0B的数值。

特殊数值

  1. 正零和负零:JavaScript 内部实际上存在2个0:一个是+0,一个是-0,区别就是64位浮点数表示法的符号位不同。它们是等价的。

  2. NaN:表示“非数字”(Not a Number),主要出现在将字符串解析成数字出错的场合。

    • 0除以0也会得到NaN。
    • 使用typeof可以看到起数据类型依然是Number
    • NaN不等于任何值,包括它本身。
    • NaN与任何数(包括它自己)的运算,得到的都是NaN
  3. Infinity:表示“无穷”

    • 第一个场景是一个表达式的计算结果太大,超出了能够表示的范围,因此返回Infinity
    • 第二个场景是0除以0会得到NaN,而非0数值除以0,会返回Infinity
    • Infinity表示正的无穷
    • -Infinity表示负的无穷
    • Infinity还有很多特殊的运算法则,有时间了可以看看

与数值相关的全局方法

1、parseInt()

  • parseInt方法用于将字符串转为整数
  • 如果字符串头部有空格,空格会被自动去除
  • 如果parseInt的参数不是字符串,则会先转为字符串再转换
  • 字符串转为整数的时候,是一个个字符从左往右依次转换,如果遇到不能转为数字的字符,就不再进行下去,返回已经转好的部分
  • 如果字符串的第一个字符不能转化为数字(后面跟着数字的正负号除外),返回NaN
  • 如果字符串以0x或0X开头,parseInt会将其按照十六进制数解析。

进制转换:第二个参数(2到36之间),表示被解析的值的进制

这个里有非常多的用法,但是我们在实际的使用中,知道以下几个使用场景就可以了

parseInt('1000') // 1000
// 等同于
parseInt('1000', 10) // 1000
parseInt('1000', 2) // 8
parseInt('1000', 6) // 216
parseInt('1000', 8) // 512

2、parseFloat()

  • parseFloat方法用于将一个字符串转为浮点数。
  • parseFloat方法会自动过滤字符串前导的空格。
  • 如果参数不是字符串,或者字符串的第一个字符不能转化为浮点数,则返回NaN。

parseFloat 与 Number 之间的区别

parseFloat(true)  // NaN
Number(true) // 1

parseFloat(null) // NaN
Number(null) // 0

parseFloat('') // NaN
Number('') // 0

parseFloat('123.45#') // 123.45
Number('123.45#') // NaN

3、isNaN()

  • isNaN方法可以用来判断一个值是否为NaN
  • isNaN只对数值有效,如果传入其他值,会被先转成数值。所以,对于字符串、对象和数组,isNaN都返回true
  • 但不是所有的字符串、对象和数组都返回true,如果他们能被正常解析成数字,那就返回false

使用isNaN之前,最好判断一下数据类型

function myIsNaN(value) {
  return typeof value === 'number' && isNaN(value);
}

判断NaN更可靠的方法是,利用NaN为唯一不等于自身的值的这个特点,进行判断

function myIsNaN(value) {
  return value !== value;
}

4、isFinite()

isFinite方法返回一个布尔值,表示某个值是否为正常的数值

isFinite(Infinity) // false
isFinite(-Infinity) // false
isFinite(NaN) // false
isFinite(undefined) // false
isFinite(null) // true
isFinite(-1) // true

Infinity、-Infinity、NaN和undefined这几个值会返回false,

isFinite对于其他的数值都会返回true

字符串

上面的数值这节写了非常多的笔记,主要是因为它这里提供了一些常用API,对他们的使用需要了解,所以进行了一个记录。这节主要是讲字符串,这是非常非常重要的篇幅了,同样的,也是只记录不同的内容,那些所有语言都相同的特性,就没必要浪费笔墨了。特别说明下字符集相关的内容,如果遇到了再来查阅资料即可,这里不做过多研究。

使用特性

  • 单引号字符串的内部,可以使用双引号
  • 双引号字符串的内部,可以使用单引号
  • 如果要在单引号字符串的内部使用单引号,或双引号字符串内部使用双引号,都需要在引号钱加反斜杠,用来转义
  • 字符串默认只能写在一行内,分成多行将会报错。如果长字符串必须分成多行,可以在每一行的尾部使用反斜杠。
  • 连接运算符(+)可以连接多个单行字符串,将长字符串拆成多行书写,输出的时候也是单行

转义

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

字符串与数组

  1. 可以使用数组的方括号运算符,用来返回某个位置的字符
  2. 如果方括号中的数字超过字符串的长度,或者方括号中根本不是数字,则返回undefined。
  3. length属性返回字符串的长度,该属性也是无法改变的

Base64 转码

  1. 使用 Base64 编码处理一些不可打印的符号,比如 ASCII 码0到31的符号
  2. 使用 Base64 编码以文本格式传递二进制数据

JavaScript 原生提供两个 Base64 相关的方法。(这两个方法不适合非 ASCII 码的字符,会报错)

  • btoa():任意值转为 Base64 编码
  • atob():Base64 编码转为原来的值
var string = 'Hello World!';
btoa(string) // "SGVsbG8gV29ybGQh"
atob('SGVsbG8gV29ybGQh') // "Hello World!"

将非 ASCII 码字符转为 Base64 编码

  • 中间插入一个转码环节
  • 再使用这两个方法
function b64Encode(str) {
  return btoa(encodeURIComponent(str));
}

function b64Decode(str) {
  return decodeURIComponent(atob(str));
}

b64Encode('你好') // "JUU0JUJEJUEwJUU1JUE1JUJE"
b64Decode('JUU0JUJEJUEwJUU1JUE1JUJE') // "你好"

这篇文章关于字符串的介绍其实不太够的,还需要查阅其他文章来解锁更多字符的用法。

你可能感兴趣的:(04ES5--基础语法(一))