基础语法
- 基本概念:变量、标识符、注释、区块
- 条件语句: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^53
到2^53
- “正向溢出”,即 JavaScript 无法表示这么大的数,这时就会返回Infinity
- “负向溢出”,即 JavaScript 无法表示这么小的数,这时会直接返回0
-
数值的表示法
- 十进制:没有前导0的数值。
- 八进制:有前缀
0o
或0O
的数值,或者有前导0、且只用到0-7的八个阿拉伯数字的数值。 - 十六进制:有前缀
0x
或0X
的数值。 - 二进制:有前缀
0b
或0B
的数值。
特殊数值
正零和负零:JavaScript 内部实际上存在2个0:一个是+0,一个是-0,区别就是64位浮点数表示法的符号位不同。它们是等价的。
-
NaN:表示“非数字”(Not a Number),主要出现在将字符串解析成数字出错的场合。
- 0除以0也会得到NaN。
- 使用typeof可以看到起数据类型依然是Number
- NaN不等于任何值,包括它本身。
- NaN与任何数(包括它自己)的运算,得到的都是NaN
-
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)
字符串与数组
- 可以使用数组的方括号运算符,用来返回某个位置的字符
- 如果方括号中的数字超过字符串的长度,或者方括号中根本不是数字,则返回undefined。
- length属性返回字符串的长度,该属性也是无法改变的
Base64 转码
- 使用 Base64 编码处理一些不可打印的符号,比如 ASCII 码0到31的符号
- 使用 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') // "你好"
这篇文章关于字符串的介绍其实不太够的,还需要查阅其他文章来解锁更多字符的用法。