JavaScript基本语法
变量
-
所有的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升
例如:
console.log(a); var a = 1; // 结果为 undefined // 因为提升了变量声明,所以相当于 var a; console.log(a); a = 1;
区块
- 使用大括号,将多个相关的语句组合在一起,称为
区块
- 区块对于
var
命令不构成单独的作用域
switch
switch
语句后面的表达式,与case
语句后面的表示式比较运行结果时,采用的是严格相等运算符(===
),而不是相等运算符(==
),这意味着比较时不会发生类型转换。
label(标签)
-
JavaScript 语言允许,语句的前面有标签(label),相当于定位符,用于跳转到程序的任意位置,标签的格式如下。
label: 语句
-
标签通常与
break
语句和continue
语句配合使用,跳出特定的循环。break 或 continue 后 + 需要跳转的标签即可
数据类型
简介
- JavaScript数据类型共有7种(包括ES6的)。
- 数值(number):整数和小数(比如
1
和3.14
) - 字符串(string):文本(比如
Hello World
)。 - 布尔值(boolean):表示真伪的两个特殊值,即
true
(真)和false
(假) undefined
:表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值null
:表示空值,即此处的值为空。- 对象(object):各种值组成的集合。
- 狭义的对象(object)
- 数组(array)
- 函数(function)
Symbol
,表示独一无二的值(ES6新增)
- 数值(number):整数和小数(比如
typeof运算符
-
typeof
运算符可以返回一个值的数据类型。 -
对于
null
返回object
,因为历史遗留问题。typeof null; // "object"
null和undefined
-
在
if
语句中,它们都会被自动转为false
,相等运算符(==
)甚至直接报告两者值相等,但是===
返回false
if (!undefined) { console.log("true"); } // true if (!null) { console.log("true"); } // true undefined == null // true undefined === null // false
-
二者几乎差不多,存在的原因还是历史遗留原因。下面是简单例子。
Number(null) // 0 Number(undefined) // NaN
-
二者理解
-
null
表示空值,即该处的值现在为空。调用函数时,某个参数未设置任何值,这时就可以传入null
,表示该参数为空。 -
undefined
表示“未定义”。-
变量未定义
-
函数未传入参数
function a(x) { console.log(x === undefined); } a() // true(表示x此时未定义,所以为true) // undefined(表示函数为undefined)
-
调用对象没有赋值的属性
var p = new Object(); p.name // undefined
-
函数若无返回值,则返回
undefined
function a() { } a() // undefined
-
-
布尔值
- 以下六个值默认被转换为false,其他都为
true
undefined
null
false
0
NaN
""
或''
(空字符串)
- 空数组(
[]
)和空对象({}
)对应的布尔值,都是true
数值
整数与浮点数
-
JavaScript 内部,所有数字都是以64位浮点数形式储存,即使整数也是如此。所以,
1
与1.0
是相同的,是同一个数。1 == 1.0 // true
-
某些运算只有整数才能完成,此时 JavaScript 会自动把64位浮点数,转成32位整数,然后再进行运算。
数值精度
- 按照国际标准IEEE 754,JavaScript的数值表示精度和Java的double相同。(1符号 + 11位指数 + 52位小数)
- 即-253到$253,简单的法则就是,JavaScript 对15位的十进制数都可以精确处理。
数值范围
-
64位浮点数的指数部分的长度是11个二进制位,意味着指数部分的最大值是
2047
(2的11次方减1)。也就是说,64位浮点数的指数部分的值最大为2047
,分出一半表示负数,则 JavaScript 能够表示的数值范围为 2 1024 2^{1024} 21024到 2 − 1023 2^{-1023} 2−1023(开区间),超出这个范围的数无法表示。 -
JavaScript 提供
Number
对象的MAX_VALUE
和MIN_VALUE
属性,返回可以表示的具体的最大值和最小值。Number.MAX_VALUE // 1.7976931348623157e+308 Number.MIN_VALUE // 5e-324
数值的表示法和进制
- 和传统表示方法一样,使用
0b
表示二进制,0x
表示十六进制,0o
或前导0
表示八进制,后接e
或E
表示科学计数法,接+
或-
表示正或负次方。 - JavaScript 会自动将数值转为科学计数法表示,其他情况都采用字面形式直接表示。
- 小数点前的数字多于21位。
- 小数点后的零多于5个
特殊数值
-
正零和负零
几乎所有场合,正零和负零都会被当作正常的
0
。唯一区别是,
+0
或-0
当做分母,返回值不同,一个正整数除以正零得到+Infinity
,除以负零得到-Infinity
。 -
NaN
表示“非数字”
出现场合:
-
将字符串解析成数字出错的场合。
5 - 'a' 'a' - 5 // 结果都是NaN // 但是,+号在字符串中默认为连接,所以下述代码不会出错 5 + 'a' // "5a" 'a' + 5 // "a5"
-
一些数学函数,因为错误计算或者不符合规定的运算,其结果会出现
NaN
Math.log(-1) // NaN Math.sqrt(-1) // NaN 0 / 0 // NaN
NaN
是属于Number
的特殊数值typeof NaN // "number"
运算规则
-
NaN
不等于任何值,包括它本身。NaN === NaN // false NaN == NaN // false // 无论是使用值相等的'=='还是严格的类型和值都相等'==='来判断,其结果都是false
-
数组的
indexOf
方法内部使用的是严格相等运算符,所以该方法对NaN
不成立。[NaN].indexOf(0) // -1 [1, 2, 3].indexOf(NaN) // -1
-
NaN
与任何数(包括它自己)的运算,得到的都是NaN
。NaN * 2 // NaN NaN + 2 // NaN // 但是可以与字符串进行+连接哦 NaN + '123' // "NaN123"
-
-
Infinity无穷
用来表示两种场景。一种是一个正的数值太大,或一个负的数值太小,无法表示;另一种是非0数值除以0,得到
Infinity
。-
Infinity
有正负之分,Infinity
表示正的无穷,-Infinity
表示负的无穷。Infinity === -Infinity // false 1 / -0 // -Infinity 1 / 0 // Infinity
-
非0数值除以
0
,会返回Infinity
。非零正数除以-0
,会得到-Infinity
,负数除以-0
,会得到Infinity
。 -
注意:由于数值正向溢出(overflow)、负向溢出(underflow)和被
0
除,JavaScript 都不报错,所以单纯的数学运算几乎没有可能抛出错误。 -
Infinity
大于一切数值(除了NaN
),-Infinity
小于一切数值(除了NaN
。正负Infinity
与NaN
比较,总是返回false
。 -
Infinity
的四则运算,符合无穷的数学计算规则。 -
0乘以
Infinity
,返回NaN
。Infinity
减去或除以Infinity
,得到NaN
。Infinity
与null
计算时,null
会转成0,等同于与0
的计算。Infinity
与undefined
计算,返回的都是NaN
。
-